与 Driver API 的 CUDA 动态并行性

CUDA dynamic parallelism with Driver API

我正在尝试编译和 link 一个动态内核,并将其与 GK110 上的 CUDA 驱动程序 API 一起使用。

我将 Visual Studio 中带有可重定位设备代码标志和 compute_35、sm_35 中的 .cu 源文件编译成一个 ptx 文件,然后 CUDA linker 添加 cudadevrt.lib(至少它尝试根据 linker 调用)。当我在 ptx .obj 上执行 cuModuleLoad 时,它说不支持的设备代码。还有一个 .device-link.obj,它看起来小得不切实际,而且驱动程序 api 的功能似乎都无法将其识别为有效图像。在检查 ptx 文件时,我可以看到它根据 CUDA 文档(来自 PTX 部分的动态并行性)生成了对内核启动函数的调用。

我如何link 正确的设备代码以使动态内核调用起作用?

(这是使用 VC2013 的 Win64 上的 CUDA 6.5)

您需要在使用驱动程序提供的 cuda 链接器加载 ptx 文件时进行链接 API:

  • 将带有可重定位标志的cu源文件编译为ptx

在您的应用中:

  • 使用 cuLinkCreate() 创建链接器实例
  • 使用 cuLinkAddFile() 或 cuLinkAddData() 添加 ptx 文件
  • 使用 cuLinkAddFile() 或 cuLinkAddData() 添加 cudadevrt.lib
  • 调用 cuLinkComplete(),returns 你可以像往常一样加载二进制文件(例如 cuModuleLoadDataEx())
  • 使用 cuLinkDestroy() 销毁链接器实例