2011-07-14 7 views
13

高いコンピューティング能力でコンパイルされたCUDAコードは、コンピューティング能力の低いデバイスで、カーネルで黙って失敗する前に、完全に長い時間実行されます。私は、デバイス(Tesla C2050)が2.0である間に、ビルドルールがsm_21であったことを認識するために、半日も逃れていました。CUDA:適切なコンピューティング機能を確認するにはどうすればよいですか?

互換性のあるコンピューティング機能を搭載したデバイスで実行されている場合、セルフチェックできるCUDA APIコードはありますか?私は多くのコンピューティング能力のデバイスをコンパイルして作業する必要があります。このようなエラーが発生しないように私が取ることができる他の措置はありますか?

答えて

16

ランタイムAPIでcudaGetDevicePropertiesは、列挙された任意のCUDAデバイスの計算機能を返す2つのフィールドmajorminorを返します。これを使って任意のGPUのコンピューティング機能を解析してから、そのコードがコンテキストに適したアーキテクチャであることを確認することができます。 nvcc例えば、-gencodeオプションを使用して、単一の呼び出しからの複数のアーキテクチャを含むオブジェクトファイルを生成することができる:

nvcc -c -gencode arch=compute_20,code=sm_20 \ 
     -gencode arch=compute_13,code=sm_13 \ 
     source.cu 

はGT200とGF100カードのCUBINファイルを含む埋め込みファットバイナリオブジェクトと出力オブジェクトファイルを生成します。ランタイムAPIは自動的にアーキテクチャ検出を処理し、余分なホストコードなしでfatbinaryオブジェクトから適切なデバイスコードをロードしようとします。

+0

バイナリがデバイスを検出して適切なバージョンを読み込むことはできますが、単一のバージョン(一致しない)があるときに意味のあるエラーで終了しない理由は何ですか? –

+1

基本的に抽象度が高すぎます。ドライバAPIを使用して「手作業で」プロセスを実行する場合、対象となるGPUに適したキューインがないと意味のあるエラーメッセージが返されます。しかし、多くのステップはすべて暗黙的に行われ(デバイスの選択、コンテキストの確立、モジュールのロード、コードとデータの取得)、故意に抽象化されたプロセスのいずれかが失敗した場合、ランタイムは汎用の初期化エラーを返します。その程度の制御が必要な場合は、ドライバAPIを使用してコンテキストを明示的に管理してから、ランタイムAPIのコンテキストを使用してください。 CUDA 3.1以降の相互運用性がサポートされました。 – talonmies

+1

@Ashwin:投稿後2年半の回答を受け入れました。それは何らかの記録でなければなりません..... – talonmies

0

実行デバイスのクエリです。 システム内のすべてのデバイスのコンピューティング機能を検出します。 次に、SetDevice()で目的のデバイスでコードを実行します。

+0

deviceQueryはこの情報を提供していません。 –

関連する問題