__cudaRegisterFatBinary和__cudaRegisterFunction函数的参数是什么?

时间:2011-06-17 22:21:49

标签: cuda nvidia fat-binaries

我遇到了两个功能

__cudaRegisterFatBinary()

__cudaRegisterFunction()

我理解nvcc将它注入到源代码中以获取已编译cubin的句柄并向运行时注册该程序。

有人可以向我解释或指出我可以找到有关功能的每个参数的信息吗?具体来说,我想了解更多有关第一个函数中使用的__cudafatcudabinaryrec指针的信息。关于第二个函数中的主机函数和设备函数指针。

谢谢

2 个答案:

答案 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文件。