如何在已编译程序中获取函数和全局变量的 CUDA 驱动程序模块句柄?
How can I get the CUDA driver module handle for functions and globals in the compiled program?
CUDA 运行时 API has 函数 cudaGetSymbolAddress()
和 cudaGetSymbolSize()
用于从主机端代码使用设备端全局变量,使用它们的名称(来源-代码标识符)作为句柄。
在驱动程序 API 中,我们有 cuModuleGetGlobal()
,它让我们可以做同样的事情...除了它需要一个全局符号所在的 CU 模块。如果你是使用动态编译的代码并将 loaded/added 放入模块中,然后一切就绪。但是,如果这些全局变量是您程序的一部分,使用 NVCC 静态编译而不是动态加载怎么办?
我假设每个编译程序都有某种“主模块”或“默认模块”,以及内置的全局变量和函数。我可以得到它的句柄吗?
I would assume that there's some sort of "primary module" or "default module" for each compiled program, with its baked-in globals and functions.
有,如果你拆开运行时 API 发出的使其工作的主机样板代码和一些运行时跟踪,你会看到它依赖于许多静态定义的符号和一些未记录的运行时 API 内部维护运行时 API 使用的模块的函数。
Can I get a handle for it?
使用驱动程序API,没有。如果您需要与运行时 API 交互,则使用运行时 API.
CUDA 运行时 API has 函数 cudaGetSymbolAddress()
和 cudaGetSymbolSize()
用于从主机端代码使用设备端全局变量,使用它们的名称(来源-代码标识符)作为句柄。
在驱动程序 API 中,我们有 cuModuleGetGlobal()
,它让我们可以做同样的事情...除了它需要一个全局符号所在的 CU 模块。如果你是使用动态编译的代码并将 loaded/added 放入模块中,然后一切就绪。但是,如果这些全局变量是您程序的一部分,使用 NVCC 静态编译而不是动态加载怎么办?
我假设每个编译程序都有某种“主模块”或“默认模块”,以及内置的全局变量和函数。我可以得到它的句柄吗?
I would assume that there's some sort of "primary module" or "default module" for each compiled program, with its baked-in globals and functions.
有,如果你拆开运行时 API 发出的使其工作的主机样板代码和一些运行时跟踪,你会看到它依赖于许多静态定义的符号和一些未记录的运行时 API 内部维护运行时 API 使用的模块的函数。
Can I get a handle for it?
使用驱动程序API,没有。如果您需要与运行时 API 交互,则使用运行时 API.