Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测量CUDA分配时间_C++_C++11_Boost_Cuda - Fatal编程技术网

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将阻塞,直到内核在“注册”之前完成