测量CUDA分配时间
Measuring CUDA Allocation time
我需要测量用new
分配正常CPU内存和调用cudaMallocManaged
之间的时间差。我们正在使用统一内存,并试图找出将事物切换到cudaMallocManaged
的折衷方案。(内核运行速度似乎慢了很多,可能是由于缺乏缓存或其他原因。(
无论如何,我不确定这些分配时间的最佳方式。boost的process_real_cpu_clock
、process_user_cpu_clock
或process_system_cpu_clock
中的一个会给我最好的结果吗?或者我应该只使用C++11中的常规系统时间调用吗?或者我应该用cudaEvent的东西来计时吗?
我认为我不应该使用cuda事件,因为它们用于计时GPU进程,而不适合计时cpu调用(如果我错了,请纠正我。(如果我可以只在mallocManaged上使用cudaEvents,那么在计时new
调用时,比较什么最准确?我只是对内存分配和时间安排了解不够。由于boost和nvidia的劣质文档,我读到的所有内容似乎都让我更加困惑。
您可以使用CUDA事件来测量在主机中执行的函数的时间。
cudaEventElapsedTime
计算两个事件之间的经过时间(以毫秒为单位,分辨率约为0.5微秒(。
更多信息,请访问:http://docs.nvidia.com/cuda/cuda-runtime-api/index.html
此外,如果您也对内核执行时间的计时感兴趣,您会发现CUDA事件API会自动阻止代码的执行,并等待直到任何异步调用结束(如内核调用(。
在任何情况下,您都应该使用相同的指标(始终是CUDA事件、升压或您自己的时间(来确保相同的分辨率和开销。
CUDA工具包附带的探查器"nvprof"可能有助于了解和优化CUDA应用程序的性能。
更多信息,请访问:http://docs.nvidia.com/cuda/profiler-users-guide/index.html
我推荐:
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() << "sn";
这将以秒为单位输出差值,表示为double
。
分配算法通常在进行过程中进行自我优化。也就是说,第一次分配通常比第二次分配更昂贵,因为在第一次分配期间会在第二次之前创建内存的高速缓存。所以你可能想把你正在计时的事情放在一个循环中,并对结果进行平均。
std::chrono::high_resolution_clock
的一些实现并不引人注目,但随着时间的推移正在改进。您可以使用评估您的实施情况
auto t0 = std::chrono::high_resolution_clock::now();
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration<double>(t1-t0).count() << "sn";
也就是说,您的实现能以多快的速度获得当前时间?如果速度较慢,则两个连续调用将显示其间的较长时间。在我的系统上(在-O3(,输出顺序为:
1.2e-07s
这意味着我可以为大约1微秒的东西计时。为了获得比这更精细的测量,我必须循环许多操作,并除以操作的数量,减去循环开销(如果这很重要的话(。
如果您对std::chrono::high_resolution_clock
的实现似乎不令人满意,那么您可以根据这一点构建自己的chrono
时钟。缺点显然是有点不便于携带。但是,您可以免费获得std::chrono
duration
和time_point
基础设施(时间算术和单位转换(。
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 多次分配内存是否一次性需要更多时间?
- C++计划持续时间内(字体)资源的分配
- 在运行时分配已发布属性的确切时间?
- 运行时间内存分配错误
- C 数组值分配时间
- 堆栈分配的确切时间
- 是否需要解除分配本地时间的内存
- C++在堆上分配相同类型的变量所花费的时间非常不同
- 拆分动态分配的数组,无需线性时间复制
- 在C++中将数据和时间分配给文件时间结构
- 静态成员变量分配时间
- 动态分配 C 字符串内存,无需先询问用户输入时间
- 放置此指针的位置以及为其分配内存的时间
- 如何在C++中检查经过的时间和分配的内存
- 具有c++标准规定的时间复杂度的操作能否动态分配内存?
- 动态内存分配会增加运行时间吗?
- 如何动态分配二维数组一行在一个时间,列是已知的在c/c++
- 在生活游戏中分配迭代时间
- 测量CUDA分配时间