限制(amp)功能类型

时间:2012-05-07 10:18:42

标签: c++ lambda gpgpu ppl c++-amp

我可以创建restrict(amp)函数,如下所示:

auto f = [](int& item) restrict(amp) {item += 1;};

我可以在其他restrict(amp)函数中使用此函数,例如:

concurrency::parallel_for_each(av.extent,
    [=](concurrency::index<1> idx) restrict(amp) 
    { 
      f(av[idx]); 
    }
);

编译后用什么类型代替“auto”?我试图使用“std :: function”:

std::function<void (int&) restrict(amp)> f
           = [](int& item) restrict(amp) {item += 1;};

但收到编译错误。

感谢您的关注!

1 个答案:

答案 0 :(得分:5)

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

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

bind表达式也是如此。

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

  

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

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

更新: AMP Specification的第2.2.3和2.3节似乎适用于此问题。