6

私の問題はこれによく似ています。最も単純な CUDA プログラムを実行しましたが、カーネルが起動しません。ただし、複数のファイル (他の人から取得したもの) で構成される複雑な CUDA プロジェクトを問題なく実行できるため、CUDA のインストールは問題ないと確信しています。これらのプロジェクトでは、コンパイルとリンクは、多くのフラグを持つメイクファイルを介して行われます。問題は、コンパイル中に使用する正しいフラグにあると思います。私は単に次のようなコマンドを使用します: nvcc -arch=sm_20 -lcudart test.cuそのようなプログラムで (Linux マシンで実行するため):

 __global__ void myKernel() 
{ 

    cuPrintf("Hello, world from the device!\n"); 


} 
int main() 
{ 
    cudaPrintfInit(); 
    myKernel<<<1,10>>>(); 
    cudaPrintfDisplay(stdout, true);    
    cudaPrintfEnd(); 
} 

プログラムは正しくコンパイルされます。cudaMemcpy() 操作を追加すると、エラーは返されません。カーネルが起動しない理由について何か提案はありますか?

4

3 に答える 3

13

使用時に印刷されない理由printfは、カーネルの起動が非同期であり、printf バッファーがフラッシュされる前にプログラムが終了するためです。これについては、CUDA (5.0) C プログラミング ガイドのセクション B.16 で説明されています。

printf() の出力バッファは、カーネルの起動前に固定サイズに設定されます (関連するホスト側 API を参照)。これは循環的であり、カーネルの実行中にバッファに収まりきらないほど多くの出力が生成された場合、古い出力が上書きされます。次のいずれかのアクションが実行された場合にのみフラッシュされます。

  • <<<>>> または cuLaunchKernel() によるカーネルの起動 (起動の開始時、および CUDA_LAUNCH_BLOCKING 環境変数が 1 に設定されている場合は、起動の終了時も同様)、
  • cudaDeviceSynchronize()、cuCtxSynchronize()、cudaStreamSynchronize()、cuStreamSynchronize()、cudaEventSynchronize()、または cuEventSynchronize() による同期、
  • cudaMemcpy*() または cuMemcpy*() のブロック バージョンによるメモリ コピー、
  • cuModuleLoad() または cuModuleUnload() によるモジュールのロード/アンロード、
  • cudaDeviceReset() または cuCtxDestroy() によるコンテキストの破棄。

このため、このプログラムは何も出力しません。

#include <stdio.h>

__global__ void myKernel() 
{ 
  printf("Hello, world from the device!\n"); 
} 

int main() 
{ 
  myKernel<<<1,10>>>(); 
} 

しかし、このプログラムは "Hello, world from the device!\n" を 10 回出力します。

#include <stdio.h>

__global__ void myKernel() 
{ 
  printf("Hello, world from the device!\n"); 
} 

int main() 
{ 
  myKernel<<<1,10>>>(); 
  cudaDeviceSynchronize();
} 
于 2012-08-29T02:02:56.723 に答える
3

CUDA デバイスが SM_20 アーキテクチャをサポートしていることは確かですか?

nvcc コマンド ラインから arch= オプションを削除し、すべてを再構築します。これは、すべての CUDA デバイスでサポートされる 1.0 CUDA アーキテクチャ用にコンパイルされます。それでも実行されない場合は、ビルド クリーンを実行し、オブジェクト ファイルがどこにも残っていないことを確認します。次に、再構築して実行します。

また、arch= は、compute_10 のような仮想アーキテクチャを指します。sm_20 は実際のアーキテクチャであり、arch= ではなく code= スイッチで使用する必要があると思います。

于 2012-08-28T17:24:18.540 に答える