【问题标题】:Unsupported type error with parallel_for_eachparallel_for_each 不支持的类型错误
【发布时间】:2012-03-23 08:25:36
【问题描述】:

我正在使用 C++ AMP,但由于某种原因,最愚蠢的代码无法编译。这个:

concurrency::extent<2> e(2,2);

concurrency::parallel_for_each(grid<2>(e), [](index<2> i) restrict(direct3d) {
});

导致以下错误:

错误 C3576: 'wmain::': Concurrency::details::_Parallel_for_each 参数 #3 不受支持 键入 c:\program files (x86)\microsoft visual studio 11.0\vc\include\amp.h

它似乎不喜欢为 const _Kernel_type&amp; _Kernel 传递的 lambda 表达式

注意;我正在使用包含 AMP 支持的 Visual Studio 11 Developer Preview。 “restrict(direct3d)”是一个新关键字,用于支持控制哪个加速器运行相关代码。

有什么想法吗?我尝试从几个不同的示例中复制,但没有任何效果,所以我有点难过。

【问题讨论】:

    标签: c++ c++-amp


    【解决方案1】:

    传递给parallel_for_each 的lambda 是一个空类(没有捕获变量,因此没有数据成员)。没有数据,您无法进行任何有用的计算,这就是您收到错误的原因。

    请将 concurrency::array 或 concurrency::array_view 添加到您的示例中,如下所示:

    using namespace concurrency;
    extent<2> e(2,2);
    array<int, 2> a(e);
    
    parallel_for_each(grid<2>(e), [&a](index<2> i) restrict(direct3d) {
        a[i] = 1;
    });
    

    注意:这仅适用于 Visual Studio 11 开发者预览版。该行为将在即将发布的 Beta 版本中发生变化。您的代码将按原样编译,没有任何错误。传递空类根本不会做任何事情。

    【讨论】:

    • 你我的朋友绝对是个天才(同时也是学者和绅士)!当然是完美的感觉。非常感谢。
    • 除此之外,我注意到如果您不包含任何输入(例如数组),如果您指定输出(即按值捕获的 array_view),一切都会正常工作。所以我猜你需要在 lambda 中捕获至少 1 个输入或 1 个输出。很高兴听到此限制在 Beta 版本中有所放宽,因为它并不是特别明显。当然,事后诸葛亮是一件美妙的事情,现在非常明显:)
    【解决方案2】:

    嗯,据我所知,restrict 关键字是 Microsoft 为 C++ AMP 引入的扩展。 Visual Studio 2010 之后的 Visual Studio C++ 编译器将支持该关键字。

    目前我不知道 2012 年的 beta 版本,所以我猜您找到了描述新 C++ AMP 的示例、博客等,并且您正试图看到它在 Visual Studio 2010 中为您自己工作。

    据我所知,Visual Studio 2010 附带的 C++ 编译器不支持限制关键字。这就是您收到错误的原因。

    所以我想对于 C++ AMP,我们将不得不等待 VS2012 测试版发布,直到我们可以使用它。当我在第 9 频道看到 Daniel Moth 的一些演示时,我的手指当然也很痒 :-)... 并不是说​​我在日常工作中需要 C++ AMP,但它看起来很有趣(玩)的东西。

    EDIT1:其实我环顾四周,似乎有一个 “Visual Studio 11 Developer Preview”版本,其中 C++ AMP 似乎可用(库,我还假设 C++ 编译器具有已实现的扩展)。

    EDIT2 现在再次查看您的错误消息,您似乎正在使用 VS11(我根据包含文件的路径做出了猜测(它包含 microsoft visual studio 11.0 :-)) .也许您应该尝试指定 lambda 的捕获模式以按值捕获并使其可变,如下所示:

    [=](index<2> i) mutable restrict(direct3d) {}
    

    至少这是大多数 C++ AMP 示例中 lambda 的编写方式...

    【讨论】:

    • 感谢您的回复。是的,我应该提到我正在使用 VS2011 Dev Preview。我尝试了 mutable 关键字,但这没有帮助,也没有明确地按值捕获。嗯。
    • 顺便说一句,C++ AMP 不鼓励使用 mutable 关键字...请继续关注团队博客以了解更多信息...
    • @Daniel Moth:好的,谢谢,我不知道。在这种情况下,我猜想来自这个位置 (msdn.microsoft.com/en-us/library/hh265136(v=vs.110).aspx) 的 msdn 内容应该进行相应的审查和更新......
    • @ds27680 是的,很多 MSDN 内容将由技术写作团队为 Beta 更新,然后为 RTM... 在此之前,我们的团队博客是正确内容的一个真正来源直接来自产品团队。
    猜你喜欢
    • 2017-06-02
    • 2020-05-12
    • 2014-11-11
    • 2018-10-13
    • 2018-07-25
    • 2021-11-11
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多