我正在使用C ++ AMP,但出于某种原因,最愚蠢的代码将无法编译。这样:
concurrency::extent<2> e(2,2);
concurrency::parallel_for_each(grid<2>(e), [](index<2> i) restrict(direct3d) {
});
导致以下错误:
错误C3576:'wmain ::': 并发:: details :: _ Parallel_for_each参数#3不受支持 键入c:\ program files(x86)\ microsoft visual studio 11.0 \ VC \包括\ amp.h
它似乎不喜欢为const _Kernel_type& _Kernel
请注意;我正在使用包含AMP支持的Visual Studio 11开发人员预览版。 “restrict(direct3d)”是一个新的关键字,用于支持控制哪个加速器运行相关代码。
有什么想法吗?我试过从几个不同的例子中复制,但没有任何作用,所以我有点难过。
答案 0 :(得分: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版本中发生变化您的代码将按原样编译,没有任何错误。传递空课不会做任何事情。
答案 1 :(得分:0)
嗯,据我所知, restrict 关键字是Microsoft为C ++ AMP推出的扩展程序。 Visual Studio 2010之后的Visual Studio C ++编译器将支持该关键字。
我目前还没有意识到2012年的测试版发布,所以我的猜测是你找到了描述新C ++ AMP的示例,博客等,并且你试图看到它适用于自己但是使用Visual Studio 2010。
据我所知,Visual Studio 2010附带的C ++编译器不支持restrict关键字。这就是您收到错误的原因。
所以我想对于C ++ AMP,我们将不得不等待VS2012测试版发布,直到我们可以使用它。当我在第9频道看到丹尼尔·莫斯的一些演示时,我的手指肯定也痒了: - )...不是说我在日常工作中需要C ++ AMP,但它看起来很有趣(播放)。
EDIT1:其实我环顾四周似乎有一个 “Visual Studio 11开发人员预览版”,其中C ++ AMP似乎可用(库和我也假设C ++编译器带有实现的扩展)。
EDIT2 现在再次查看您的错误消息,您似乎正在使用VS11(我根据包含文件的路径进行了猜测(它包含了microsoft visual studio 11.0 :-)) 。也许您应该尝试指定lambda的捕获模式以按值捕获并使其可变,如下所示:
[=](index<2> i) mutable restrict(direct3d) {}
至少这是lambda在大多数C ++ AMP示例中的编写方式......