API 参考¶
本节介绍 cuFFT LTO EA 中包含的 cuFFT API 的扩展。
注意
cuFFT 11.0.8.X 和 cuFFT LTO EA 11.1.0.X 的非回调功能保持不变。
对于非回调计划,cuFFT 11.0.8.X 和 cuFFT LTO EA 11.1.0.X 应该具有相同的功能和性能。
将 LTO 回调与 cuFFT 计划关联¶
cufftXtSetJITCallback¶
-
cufftResult cufftXtSetJITCallback(cufftHandle plan, const void *lto_callback_fatbin, size_t lto_callback_fatbin_size, cufftXtCallbackType type, void **caller_info)¶
cufftXtSetJITCallback
将指定的回调与句柄plan
表示的计划关联。回调应编译为 LTO-IR(例如,使用
-dlto
标志和 nvcc 或 NVRTC),并作为指向包含已编译设备函数的数据的指针传递给该函数。数据可以是包含使用 nvcc 编译的 fatbin 的数组,也可以是 nvrtcGetLTOIR(…) 的结果。指针的大小(以字节为单位)应在
lto_callback_fatbin_size
中指定。请注意,此函数必须在计划创建之后(在使用
cufftCreate
初始化句柄之后),但在使用计划函数(例如cufftMakePlan1D
)之前调用。一旦与计划关联,LTO 回调就无法使用
cufftXtClearCallback
或任何其他方法取消设置。这是 cuFFT LTO EA 预览版的限制,我们正在努力解除此限制。可以使用
cufftXtSetCallbackSharedSize
在使用计划函数后设置回调的最大共享内存大小。非 LTO 回调的 16 kB 限制同样适用于 LTO 回调。- 参数:
plan[In] –
cufftHandle
由cufftCreate
返回。lto_callback_fatbin[In] – 指向主机内存中回调设备函数位置的指针,该函数在使用 nvcc 或 NVRTC 编译为 LTO-IR 之后。
lto_callback_fatbin_size[In] – 由
lto_callback_fatbin
指向的数据的大小(以字节为单位)。type[In] – 回调函数的类型,例如
CUFFT_CB_LD_COMPLEX
或CUFFT_CB_ST_REAL
。请参阅 回调的类型定义caller_info[In] – 指向调用者特定信息的可选设备指针数组,每个 GPU 一个。请注意,尚不支持多 GPU LTO 回调。
- 返回值:
CUFFT_SUCCESS – cuFFT 成功将计划与回调设备函数关联。
CUFFT_INVALID_PLAN – 计划无效(例如,句柄已用于制定计划)。
CUFFT_INVALID_TYPE – 回调类型无效。
CUFFT_INVALID_VALUE – 指向回调设备函数的指针无效或大小为 0。
CUFFT_NOT_SUPPORTED – 尚不支持该功能(例如,带有 LTO 回调的多 GPU)。
CUFFT_INTERNAL_ERROR – cuFFT 遇到意外错误。请联系我们,提供您的用例和反馈。
LTO 回调签名¶
与非 LTO 回调(被视为指向用户函数的指针)不同,LTO 回调在运行时链接到 cuFFT 内核。为了进行链接,回调签名(包括函数名称)必须与下面列出的完全一个签名匹配。这也意味着 cuFFT LTO EA 预览版限制为每个源文件/编译单元每种类型一个回调函数。
注意
我们目前正在努力允许 LTO 回调的灵活函数签名。
除了特定的函数名称外,LTO 回调的签名与非 LTO 回调的签名匹配。
以下是当前支持的 LTO 回调内核签名
加载单精度复数¶
- __device__ cufftComplex cufftJITCallbackLoadComplex(void *dataIn, size_t offset, void *callerInfo, void *sharedPointer)
加载双精度复数¶
- __device__ cufftDoubleComplex cufftJITCallbackLoadDoubleComplex(void *dataIn, size_t offset, void *callerInfo, void *sharedPointer)
加载单精度实数¶
- __device__ cufftReal cufftJITCallbackLoadReal(void *dataIn, size_t offset, void *callerInfo, void *sharedPointer)
加载双精度实数¶
- __device__ cufftDoubleReal cufftJITCallbackLoadDoubleReal(void *dataIn, size_t offset, void *callerInfo, void *sharedPointer)
存储单精度复数¶
- __device__ void cufftJITCallbackStoreComplex(void *dataOut, size_t offset, cufftComplex element, void *callerInfo, void *sharedPointer)
存储双精度复数¶
- __device__ void cufftJITCallbackStoreDoubleComplex(void *dataOut, size_t offset, cufftDoubleComplex element, void *callerInfo, void *sharedPointer)
存储单精度实数¶
- __device__ void cufftJITCallbackStoreReal(void *dataOut, size_t offset, cufftReal element, void *callerInfo, void *sharedPointer)
存储双精度实数¶
- __device__ void cufftJITCallbackStoreDoubleReal(void *dataOut, size_t offset, cufftDoubleReal element, void *callerInfo, void *sharedPointer)