多态函數包裝器(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關聯的閉包類的所有方法。
