[英]Cuda kernel time measurement with CudaEventElapsedTime
我有 NVS 5400M,我正在尝试为矩阵上的 cuda 添加获得可靠的时间测量结果(实例 1000 x 1000)。
__global__ void MatAdd(int** A, int** B, int** C) {
int i = threadIdx.x;
int j = threadIdx.y;
C[i][j] = A[i][j] + B[i][j]; }
我正在做如下测量:
int numBlocks = 1;
dim3 threadsPerBlock(1000, 1000);
float time;
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
MatAdd <<<numBlocks, threadsPerBlock>>>(pA, pB, pC);
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&time, start, stop);
cout << setprecision(10) << "GPU Time [ms] " << time << endl;
结果是:0.001504000043 ms,相对较小。 我的问题是我做得对吗?
您的时机是正确的,但您对 CUDA 的总体使用情况并非如此。
这是非法的:
dim3 threadsPerBlock(1000, 1000);
CUDA 内核限制为每个块最多 1024 个线程,但您请求每个块 1000x1000 = 1,000,000 个线程。
因此,您的内核实际上并未启动:
MatAdd <<<numBlocks, threadsPerBlock>>>(pA, pB, pC);
所以测量的时间很短。
建议您使用适当的 cuda 错误检查并使用cuda-memcheck
运行您的测试以确保没有报告运行时错误(我的猜测是现在您甚至不知道您的代码报告的错误 - 您必须检查为他们。)
由于您没有展示完整的代码,我不会尝试确定可能存在的所有其他问题,但是您的内核代码必须重新分解才能正确处理 1000x1000 数组,并传递 double内核的 -pointer(例如int** A
)参数比单个指针或“平面”数组困难得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.