1

我正在使用 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

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

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

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

4

2 回答 2

3

传递给 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 版本中发生变化。您的代码将按原样编译,没有任何错误。传递空类根本不会做任何事情。

于 2012-01-10T20:18:29.360 回答
0

好吧,据我所知,restrict关键字是微软为 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 开发人员预览版”版本,其中 C++ AMP 似乎可用(库,我还假设 C++ 编译器具有已实现的扩展)。

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

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

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

于 2012-01-10T08:28:28.680 回答