4

私は2つの機能に出くわしました

__cudaRegisterFatBinary()

__cudaRegisterFunction()

nvcc がそれをソースコードに挿入して、コンパイルされたcubinへのハンドルを取得し、プログラムをランタイムに登録することを理解しています。

誰かが私に説明したり、関数の各パラメーターに関する情報を見つけることができる場所を教えてもらえますか? __cudafatcudabinaryrec具体的には、最初の関数で使用されるポインターについて詳しく知りたいです。そして、2番目の関数のホスト関数とデバイス関数のポインターについて。

ありがとうございました

4

2 に答える 2

3

これが非常に古いスレッドであることは承知していますが、私の発見の一部を共有したいと思います。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

16 進数のシーケンスは次の形式に従います。

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
}

fatbinary.hしたがって、フィールド ptr のアドレスをたどると、cuda インクルード ディレクトリにある定義に従う実際のファット バイナリを見つけることができます。いくつかのヘッダー情報があります。次に出現する 0x7F + 'ELF' (エルフの魔法) を検索すると、cubin ファイルを抽出できます。

于 2016-09-12T14:54:08.717 に答える
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);

ただし、これらの関数はユーザーコードから直接呼び出されることを意図したものではないことに注意してください。

于 2011-06-17T22:30:46.247 に答える