NVRTC和__device__功能

时间:2016-08-09 16:30:15

标签: cuda gpgpu nvidia jit

我正在尝试通过利用运行时编译来优化我的模拟器。我的代码非常复杂,但我确定了一个特定的__device__函数,通过删除所有全局内存访问可以大大提高其性能。

CUDA是否允许动态编译和链接单个__device__函数(而不是__global__),以便"覆盖"现有的功能?

2 个答案:

答案 0 :(得分:2)

我很确定真正简短的答案是否定的。

虽然CUDA具有动态/ JIT设备链接器支持,但重要的是要记住链接过程本身仍然是静态的。

因此,您无法在运行时延迟加载现有编译GPU有效负载中的特定功能,就像在传统的动态链接加载环境中一样。并且链接器仍然要求链接时出现所有代码对象和符号的单个实例,无论是先验还是在运行时。因此,您可以自由地将预编译对象与相同代码的不同版本链接在一起,只要在会话完成并将代码加载到上下文中时,所有内容的单个实例都存在。但这就是你可以去的地方。

答案 1 :(得分:0)

看起来你有一个“主”内核,其中一部分在运行时是“可切换的”。

你绝对可以使用nvrtc来做到这一点。你需要做这样的事情:

  • 不是提前编译主内核,而是将其存储为字符串,以便在运行时进行编译和链接。
  • 假设主内核调用“myFunc”,它是在运行时选择的设备内核。
  • 您可以在运行时根据公式生成相应的“myFunc”内核。
  • 现在,您可以使用nvrtcCreateProgram使用多个来源创建一个nvrtc程序。

就是这样。关键是在运行时需要延迟编译主内核。您可能还想以某种方式缓存内核,因此最终只编译一次。

我预见到一个问题。 nvrtc可能找不到可能导致某些问题的curand设备调用。一个解决方法是查看设备函数调用所在的标头,并使用nvcc将适当的设备内核编译为ptx。您可以将生成的ptx存储为文本,并使用cuLinkAddData链接到您的模块。您可以在this section中找到更多信息。