STD :: Chrono的时钟可以在不同的内核上有所不同
Can Clocks from std::chrono be different on different cores
我喜欢比较在处理器中在不同核心上运行的线程中测量的std::chrono::high_resolution_clock
的time_point
s。是否存在明显的差异,例如滞后或更快/较慢的时钟?标准指定什么?
std
时钟没有处理器亲和力,实际上,大多数线程也没有。可以从同一线程进行两个时钟测量。
与测量相关的铅和滞后 - 这与执行任何其他指令没有什么不同;通常的管道等可能会产生影响,但我不认为这有害。如果可能有害,则您可能需要考虑其他工具的其他工具,例如某些专业的平台时机工具或CPU的某种特定说明。
我将根据您的评论而专门回答此问题,即您在A 'Modern''' Intel CPU 上运行。
我还要强调,这可能是一个极富争议的讨论,因为这在很大程度上取决于CPU和主板。"现代"可以是一个非常流畅的概念:(
一般说话
"现代"英特尔CPU已结合了一些机制,以确保跨核的均匀滴答。但是,您正在运行什么操作系统也很重要。例如,某些Linux内核将由于较少的开销而使用时邮票作为其来源,并落在(现代(高精度事件计时器上,该计时器试图使时钟tick绕核心保持在整个内核中。
此外,请记住,英特尔CPU具有许多可能影响CPU时钟频率的功耗实用程序。
最佳情况假设
i将在Linux上检查 constant_tsc 标志,作为/proc/proc/cpuinfo 的一部分,因此可以假定TSC在跨核心上以固定频率运行。但是...请记住上面的变化。
有机器状态事件,例如节能和机器Hibernate,可能会导致CPU时钟频率更改。在这种情况下,需要对TSC进行重新校准,并且某些文档表明这仅在重新启动时。
建议:
针对特定芯片组和操作系统并研究特定文档。大多数OS家族都会有有关其时钟源细节的详细信息。
根据您的时间精度要求,您可能需要切换到使用
clock_gettime(CLOCK_MONOTONIC, ...);
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- CUDA内核和数学函数的显式命名空间
- 码头化的C++应用程序是否向后兼容早期的内核版本
- GCC和Clang在与__builtin_constant_p相关的static_assert方面有所不同
- C++内核出现Jupyter笔记本错误
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 内存围栏是否涉及内核
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- OpenCL 内核参数中的字符***?
- 具有可分离内核的 2D 模糊卷积
- 如何在Windows内核中获取文件大小
- 库达如何将字符**从内核复制到主机
- OpenCL 是否支持向量作为内核参数?
- pthread_spinlock是否会导致从用户空间切换到内核空间
- 如何在内核中添加包含库的路径?
- openCL 内核返回垃圾值,尽管没有错误
- OpenCL 内核计时测量 0 秒或导致 SIGABRT
- Visual Studio 如何在内核模式驱动程序项目中使用C++标准库?
- 分段错误(内核转储) C++面向对象编程
- STD :: Chrono的时钟可以在不同的内核上有所不同