Я знаю, что это очень старая тема, но я просто хочу поделиться некоторыми своими открытиями. Я пересмотрел некоторые части исполняемого файла, которые производит 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, вы сможете найти настоящий толстый двоичный файл, который соответствует определению, которое вы можете найти в fatbinary.h
, в вашем каталоге cuda include. Есть некоторая информация заголовка. Если вы ищете следующее вхождение 0x7F + 'ELF' (магия эльфов), вы сможете извлечь там файл кубина.