cudaEventRecord() 在 Visual Studio CPU 代码上计时不正确

标签 c windows visual-studio-2013 time cuda

在做 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 代码计时方法),所以我不想知道如何修复它,但更多的是为什么会发生这种情况。

最佳答案

据我了解,CUDA 事件本身并不是为了测量仅 CPU(仅主机)时间,而是为了测量内核执行和 CUDA API 调用。来自 CUDA C Programming Guide 3.2.5.6. 事件(强调我的):

The runtime also provides a way to closely monitor the device's progress, as well as perform accurate timing, by letting the application asynchronously record events at any point in the program and query when these events are completed.

我也很惊讶你有时间(内核启动是异步的),因为你的代码缺少cudaEventSynchronize():

cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedTime, start, stop);

另请参阅How to Implement Performance Metrics in CUDA C/C++ .

有关仅 CPU 的时间测量,请参阅 this thread .

编辑:

要获得 matrixMultCPU() 的正确时间,您需要为 start 事件添加同步:

cudaEventRecord(start, 0);
cudaEventSynchronize(start);

关于cudaEventRecord() 在 Visual Studio CPU 代码上计时不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31046158/

相关文章:

windows - 在 Windows 上使用 cabal 安装 pango 和 GIO 时,CULLong 类型的构造函数不可见

.net - 有没有一种方法可以在VS2013中设置默认解决方案.runsettings文件?

c - C 中接受字符串和 "filters out"所有非数字字符以及除第一个点之外的所有字符的函数?

c - 使用 C 代码的排列函数

c printf pretty-print 格式

c++ - 使用 Visual Studio 构建 Google V8

visual-studio - 每次进行临时更改时,如何阻止 Visual Studio 询问是否要保存解决方案文件?

c - C语言中指针的使用和赋值

C++访问DLL加载

c - Windows CE - SetPowerRequirement() - CPU 名称?