首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NVRTC和__device__函数

NVRTC和__device__函数
EN

Stack Overflow用户
提问于 2016-08-09 16:30:15
回答 2查看 1.1K关注 0票数 1

我试图通过利用运行时编译来优化我的模拟器。我的代码很长也很复杂,但是我确定了一个特定的__device__函数,它的性能可以通过删除所有的全局内存访问而得到很大的改善。

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

EN

回答 2

Stack Overflow用户

发布于 2016-08-09 18:20:15

我敢肯定,最简短的答案是否定的。

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-08-12 00:37:18

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

您肯定可以使用nvrtc来完成这个任务。你需要做这样的事情:

  • 不要提前编译主内核,而是将其存储为要在运行时编译和链接的字符串。
  • 假设主内核调用"myFunc“,这是在运行时选择的设备内核。
  • 您可以在运行时根据方程生成适当的"myFunc“内核。
  • 现在,您可以使用nvrtcCreateProgram使用多个源创建nvrtc程序。

事情就是这样。关键是推迟编译主内核,直到您在运行时需要它。您还可能想要以某种方式缓存内核,以便只编译一次。

我预见到一个问题。nvrtc可能找不到curand设备调用,这可能会导致一些问题。其中一项工作是查看设备函数调用所在的报头,并使用nvcc将适当的设备内核编译为ptx。您可以将生成的ptx存储为文本,并使用cuLinkAddData与您的模块链接。您可以在本节中找到更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38856078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档