2011-06-17 10 views
4

私はNVCCがコンパイルCUBINへのハンドルを取得するとしてプログラムを登録するには、ソースコードにそれを注入理解二つの機能__cudaRegisterFatBinary関数と__cudaRegisterFunction関数のパラメータは何ですか?

__cudaRegisterFatBinary()

__cudaRegisterFunction()

に出くわしましたランタイム。

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

答えて

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

私はそれが直接呼び出されることを意味しないと理解します。しかし、私はまだしようとしている!あなたはfatcubinの記録構造を解読するのを助けることができますか?私は構造定義も持っています。しかし、コンパイラがどのようにしてこれらの関数を呼び出すために正確に何を行うのかを理解する必要があります – ash

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インクルードディレクトリのfatbinary.hで見つけてください。いくつかのヘッダー情報があります。 0x7F + 'ELF'(elfの魔法)の次のオカレンスを検索すると、そこにあるcubinファイルを抽出することができます。

関連する問題