syn*_*ker 2 c++ lambda gpgpu c++-amp ppl
我可以创建restrict(amp)如下函数:
auto f = [](int& item) restrict(amp) {item += 1;};
Run Code Online (Sandbox Code Playgroud)
我可以在其他restrict(amp)功能中使用此功能,例如:
concurrency::parallel_for_each(av.extent,
[=](concurrency::index<1> idx) restrict(amp)
{
f(av[idx]);
}
);
Run Code Online (Sandbox Code Playgroud)
auto编译后用什么类型代替" "?我试着使用"std :: function":
std::function<void (int&) restrict(amp)> f
= [](int& item) restrict(amp) {item += 1;};
Run Code Online (Sandbox Code Playgroud)
但是收到了编译错误.
感谢您的关注!
lambda表达式的结果是一个闭包对象,闭包对象的类型是不可知的.您只能用于auto声明其确切类型的变量.
但是,您可以将闭包对象转换为合适的a实例std::function,如果lambda是非捕获的,您甚至可以将其转换为函数指针.但是,这种转换可能会产生(重大)成本,因此您应该auto尽可能多地使用以处理实际的闭包类型.
这同样适用于bind表达式.
相关标准部分为5.1.2(3):
lambda表达式的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型 - 称为闭包类型 - 其属性如下所述.此类类型不是聚合.
也就是说,我不确定特殊AMP扩展在这种情况下的表现如何,并且可以想象AMP限制的lambda 不能转换为其他任何东西.我将尝试在AMP规范中查看.
更新:AMP规范的第2.2.3和2.3节似乎适用于此问题.