gpt4 book ai didi

c++ - 在多线程 C++ 应用程序中测量时间

转载 作者:行者123 更新时间:2023-11-30 01:51:28 28 4
gpt4 key购买 nike

我正在使用 C++ 和 OpenMP 编写一个应用程序,我想可靠地(正确地)测量它的某些部分的执行时间。我查看了几个选项(Windows、TDM-GCC x64 4.8.1):

  1. omp_get_wprocclock 似乎可以完成这项工作,但文档(与实际行为直接矛盾)说它们测量给定进程消耗的总时间资源(即,例如,有两个工作线程的一秒算作两秒)。 “正确”的行为不是我想要的,
  2. time/difftime 分辨率不够,
  3. GetProcessTime (WinAPI) 执行时钟应该执行的操作并且是特定于平台的,
  4. QueryPerformanceCounter (WinAPI) 似乎是可行的方法,但它是特定于平台的,
  5. C++11 high_resolution_clock 工作正常,但它是新标准的一部分。

我的问题主要是:从事科学计算的人是如何做到这一点的,为什么要那样做?而且,clock 的行为是我在标准库实现中的一个错误还是一个太普遍的误解?

编辑:小解释:我对使用 C++11 有点犹豫,因为我可能会在带有一些旧软件的集群上运行我的代码。

最佳答案

直接从我当前的研究项目中复制:

#include <chrono>
#include <type_traits>

/** @brief Best available clock. */
using clock_type = typename std::conditional<
std::chrono::high_resolution_clock::is_steady,
std::chrono::high_resolution_clock,
std::chrono::steady_clock>::type;

为了公平起见,我们希望衡量挂起时间,而不是用户空间 CPU 周期,并且还要考虑多线程开销。不幸的是,许多实现将 high_resolution_clock 定义为 real_time_clock 的别名,这会破坏我们的结果,以防在我们的测量期间调整系统时间。

是的,std::chrono 是一个 C++11 特性,但如果这像您所说的那样是研究,是什么阻止您使用最现代的编译器?您不需要在可能存在于客户某个尘土飞扬的地下室某处的最奇怪的平台上编译您的代码。无论如何,如果你不能拥有 C++11,你可以轻松地自己实现这些时钟。它们(至少在 GNU libstdc++ 中)只是 clock_gettime 的薄包装器.

关于c++ - 在多线程 C++ 应用程序中测量时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26141484/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com