使用CudaEventElapsedTime进行Cuda内核时间测量

时间:2016-05-09 16:14:46

标签: visual-c++ time cuda gpu execution-time

我有NVS 5400M,我正在尝试获得可靠的时间测量结果,以便在矩阵(实例1000 x 1000)上添加cuda。

__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,相对较小。我的问题是我做得对吗?

1 个答案:

答案 0 :(得分:1)

您的时间安排是正确的,但您一般不会使用CUDA。

这是非法的:

dim3 threadsPerBlock(1000, 1000);

CUDA内核限制为每个块最多1024个线程,但是每个块请求1000x1000 = 1,000,000个线程。

因此,您的内核实际上并未启动:

MatAdd <<<numBlocks, threadsPerBlock>>>(pA, pB, pC);

所以测量的时间很短。

建议您使用proper cuda error checking并使用cuda-memcheck运行测试以确保没有报告的运行时错误(我的猜测现在您甚至不知道您的错误报告代码 - 您必须检查它们。)

由于您没有显示完整的代码,我不打算尝试识别可能存在的所有其他问题,但是为了正确处理1000x1000数组,必须重新考虑您的内核代码,并且将双指针(例如int** A)参数传递给内核要比单个指针或“平面”数组困难得多。