繁体   English   中英

使用 CudaEventElapsedTime 测量 Cuda 内核时间

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM