2016-05-01 75 views
1

私のCUDAプログラムでnvprofでベンチマークタイミングを取得しようとしていますが、残念ながらAPI呼び出しやカーネルのプロファイリングが行われていないようです。私は確かに、私は右のそれをやっていた作るために簡単な初心者例えば見て、ここでのNvidiaのdevのブログに1を見つけました:nvprofがAPIコールまたはカーネルを取得していません

https://devblogs.nvidia.com/parallelforall/how-optimize-data-transfers-cuda-cc/

コード:

int main() 
{ 
    const unsigned int N = 1048576; 
    const unsigned int bytes = N * sizeof(int); 
    int *h_a = (int*)malloc(bytes); 
    int *d_a; 
    cudaMalloc((int**)&d_a, bytes); 

    memset(h_a, 0, bytes); 
    cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice); 
    cudaMemcpy(h_a, d_a, bytes, cudaMemcpyDeviceToHost); 

    return 0; 
} 

コマンドライン:

-bash-4.2$ nvcc profile.cu -o profile_test 
-bash-4.2$ nvprof ./profile_test 

私はそれをワードごとに1行ずつ複製し、同じコマンドライン引数を実行しました。残念ながら、私の結果は同じだった:私は誰もが私が間違ってやっていることを知っているならば、私は答えを知って感謝されると思いますNvidiaのツールキット7.5

を実行しています

-bash-4.2$ nvprof ./profile_test 
==85454== NVPROF is profiling process 85454, command: ./profile_test 
==85454== Profiling application: ./profile_test 
==85454== Profiling result: 
No kernels were profiled. 

==85454== API calls: 
No API activities were profiled. 

。 -----

----- EDITは、だから私は残念ながら、それは物事を変えなかった

#include<cuda_profiler_api.h> 

int main() 
{ 
    cudaProfilerStart(); 
    const unsigned int N = 1048576; 
    const unsigned int bytes = N * sizeof(int); 
    int *h_a = (int*)malloc(bytes); 
    int *d_a; 
    cudaMalloc((int**)&d_a, bytes); 

    memset(h_a, 0, bytes); 
    cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice); 
    cudaMemcpy(h_a, d_a, bytes, cudaMemcpyDeviceToHost); 

    cudaProfilerStop(); 
    return 0; 
} 

ようにコードを変更しました。

+0

青のうち、プロファイルしようとしているカーネルは何ですか? –

+0

@FlorentDUGUET圧縮行のスパース行列圧縮アルゴリズムの実装です。パフォーマンスに関するいくつかのメトリックを取得しようとしています。 – theKunz

+2

すべてのAPI呼び出しの戻り値を確認する必要があります。キャッチしていないエラーが発生している可能性が最も高いです。 APIコールのエラーを報告する 'cuda-memcheck'でも実行できますが、* any * APIの戻り値を常にチェックすることがベストプラクティスです。 – Tom

答えて

2

スレッドから終了する前に、cudaProfilerStop()(ランタイムAPI用)に電話する必要があります。これにより、nvprofは必要なすべてのデータを収集できます。 CUDA docによると

まだフラッシュされていないプロファイル情報を失わないようにするには、プロファイルされる アプリケーションはCUDAの同期化]コールを使用して(すべての GPUの作業が行われていること、終了する前に、確認する必要があります)、次に cudaProfilerStop()またはcuProfilerStop()と呼び出します。そうすることで、バッファされた対応するコンテキストのプロファイル情報がフラッシュされます( )。

+1

また、終了時に 'cudaDeviceReset'を呼び出すと、明示的なコンテキスト破壊時にプロファイルバッファがフラッシュされます。 – talonmies

+0

あなたの提案を試してみましたが、残念ながらまだプロファイリングされていません。 (編集済みのコードを参照) – theKunz

+0

コンパイラがコードを最適化するか、API呼び出しに問題がある(つまりエラーコードをチェックする)可能性があります。少なくとも1つのカーネルをプロファイリングすることもできます。 –

関連する問題