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(…) 设置回调共享内存大小。