C++ 测量CUDA分配时间
我需要测量使用C++ 测量CUDA分配时间,c++,c++11,boost,cuda,C++,C++11,Boost,Cuda,我需要测量使用new分配正常CPU内存与调用cudamalocmanaged之间的时间差。我们正在使用统一内存,并试图找出切换到cudamalocmanaged的利弊。(内核运行速度似乎慢了很多,可能是因为缺少缓存或其他原因。) 不管怎么说,我不确定对这些分配进行计时的最佳方式。boost的process\u real\u cpu\u clock,process\u user\u cpu\u clock,或者process\u system\u cpu\u clock中的一个能给我最好的结果吗?
new
分配正常CPU内存与调用cudamalocmanaged
之间的时间差。我们正在使用统一内存,并试图找出切换到cudamalocmanaged
的利弊。(内核运行速度似乎慢了很多,可能是因为缺少缓存或其他原因。)
不管怎么说,我不确定对这些分配进行计时的最佳方式。boost的process\u real\u cpu\u clock
,process\u user\u cpu\u clock
,或者process\u system\u cpu\u clock
中的一个能给我最好的结果吗?还是应该在C++11中使用常规的系统时间调用?或者我应该用cudaEvent来计时
我认为我不应该使用cuda事件,因为它们用于对GPU进程进行计时,不会准确地对cpu调用进行计时(如果我在那里出错,请纠正我)。如果我可以在mallocManaged事件上使用cuda事件,那么在对新
调用进行计时时,最准确的比较是什么?我只是对内存分配和时间不太了解。由于boost和nvidia的劣质文档,我读到的所有内容似乎都让我更加困惑。我建议:
auto t0 = std::chrono::high_resolution_clock::now();
// what you want to measure
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration<double>(t1-t0).count() << "s\n";
也就是说,您的实现能够以多快的速度获得当前时间?如果速度较慢,则连续两次呼叫将显示间隔时间较长。在我的系统(at-O3)上,输出顺序如下:
1.2e-07s
这意味着我可以计时1微秒的时间。为了得到更精细的度量,我必须循环许多操作,然后除以操作数,减去循环开销(如果这很重要的话)
如果您对std::chrono::high_resolution_clock
的实现不满意,您可以构建自己的chrono
时钟。缺点显然是有点不便于携带。但是,您可以免费获得std::chrono
duration
和time\u point
基础设施(时间算术和单位转换)。我建议:
auto t0 = std::chrono::high_resolution_clock::now();
// what you want to measure
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration<double>(t1-t0).count() << "s\n";
也就是说,您的实现能够以多快的速度获得当前时间?如果速度较慢,则连续两次呼叫将显示间隔时间较长。在我的系统(at-O3)上,输出顺序如下:
1.2e-07s
这意味着我可以计时1微秒的时间。为了得到更精细的度量,我必须循环许多操作,然后除以操作数,减去循环开销(如果这很重要的话)
如果您对
std::chrono::high_resolution_clock
的实现不满意,您可以构建自己的chrono
时钟。缺点显然是有点不便于携带。但是,您可以免费获得std::chrono
持续时间和时间点
基础设施(时间算术和单位转换)。您可以使用CUDA事件来测量在主机中执行的函数的时间
cudaEventeLassedTime
计算两个事件之间的运行时间(以毫秒为单位,分辨率约为0.5微秒)
更多信息请访问:
此外,如果您还对内核执行时间的计时感兴趣,您会发现CUDA事件API会自动阻止代码的执行,并等待任何异步调用结束(如内核调用)
在任何情况下,您都应该使用相同的指标(始终是CUDA事件或boost,或您自己的计时)来确保相同的分辨率和开销
CUDA工具包附带的探查器“nvprof”可能有助于理解和优化CUDA应用程序的性能
阅读更多信息:您可以使用CUDA事件来测量在主机中执行的函数的时间
cudaEventeLassedTime
计算两个事件之间的运行时间(以毫秒为单位,分辨率约为0.5微秒)
更多信息请访问:
此外,如果您还对内核执行时间的计时感兴趣,您会发现CUDA事件API会自动阻止代码的执行,并等待任何异步调用结束(如内核调用)
在任何情况下,您都应该使用相同的指标(始终是CUDA事件或boost,或您自己的计时)来确保相同的分辨率和开销
CUDA工具包附带的探查器“nvprof”可能有助于理解和优化CUDA应用程序的性能
阅读更多信息:我不确定cudaEvent计时器是否正常工作,因为它报告说使用new
制作阵列比使用cumalocmanaged
花费的时间长80倍,这似乎是错误的。(请注意,感谢您指出探查器。这看起来对于在分配之后安排所有时间非常有用。)您应该添加一个显示该行为的最小示例。这可能有助于获得更好的答案。如果在默认流中已经有一个(异步)内核正在执行,并且我向默认流的FIFO中添加了一个cudaEventRecord,那么cudaEvent将阻塞,直到内核完成“注册”自己,对吗?换句话说,它不会捕获内核运行时发生的CPU执行时间,对吗?我不确定cudaEvent计时器是否正常工作,因为它报告说使用new
制作阵列比使用cumalocmanaged
花费的时间要长80倍,这似乎是错误的。(请注意,感谢您指出探查器。这看起来对于在分配之后安排所有时间非常有用。)您应该添加一个显示该行为的最小示例。这可能有助于获得更好的答案。如果在默认流中已经有一个(异步)内核正在执行,并且我向默认流的FIFO中添加了一个cudaEventRecord,那么cudaEvent将阻塞,直到内核在“注册”之前完成