【问题标题】:How can I get the CUDA driver module handle for functions and globals in the compiled program?如何获取已编译程序中函数和全局变量的 CUDA 驱动程序模块句柄?
【发布时间】:2022-01-12 01:44:27
【问题描述】:

CUDA 运行时 API has 函数 cudaGetSymbolAddress()cudaGetSymbolSize() 用于处理来自主机端代码的设备端全局变量,使用它们的名称(源代码标识符)作为句柄。

在驱动程序 API 中,我们有 cuModuleGetGlobal(),它可以让我们做同样的事情......除了它需要一个全局符号所在的 CUmodule。如果您正在使用动态编译的代码,并且加载/添加到一个模块中,然后你就准备好了。但是,如果这些全局变量是您程序的一部分,使用 NVCC 静态编译而不是动态加载呢?

我假设每个编译的程序都有某种“主模块”或“默认模块”,其中包含内置的全局变量和函数。我能得到它的句柄吗?

【问题讨论】:

  • a .cu 文件通过 nvcc 编译为 ptx 或 cubin(用于标准驱动程序 API 使用)。其中任何一个都由驱动程序 API 使用 cuModuleLoadXX 函数加载。不知道你在问什么。
  • 运行时 API 使用相当脆弱的私有样板来发挥它的魔力,没有任何 API 可以实现您的想象
  • 您是在询问来自运行时 API 构建的模块吗?否则我不明白你的问题。从字面上看,您使用与 nvrtc 调用相同的代码,除了模块是从您从文件名或句柄加载外部 cubin 或 ptx 的调用返回的,而不是运行时编译器输出
  • @talonmies:我将尝试在评论中解释,请告诉我是否应该重新表述问题本身。我没有动态加载任何东西。我有一个带有全局设备端变量的 .cu 文件,比如说,一个使用它的内核。我现在想使用cuModuleGetGlobal() 来获取有关该全局的信息。
  • @RobertCrovella:(再次回答以澄清)。我问的不是我自己动态加载的模块,而是我将.cu 文件编译到程序中并运行它时运行时创建的模块。

标签: cuda globals nvrtc cuda-driver


【解决方案1】:

我假设每个编译的程序都有某种“主模块”或“默认模块”,其中包含内置的全局变量和函数。

有,如果您将运行时 API 发出的使其工作的主机样板代码和一些运行时跟踪分开,您会发现它依赖于许多静态定义的符号和一些内部维护的未记录的运行时 API 函数运行时 API 使用的模块。

我可以得到它的句柄吗?

使用驱动程序 API,不。如果您需要与运行时 API 交互,请使用运行时 API。

【讨论】:

  • 实际上,我想要这个模块的原因是avoid having to interact with the runtime API as much as possible,同时仍然让我的用户编写代码,就好像他们要使用运行时API一样。但我想这无济于事,就像cudaGetFuncBySymbol()一样。
  • 也许您可以通过提取用户的 PTX 来更改构建过程。
猜你喜欢
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2012-05-13
  • 2019-03-04
  • 2013-10-17
相关资源
最近更新 更多