1

アプリケーションがより多くの時間を費やしている正確な場所を見つける方法を知りたいです。これは CUDA 呼び出しを含む C++ コードであるため、C++ コードから、CUDA コードを呼び出すラッパーを作成しました。C++ コードのタイミングを計ると、実行に 5 秒かかりますが、Nsight でコードをプロファイリングすると、カーネルは 8 ミリ秒かかります。どうすればそれが可能になりますか?

c++コードから:

double start_divide = get_host_current_time();
callDivideKernel( keep, d_a, d_A_N );
double end_divide = get_host_current_time();
printf("divideKernel : %g\n", end_divide - start_divide);

cuファイル:

void callDivideKernel(int N, float* A, int* A_N){

  cudaEvent_t start, stop;
  float time;
  cudaEventCreate(&start);
  cudaEventCreate(&stop);

  dim3 dimGrid(618,128);
  dim3 dimBlock(512);

  cudaEventRecord(start, 0);
  DivideKernel<<< dimGrid,dimBlock >>>(N, A, A_N);
  cudaEventRecord(stop, 0);
  cudaEventSynchronize(stop);
  cudaEventElapsedTime(&time, start, stop);
  printf("callDividekernel = %f ms\n",time);
  cudaThreadSynchronize();

}

__global__ void DivideKernel(int N, float* A, int* A_N){

  int k =  blockIdx.x * blockDim.x + threadIdx.x +
    blockDim.x*gridDim.x*blockIdx.y;

  int kmax = (N*(N+1))/2;
  int row,col;

  if(k < kmax){
    row = (int)(sqrt(0.25+2.0*k)-0.5); 
    col = k - (row*(row+1))/2;
    int val = max(1, A_N[row*N + col]);
    A[row*N + col] /= (float)val;
  }
}

結果:

callDividekernel = 7.111040 ms
divideKernel : 5.66533
4

0 に答える 0