是否有一些 CUDA 程序的代码内分析
Is there some in-code profiling of CUDA program
在 OpenCL 世界中有函数 clGetEventProfilingInfo,它 returns 事件的所有分析信息,如排队、提交、开始和结束时间(以纳秒为单位)。这非常方便,因为我可以随时 printf
该信息。
例如PyOpenCL可以这样写代码
profile = event.profile
print("%gs + %gs" % (1e-9*(profile.end - profile.start), 1e-9*(profile.start - profile.queued)))
这对我的任务很有帮助。
到目前为止,除了 nvprof
之外,没有其他工具可以收集分析数据。但是,您可以在代码中利用 nvprof
。看看this Nvida document。
您可以使用 cuProfilerStart()
和 cuProfilerStop()
来探测代码的一部分。
他们在 cuda_profiler_api.h
里面
对于快速、轻量级的计时,您可能需要查看 cudaEvent API。
以上 link 节选:
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice);
cudaEventRecord(start);
saxpy<<<(N+255)/256, 256>>>(N, 2.0f, d_x, d_y);
cudaEventRecord(stop);
cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost);
cudaEventSynchronize(stop);
float milliseconds = 0;
cudaEventElapsedTime(&milliseconds, start, stop);
printf("Elapsed time: %f ms\n", milliseconds);
如果你想要一个功能更全的分析库,你应该看看CUPTI。
在 OpenCL 世界中有函数 clGetEventProfilingInfo,它 returns 事件的所有分析信息,如排队、提交、开始和结束时间(以纳秒为单位)。这非常方便,因为我可以随时 printf
该信息。
例如PyOpenCL可以这样写代码
profile = event.profile
print("%gs + %gs" % (1e-9*(profile.end - profile.start), 1e-9*(profile.start - profile.queued)))
这对我的任务很有帮助。
到目前为止,除了 nvprof
之外,没有其他工具可以收集分析数据。但是,您可以在代码中利用 nvprof
。看看this Nvida document。
您可以使用 cuProfilerStart()
和 cuProfilerStop()
来探测代码的一部分。
他们在 cuda_profiler_api.h
对于快速、轻量级的计时,您可能需要查看 cudaEvent API。
以上 link 节选:
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice);
cudaEventRecord(start);
saxpy<<<(N+255)/256, 256>>>(N, 2.0f, d_x, d_y);
cudaEventRecord(stop);
cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost);
cudaEventSynchronize(stop);
float milliseconds = 0;
cudaEventElapsedTime(&milliseconds, start, stop);
printf("Elapsed time: %f ms\n", milliseconds);
如果你想要一个功能更全的分析库,你应该看看CUPTI。