我有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,相对较小。我的问题是我做得对吗?
答案 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
)参数传递给内核要比单个指针或“平面”数组困难得多。