我试图通过利用运行时编译来优化我的模拟器。我的代码很长也很复杂,但是我确定了一个特定的__device__函数,它的性能可以通过删除所有的全局内存访问而得到很大的改善。
CUDA是否允许动态编译和链接单个__device__函数(而不是__global__),以便“覆盖”现有函数?
发布于 2016-08-09 18:20:15
我敢肯定,最简短的答案是否定的。
尽管CUDA具有动态/JIT设备链接器支持,但重要的是要记住,链接过程本身仍然是静态的。
因此,不能像在传统的动态链接加载环境中一样,在运行时延迟在现有编译的GPU有效负载中加载特定函数。链接器仍然要求所有代码对象和符号的单个实例都在链接时出现,无论是先验的还是运行时的。因此您可以自由地将具有相同代码的不同版本的预编译对象链接到一起,只要在会话完成并将代码加载到上下文时存在所有东西的单个实例。但这是你所能做的。
发布于 2016-08-12 00:37:18
看起来您有一个“主”内核,其中一个部分在运行时是“可切换的”。
您肯定可以使用nvrtc来完成这个任务。你需要做这样的事情:
事情就是这样。关键是推迟编译主内核,直到您在运行时需要它。您还可能想要以某种方式缓存内核,以便只编译一次。
我预见到一个问题。nvrtc可能找不到curand设备调用,这可能会导致一些问题。其中一项工作是查看设备函数调用所在的报头,并使用nvcc将适当的设备内核编译为ptx。您可以将生成的ptx存储为文本,并使用cuLinkAddData与您的模块链接。您可以在本节中找到更多信息。
https://stackoverflow.com/questions/38856078
复制相似问题