API 使用¶
cuFFT LTO EA 中 LTO 回调的使用分为两个部分
生成 LTO 回调(即,将回调编译为 LTO-IR)。
将 LTO 回调与 cuFFT 计划关联。
生成 LTO 回调¶
cuFFT LTO EA 目前支持两种生成 LTO 回调的方式(即,将回调代码编译为 LTO-IR)。
离线编译¶
可以使用 nvcc
和任何受支持的标志(例如 -dlto
或 -gencode=arch=compute_XX,code=lto_XX
,其中 XX
指示目标 GPU 架构)将回调代码编译为 LTO-IR。
请注意,PTX JIT 是 JIT LTO 内核最终确定轨迹的一部分,因此支持比当前系统架构更旧的架构;用户可以将他们的回调函数编译为目标架构 XX
的 LTO-IR,它应该在架构为 YY
的 GPU 中工作,其中 XX <= YY
。 有关更多详细信息,请参阅 即时编译。
一旦编译为 LTO-IR,包含回调的二进制文件可以使用 CUDA 工具包中包含的 bin2c
应用程序转换为包含带有数据的 C 数组的头文件。 然后可以将头文件包含在应用程序中,以将数组传递给 cuFFT。
有关更多详细信息,请参阅 cuFFT LTO EA tar ball 中包含的示例或公共 CUDA 库示例 github 存储库。
使用 NVRTC¶
生成 LTO 回调的另一种选择是使用 NVRTC 进行运行时编译。
NVRTC 支持 -dlto
标志,以便在运行时将回调编译为 LTO-IR。
如 离线编译 中所述,PTX JIT 是 JIT LTO 内核最终确定轨迹的一部分,因此可以将回调编译为任何比目标架构更旧的架构。
有关更多详细信息,请参阅 cuFFT LTO EA tar ball 中包含的示例。
将 LTO 回调与 cuFFT 计划关联¶
将 LTO 回调与 cuFFT 关联是使用 cuFFT LTO EA 中的 API 扩展完成的。 具体来说,我们可以使用新函数 cufftXtSetJITCallback,它的工作方式类似于 cufftXtSetCallback(…),但有一些注意事项。
首先,cufftXtSetJITCallback 必须在通过 cufftCreate(…) 创建计划后以及通过 cufftMakePlan…(…) 调用计划初始化函数之前调用。
其次,目前不支持从计划中删除 LTO 回调(使用 cufftXtClearCallback(…))。 必须创建一个新计划。
仍然支持通过 cufftXtSetCallbackSharedSize(…) 设置回调共享内存大小。