私の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;
}
ようにコードを変更しました。
青のうち、プロファイルしようとしているカーネルは何ですか? –
@FlorentDUGUET圧縮行のスパース行列圧縮アルゴリズムの実装です。パフォーマンスに関するいくつかのメトリックを取得しようとしています。 – theKunz
すべてのAPI呼び出しの戻り値を確認する必要があります。キャッチしていないエラーが発生している可能性が最も高いです。 APIコールのエラーを報告する 'cuda-memcheck'でも実行できますが、* any * APIの戻り値を常にチェックすることがベストプラクティスです。 – Tom