2012-01-10 138 views
1

我正在玩C++ AMP,但由于某种原因,最愚蠢的代码将不会编译。这:不支持的类型错误与parallel_for_each

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

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

导致以下错误:

error C3576: 'wmain::': Concurrency::details::_Parallel_for_each argument #3 has unsupported type 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)”是一个新的关键字,用于支持控制哪个加速器运行有问题的代码。

任何想法?我试着从几个不同的例子复制,但没有任何作品,所以我有点难倒。

回答

3

您的lambda传递给parallel_for_each是空类(没有变量被捕获,因此没有数据成员)。没有数据就不能有任何有用的计算,这就是为什么你会收到错误。

请并发::阵列或并发::的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版本中,行为将发生变化您的代码将按原样编译,没有任何错误。传递空课不会做任何事情。

+0

你我的朋友是一个绝对的天才(以及一个学者和先生们)!当然是完美的感觉。非常感谢你。 – Dave 2012-01-10 23:58:37

+0

我很高兴能帮上忙。 – 2012-01-11 02:18:36

+0

除此之外,我注意到如果你不包含任何输入(例如一个数组),如果你指定输出,即按值捕获的array_view,那么事情就会起作用。所以我猜你需要在lambda中捕获至少1个输入或1个输出。很高兴听到这个限制正在Beta版本中放松,因为它并不特别明显。当然,后见之明是一件美妙的事情,现在它已经非常明显了:) – Dave 2012-01-11 05:04:13

0

嘛,据我知道限制关键字是一个扩展微软为C++ AMP介绍。该关键字将由Visual Studio 2010之后的Visual Studio C++编译器支持。

我不知道在这个时候的2012年测试版,所以我的猜测是你找到了示例,博客等等来描述新的C++ AMP,你试图看到它为你自己,但与Visual Studio 2010一起工作。

然而,Visual Studio 2010附带的C++编译器并不支持restrict关键字,据我所知。这就是你遇到错误的原因。

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

EDIT1:其实我环顾四周,似乎有一个 “的Visual Studio 11开发者预览”版本,其中C++ AMP似乎是可用(图书馆,我也承担了C++编译器实现的扩展)。

EDIT2现在你的错误信息再次寻找它似乎是你正在使用VS11(我做了基于路径包括文件(它包含了微软的Visual Studio 11.0 :-))上的猜测。也许你应该尝试指定的拉姆达的拍摄模式,按值来捕捉并使其可变这样的:

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

至少这是拉姆达是怎么写的大多数C++ AMP的例子...

+0

感谢您的回复。是的,我应该提到我正在使用VS2011 Dev Preview。我尝试了可变关键字,这并没有帮助,也没有明确地按价值捕获。嗯。 – Dave 2012-01-10 20:12:24

+0

顺便说一下,可变关键字是不鼓励C++ AMP的东西......请继续关注团队博客,以了解更多关于... – 2012-01-11 19:32:27

+0

@Daniel Moth:好的,谢谢我没有意识到这一点。在这种情况下,我想从这个位置(http://msdn.microsoft.com/en-us/library/hh265136(v=vs.110).aspx)msdn内容应该审查和相应更新... – ds27680 2012-01-16 13:31:24

相关问题