c++ - (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 的工作原理有更好的理解,我可能能够更好地解释这些数据。
解决方案
推荐阅读
- sql - 确定包含 SQL 的字符串中绑定变量的数量
- javascript - Jquery Uncaught ReferenceError: i4 is not defined at HTMLButtonElement.onclick (index.html:1)
- java - 使用 IntelliJ 运行 JUnit 测试
- bash - 如何将 bash 中的某个输入映射到命令?
- javascript - 防止在点击 VuetifyJS 组合框后调用软键盘
- ios - Swift为透明导航栏创建子类
- rust - 具有对内部闭包的引用的迭代器的智能构造函数
- objective-c - 来自旧数据库的 csv 转储的 nsdate
- apache-spark - Spark 结构化流 Kinesis 数据源
- sql - Rails 中的 SQL 关系。尝试为一个表关系创建两个不同的引用。非常混乱的情况