我遇到了两个功能
__cudaRegisterFatBinary()
和
__cudaRegisterFunction()
我理解nvcc将它注入到源代码中以获取已编译cubin的句柄并向运行时注册该程序。
有人可以向我解释或指出我可以找到有关功能的每个参数的信息吗?具体来说,我想了解更多有关第一个函数中使用的__cudafatcudabinaryrec
指针的信息。关于第二个函数中的主机函数和设备函数指针。
谢谢
答案 0 :(得分:2)
原型位于cudart.h
。
void** __cudaRegisterFatBinary(void *fatCubin);
void __cudaRegisterFunction(void **fatCubinHandle, const char *hostFun, char *deviceFun,
const char *deviceName, int thread_limit, uint3 *tid,
uint3 *bid, dim3 *bDim, dim3 *gDim, int *wSize);
但请注意,这些功能并不是由用户代码直接调用。
答案 1 :(得分:1)
我知道这是一个非常古老的主题,但我只想分享一些我的发现。我反向设计了NVCC生成的可执行文件的一部分。所以我不确定正确性和使用风险,风险自负。我正在使用cuda 8.0 RC,所以我不确定其他版本是否有任何改变。
__cuRegisterFatBinary将void *
作为输入。它指向可执行文件,在我的示例中,我得到了以下内容。
B1 43 62 46 01 00 00 00 70 15 40 00 00 00 00 00 00 00 00 00 00 00 00 00
十六进制的序列遵循格式
struct {
uint32_t magic; // Always 0x466243b1
uint32_t seq; // Sequence number of the cubin
uint64_t ptr; // The pointer to the real cubin
uint64_t data_ptr; // Some pointer related to the data segment
}
因此,如果您按照字段ptr中的地址,您将能够找到真正的胖二进制文件,该二进制文件遵循您在cuda include目录中的fatbinary.h
中可以找到的定义。有一些标题信息。如果您搜索下一次出现的0x7F +' ELF' (精灵魔法),你将能够在那里提取cubin文件。