限制(amp)功能类型

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)

但是收到了编译错误.

感谢您的关注!

Ker*_* SB 5

lambda表达式的结果是一个闭包对象,闭包对象的类型是不可知的.您只能用于auto声明其确切类型的变量.

但是,您可以闭包对象转换为合适的a实例std::function,如果lambda是非捕获的,您甚至可以将其转换为函数指针.但是,这种转换可能会产生(重大)成本,因此您应该auto尽可能多地使用以处理实际的闭包类型.

这同样适用于bind表达式.

相关标准部分为5.1.2(3):

lambda表达式的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型 - 称为闭包类型 - 其属性如下所述.此类类型不是聚合.

也就是说,我不确定特殊AMP扩展在这种情况下的表现如何,并且可以想象AMP限制的lambda 不能转换为其他任何东西.我将尝试在AMP规范中查看.

更新:AMP规范的第2.2.3和2.3节似乎适用于此问题.