我正在尝试通过利用运行时编译来优化我的模拟器。我的代码非常复杂,但我确定了一个特定的__device__
函数,通过删除所有全局内存访问可以大大提高其性能。
CUDA是否允许动态编译和链接单个__device__
函数(而不是__global__
),以便"覆盖"现有的功能?
答案 0 :(得分:2)
我很确定真正简短的答案是否定的。
虽然CUDA具有动态/ JIT设备链接器支持,但重要的是要记住链接过程本身仍然是静态的。
因此,您无法在运行时延迟加载现有编译GPU有效负载中的特定功能,就像在传统的动态链接加载环境中一样。并且链接器仍然要求链接时出现所有代码对象和符号的单个实例,无论是先验还是在运行时。因此,您可以自由地将预编译对象与相同代码的不同版本链接在一起,只要在会话完成并将代码加载到上下文中时,所有内容的单个实例都存在。但这就是你可以去的地方。
答案 1 :(得分:0)
看起来你有一个“主”内核,其中一部分在运行时是“可切换的”。
你绝对可以使用nvrtc来做到这一点。你需要做这样的事情:
就是这样。关键是在运行时需要延迟编译主内核。您可能还想以某种方式缓存内核,因此最终只编译一次。
我预见到一个问题。 nvrtc可能找不到可能导致某些问题的curand设备调用。一个解决方法是查看设备函数调用所在的标头,并使用nvcc将适当的设备内核编译为ptx。您可以将生成的ptx存储为文本,并使用cuLinkAddData链接到您的模块。您可以在this section中找到更多信息。