2012-12-10 8 views
5

cuLaunchKernel functionのNVidiaドキュメントによれば、CUDA 3.2以降でコンパイルされたカーネルには、パラメータリストに関する情報が含まれています。この情報をプログラムでCU関数ハンドルから取得する方法はありますか?カーネルのCU関数ハンドルから引数の数と各引数のサイズをバイト単位で知る必要があります。上記のNVidiaのドキュメントでは、この情報が存在すると言っていますが、この情報にアクセスするためのプログラム的な方法を示すCUDAドキュメントのどこにも触れていません。CUDA 4.0+カーネルのパラメータリスト情報を取得するにはどうすればよいですか?

もう少し説明を追加する:私はミドルウェアシステムを使って作業しています。そのフロントサイドライブラリは、ターゲットシステム上のlibcuda(ドライバAPIライブラリ)を置き換えます。その後、GPGPUリソ​​ースが使用されている別のホスト上のデーモンとして背面が実行され、そのマシン上の実際のlibcudaが呼び出されます。 cuLaunchKernelでこれを行う他のミドルウェアソリューションもありますので、間違いなく可能です。また、cuLaunchKernelに渡すポインタからパラメータを解析する方法を知るために、CUDA自身もこの情報を使用します。

編集:元々、このメタデータが誤って紹介されたCUDAバージョンがありました。 cuLaunchKernel documentationによれば、4.0ではなく3.2であった。

+0

CUfunctionはカーネルで、接頭辞は__global__です。 CUfunctionの議論の大きさが必要ですか?あなたがカーネルを持っているなら、それを見つけることができます。 – ahmad

+0

はい、私は引数のサイズが必要です。私はカーネルのソースを持っておらず、ハンドル(cuModuleGetFunction()の前の呼び出しから返されたものと思われます)。具体的には、引数の数と各引数のサイズが必要です。 – reirab

答えて

1

cuLaunchKernelは、関数プロトタイプを知っているカーネルを起動するように設計されています。関数プロトタイプを "リバースエンジニアリング"するためのAPIはありません。

+2

カーネルがC++リンケージでコンパイルされている場合は、カーネル内のデバイスELFペイロードのシンボルから変換されたシンボル名をリバースエンジニアリングする必要があります。しかし、カーネルがCリンケージでコンパイルされていれば、うまくいきません...... – talonmies

+0

真実! :) – harrism

+0

笑、残念ながら、私はC++リンケージが使われたとは思いません。 cuLaunchKernelのドキュメントによると、引数の数とタイプはCUDA 4.0以降でコンパイルされたカーネルのメタデータとして保存されていますが、この情報にアクセスするためのパブリックAPIはありませんでした。そのメタデータは、cuLaunchKernel自身がどのように引数を解析するかということですが、cuLaunchKernelをサポートする他のミドルウェアも認識しています。そのためには何らかの方法が必要です。私は自分自身のキューブを解析するよりも良いものを望んでいましたが、それは下に来るものかもしれません。 – reirab

1

私は同じ問題に取り組んでいます(あなたがそれを解決したかどうかはわかりません)。 私は既知のカーネルを使用して、CUfunctionがどのようにメモリを使用しているかを調べています。

#include<cstdio> 

extern "C" { 
    __global__ void HelloWorld(){ 
     int thid = (blockIdx.x * blockDim.x) + threadIdx.x; 
    } 
} 

これは一つのパラメータのバージョンであるというように: これは、パラメータなしのバージョンです。

#include<cstdio> 

extern "C" { 
    __global__ void HelloWorld(int a) { 
     int thid = (blockIdx.x * blockDim.x) + threadIdx.x; 
    } 
} 

CUfunctionが指すメモリの最初の1024バイトをダンプし、ポインタに従うことをお勧めします。例えば、0x30のオフセットには、ポインタのテーブルを指すポインタがあります。私は、CUfunctionによってポストされた構造体のサイズは関数のパラメータの数によって変化しないことに気付きました。したがって、私たちが探しているテーブルは、ポインタに続いて狩りをしなければなりません。

関連する問題