4

CUDA ドライバー API を使用して、.cl カーネルによって生成された PTX アセンブリ コードを実行しようとしました。私が行った手順は次のとおりです(標準のopencl手順):

1) .cl カーネルをロードする

2) JITコンパイルする

3) コンパイルされた ptx コードを取得して保存します。

ここまでは順調ですね。

ptx アセンブリ内にいくつかの特殊なレジスタ、%envreg3、%envreg6 などがあることに気付きました。ドライバー API。そのため、コードは無限ループに陥り、正しく実行できません。しかし、値を手動で設定した場合 (正確には %envreg6 を ptx 内のブロックサイズに置き換えます)、コードが実行され、正しい結果が得られます (CPU の結果と比較して正しい)。

これらのレジスタに値を設定する方法を知っている人はいますか? つまり、これらのレジスタに値を設定する cuLaunchKernel のフラグですか?

4

1 に答える 1

4

OpenCL カーネルをコンパイルし、CUDA ドライバー API を使用して実行しようとしています。OpenCL と CUDA では NVIDIA のドライバ/コンパイラ インターフェイスが異なるため、やりたいことがサポートされておらず、基本的に動作しません。

おそらく、あなたが見つけた唯一の回避策は、PTX コードにパッチを当てることです。しかし、これは一般的なケースではうまくいかないかもしれないと思います。

編集: 具体的には、OpenCL はほとんどの NVIDIA GPU がサポートするよりも大きなグリッドをサポートするため、複数の実際のグリッド起動に分割してグリッド サイズを仮想化する必要があるため、オフセットが必要です。また、OpenCL では、インデックスは必ずしも (0, 0, 0) から始まるとは限りません。ユーザーは、ドライバーがカーネルに渡す必要があるオフセットを指定できます。したがって、OpenCL と CUDA C の起動用に初期化されるレジスタは異なります。

于 2012-12-12T00:34:01.257 に答える