CUDA 动态并行与驱动程序 API

FHo*_*nig 3 cuda dynamic-parallelism

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

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

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

(这是Win64上的CUDA 6.5和VC2013)

kun*_*zmi 5

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

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

在您的应用程序中:

  • 使用 cuLinkCreate() 创建链接器实例
  • 使用 cuLinkAddFile() 或 cuLinkAddData() 附加 ptx 文件
  • 使用 cuLinkAddFile() 或 cuLinkAddData() 附加 cudadevrt.lib
  • 调用 cuLinkComplete(),它会返回二进制文件,然后您可以照常加载(例如 cuModuleLoadDataEx())
  • 使用 cuLinkDestroy() 销毁链接器实例