Visual c++ 使用CUDAEDtime测量Cuda内核时间

Visual c++ 使用CUDAEDtime测量Cuda内核时间,visual-c++,time,cuda,gpu,execution-time,Visual C++,Time,Cuda,Gpu,Execution Time,我有NVS 5400M,我正试图获得矩阵上cuda加法的可靠时间测量结果(实例1000 x 1000) 我在做测量,比如: int numBlocks = 1; dim3 threadsPerBlock(1000, 1000); float time; cudaEvent_t start, stop; cudaEventCreate(&start); cudaEventCreate(&stop); cudaEventRecord(start, 0); MatAdd <&

我有NVS 5400M,我正试图获得矩阵上cuda加法的可靠时间测量结果(实例1000 x 1000)

我在做测量,比如:

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;
int numBlocks=1;
dim3螺纹锁固胶(10001000);
浮动时间;
cudaEvent\u t启动、停止;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(开始,0);
MatAdd(pA、pB、pC);
cudaEventRecord(停止,0);
CUDAEVENTS同步(停止);
CUDAEVENTERASEDTIME(时间、开始、停止(&T));

cout您的时间安排是正确的,但您对CUDA的使用通常是不正确的

这是非法的:

dim3 threadsPerBlock(1000, 1000);
CUDA内核限制为每个块最多1024个线程,但您请求的是每个块1000x1000=1000000个线程

因此,内核实际上没有启动:

MatAdd <<<numBlocks, threadsPerBlock>>>(pA, pB, pC);
MatAdd(pA、pB、pC);
所以测量的时间很短

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


由于您还没有展示完整的代码,我不打算尝试识别可能存在的所有其他问题,但是为了正确处理1000x1000数组,您的内核代码必须重新分解,并且向内核传递双指针(例如,
int**a
)参数比单指针或“平面”数组。

检查后,我收到消息:同步内核错误:配置参数无效。谢谢!@Edit:我已更改为
dim3 threadsPerBlock(32,32)
,实际代码是:
int**A=create_random_matrix(1000);
int**pA=initialize_matrix(1000);
cudamallock((void**)pA,(1000*1000)*sizeof(int);
cudaMemcpy(pA,A,(1000*1000)*sizeof(int),cudamemcpyhostodevice)
同样适用于B&C,之后
MatAdd(pA,pB,pC);
cudaMemcpy(C,pC,(1000*1000)*sizeof(int),cudamemcpydevictohost)
并收到:参数无效&遇到非法内存访问非法内存访问是因为您不了解如何正确管理内核的双指针参数。这将需要一个深度副本。为简单起见,我建议将数组展平,以便它们可以用单个下标引用。如果您希望如果你有一个没有显示的代码和一个新问题,我建议发布一个新问题。
MatAdd <<<numBlocks, threadsPerBlock>>>(pA, pB, pC);