5

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

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

編集: このメタデータが導入された CUDA バージョンが間違ってリストされていました。cuLaunchKernel のドキュメントによると、4.0 ではなく 3.2 でした。

4

2 に答える 2

1

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

于 2012-12-10T12:45:53.910 に答える
1

私は同じ問題に取り組んでいます(その間に解決したかどうかはわかりません)。既知のカーネルを使用して、CUfunction が指すメモリがどのように使用されているかを調査しています。これはパラメータなしのバージョンです:

#include<cstdio>

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

これは 1 つのパラメーターのバージョンなどです。

#include<cstdio>

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

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

于 2016-12-07T08:46:46.023 に答える