限制(AMP)功能类型

restrict(amp) function type

本文关键字:功能 类型 AMP 限制      更新时间:2023-10-16

我可以按如下方式创建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;};

但收到编译错误。

感谢您的关注!

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

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

bind表达式也是如此。

相关标准部分是5.1.2(3(:

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

也就是说,我不确定特殊的 AMP 扩展在这种情况下的行为如何,可以想象受 AMP 限制的 lambda 不能转换为其他任何东西。我将尝试在 AMP 规范中查找此内容。

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