【发布时间】:2015-09-11 19:30:14
【问题描述】:
在做一些由 NVIDIA 制作的 CUDA 基本示例时,我复制了一些代码来测试从 CPU 到 GPU 计算的矩阵乘法加速。
查看结果 30 分钟后,看到我的 CPU(是的 CPU)的计算速度比我的 GPU 快 1000 倍,我意识到计时工作不正确。代码片段如下(这是来自 NVIDIA 的代码):
//Create timers
cudaEvent_t start;
cudaEvent_t stop;
float simpleKernelTime;
float optimisedKernelTime;
//start timer
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
matrixMultKernel<<<grid, block >>>(a_d, b_d, c_d, N);
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedTime, start, stop);
// Print time and do other things
cudaEventRecord(start, 0);
matrixMultCPU(a_h, b_h, d_, N);
cudaEventRecord(stop, 0)
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedTime, start, stop);
// Print time
这段代码在 Linux 机器上运行良好(我复制了与我旁边的人相同的代码,他得到了很好的时机)但在装有 Visual Studio 2013 的 Windows 8 机器上,CPU 部分的时间(下半场)剪断的)不起作用(总是给出〜0.003ms)。
为什么会发生这种情况?我使用<time.h> 修复了它(删除cudaEventRecord() 调用并使用标准C 代码计时方法),所以我不想知道如何修复它,但更多的是为什么会发生这种情况。
【问题讨论】:
-
@buttifulbuttefly nononono,我删除了
cudaEventRecord调用并使用标准 C 时序。 -
关于近距离投票:“这段代码正在工作,我知道如何让它正常工作。我不是在寻求代码调试帮助,这是一个很好的理论问题,我相信。
-
在 Linux 和 Windows 上,TCC 驱动程序工作直接从驱动程序提交到 GPU 推送缓冲区。在 Windows 上,WDDM 驱动程序工作被提交到软件队列中。当此溢出时,工作将在命令缓冲区中提交给 WDDM 内核模式驱动程序,并且驱动程序将完整的命令缓冲区提交给 GPU。如果您在 cudaEventRecord(start...) 之后添加调用 cudaEventQuery(0),您应该会看到更接近 Linux 的行为,因为这将刷新队列。也就是说,不要使用 cudaEventRecord 或时钟来计时 CPU 时钟。使用平台高精度计时器。
标签: c windows visual-studio-2013 time cuda