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 标志和 nvccNVRTC),并作为指向包含已编译设备函数的数据的指针传递给该函数。数据可以是包含使用 nvcc 编译的 fatbin 的数组,也可以是 nvrtcGetLTOIR(…) 的结果。

指针的大小(以字节为单位)应在 lto_callback_fatbin_size 中指定。

请注意,此函数必须在计划创建之后(在使用 cufftCreate 初始化句柄之后),但在使用计划函数(例如 cufftMakePlan1D)之前调用。

一旦与计划关联,LTO 回调就无法使用 cufftXtClearCallback 或任何其他方法取消设置。这是 cuFFT LTO EA 预览版的限制,我们正在努力解除此限制。

可以使用 cufftXtSetCallbackSharedSize 在使用计划函数后设置回调的最大共享内存大小。非 LTO 回调的 16 kB 限制同样适用于 LTO 回调。

参数:
  • plan[In]cufftHandlecufftCreate 返回。

  • lto_callback_fatbin[In] – 指向主机内存中回调设备函数位置的指针,该函数在使用 nvcc 或 NVRTC 编译为 LTO-IR 之后。

  • lto_callback_fatbin_size[In] – 由 lto_callback_fatbin 指向的数据的大小(以字节为单位)。

  • type[In] – 回调函数的类型,例如 CUFFT_CB_LD_COMPLEXCUFFT_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)