我遇到了两个功能
__cudaRegisterFatBinary()
和
__cudaRegisterFunction()
我了解 nvcc 将其注入源代码以获取已编译 cubin 的句柄并将程序注册到运行时。
有人可以向我解释或指出我在哪里可以找到有关函数的每个参数的信息吗?具体来说,我想更多地了解__cudafatcudabinaryrec
第一个函数中使用的指针。关于第二个函数中的主机函数和设备函数指针。
谢谢
我遇到了两个功能
__cudaRegisterFatBinary()
和
__cudaRegisterFunction()
我了解 nvcc 将其注入源代码以获取已编译 cubin 的句柄并将程序注册到运行时。
有人可以向我解释或指出我在哪里可以找到有关函数的每个参数的信息吗?具体来说,我想更多地了解__cudafatcudabinaryrec
第一个函数中使用的指针。关于第二个函数中的主机函数和设备函数指针。
谢谢
我知道这是一个非常古老的线程,但我只想分享我的一些发现。我对 NVCC 生成的可执行文件的某些部分进行了逆向工程。所以我不确定正确性和使用风险自负。我使用的是 cuda 8.0 RC,所以我不确定其他版本是否有任何改变。
__cuRegisterFatBinary 将 avoid *
作为输入。它指向可执行文件,在我的示例中,我得到了以下内容。
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 中的地址,您将能够找到真正的胖二进制文件,该二进制文件遵循您可以在fatbinary.h
cuda 包含目录中找到的定义。有一些头信息。如果您搜索下一个出现的 0x7F + 'ELF'(精灵魔法),您将能够在那里提取 cubin 文件。
原型在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);
但请注意,这些函数并不意味着由用户代码直接调用。