首页 > 解决方案 > (linux的)chrono::duration是否还包括线程暂停的时间?

问题描述

我目前正在将推测性和非推测性锁定与 C++ 中的 Intel TSX 和 OpenMP 进行比较。该代码使用英特尔 icpc 编译器编译为 C++17 标准并在 linux 上运行。
我正在将不同配置之间的执行时间与 chrono::duration 进行比较。然而,我的数据在运行之间非常不一致,这导致我重新考虑我测量执行时间的方法。
这是我的代码的相关部分。当我进入 for 循环时,循环的各个迭代分布在多个线程中。如果(某些)这些线程被调度程序暂停,可能需要排队等待一段时间才能获得更多的 CPU 时间,这是如何处理的?时间 chrono::duration 度量是否还包括线程被调度程序暂停的时间?

std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();

omp_lock_t lock;
omp_init_lock_with_hint(&lock, omp_lock_hint_speculative);
#pragma omp parallel for
for(int j=0; j<iterations; j++)
{
    int a=std::rand()%array_size;     //pseudo-random array location
    omp_set_lock(&lock);
    numbers[a] = numbers[a] + 1;
    omp_unset_lock(&lock);
}

end = std::chrono::system_clock::now();
cout << (end-start).count()

非常感谢你的帮助!

这是我得到的结果的更多背景。我认为这与问题并不严格相关,但也许有助于理解我的意思。

这个结果很能代表我所面临的问题: 趋势是相似的,但“传统”(即非投机性)锁定非常不一致,并且比其他锁定要慢得多。我所期望的是,非投机锁几乎保持不变,理论上它与高碰撞概率一样快,与低碰撞概率一样快。基线(无同步构造)有时是三者中最慢的,等等,还有一些不一致的地方。显然,我的测试工作量不是很复杂,也许我在这里抓住了救命稻草 - 但我说服自己,如果我对 chrono 的工作原理有更好的理解,我可能能够更好地解释这些数据。锁定 32 线程

标签: c++multithreadingschedulingchrono

解决方案


推荐阅读