parallel_for_each不支持的类型错误

时间:2012-01-10 07:58:37

标签: c++ c++-amp

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

传递lambda表达式

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

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

2 个答案:

答案 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示例中的编写方式......