天天看点

CUDA学习(七十六)

多态函数包装器(Polymorphic Function Wrappers):

在nvfunctional头文件中提供了一个多态函数包装类模板nvstd :: function。 这个类模板的实例可以用来存储,复制和调用任何可调用的目标,例如lambda表达式。 nvstd :: function可以在主机和设备代码中使用。

例子:

主机代码中nvstd :: function的实例不能用<code>__device__</code>函数的地址或operator()是<code>__device__</code>函数的函数来初始化。 设备代码中的nvstd :: function的实例不能用<code>__host__</code>函数的地址或operator()是<code>__host__</code>函数的函数来初始化。

nvstd ::函数实例在运行时不能从主机代码传递到设备代码(反之亦然)。 如果从宿主代码启动<code>__global__</code>函数,则nvstd :: function不能用于<code>__global__</code>函数的参数类型。

nvstd :: function在nvfunctional头文件中定义如下:

实验特征:Extended Lambdas

nvcc标志'--expt-extended-lambda'允许在lambda表达式中显式执行空间标注。 执行空间注释应该在'lambda-introducer'之后和可选的'lambda-declarator'之前出现。 当指定'-expt-extended-lambda'标志时,nvcc将定义宏<code>__CUDACC_EXTENDED_LAMBDA__</code>。

<code>extended __device__ lambda</code>是一个lambda表达式,它使用<code>__device__</code>显式注释,并且在<code>__host__</code>或<code>__host__</code> <code>__device__</code>函数的直接或嵌套块范围内定义。

<code>extended __host__ __device__ lambda</code>是一个lambda表达式,它用<code>__host__</code>和'__device__'显式注释,并且在<code>__host__</code>或<code>__host__</code> <code>__device__</code>函数的直接或嵌套块范围内定义。

“扩展lambda”表示扩展<code>__device__ lambda</code>或扩展<code>__host__ __device__ lambda</code>。 扩展lambda表达式可用于<code>__global__</code>函数模板实例的类型参数。

如果未明确指定执行空间注释,则根据封装与lambda关联的闭包类的作用域计算它们,如C ++ 11支持部分所述。 执行空间注释应用于与lambda关联的闭包类的所有方法。

CUDA学习(七十六)

继续阅读