【问题标题】:Why is the following code non-deterministic?为什么下面的代码是不确定的?
【发布时间】:2020-06-10 18:47:59
【问题描述】:

我正在复习一些面试准备问题,我在 C++ 中看到了这个问题,问为什么下面的代码是不确定的。我不知道为什么,网上似乎没有任何解释。任何帮助将不胜感激,谢谢!

void func(std::vector<int>& input) {
       static int i = 0;
       auto start = getTimestamp();
       for (auto it = input.begin(); it != input.end(); it++) {
            *it = i;
       }
       auto end = getTimestamp();
       cout << start<< end<< input.size());
   }

作为后续,另一个问题是:“getTimestamp()”如何影响计时测量?

【问题讨论】:

    标签: c++ optimization iterator timing


    【解决方案1】:

    该函数是确定性的,因为它总是以相同的方式修改其输入:它将input 归零。

    但是,进程可能会被换出,CPU 时钟上升,时钟下降,缓存可能是热的或冷的,等等。有数百个原因导致代码在另一时间运行得越来越慢。这使得每次运行所花费的时间不确定。

    由于它明确地打印出这个时间信息,它是不确定的。

    【讨论】:

    • @QuantumHoneybees:考虑现代 80x86:最好的情况是您自己拥有一个内核并获得“涡轮增压”(CPU 运行频率可能为 4.5 GHz),最坏的情况是热节流将 CPU 降频至 12.5%标称时钟(例如,可能是 400 Mhz),您与其他东西共享内核;导致仅 CPU 的最佳和最坏情况之间的性能差异“大约 20 倍”。
    • 为了让 Brendan 所说的一切更有趣,CPU 是超标量的。这意味着它会尝试一次执行多条指令。如果其中任何一个导致管道停顿,就会导致差异。在此之上添加对称多线程,另一个线程可能会导致该停顿。或者您可能会因为现代 CPU 在内部更接近多个 CPU 而导致端口停滞。
    • @QuantumHoneybees 我们可以尝试解释这一点,但 CPU 复杂性 alone 是巨大的。不包括其他系统变量,如总线锁、内存带宽、NIC 问题等。
    • 补充;有 IRQ(来自设备和其他 CPU)在“随机”时间中断,以及触发“系统管理模式”的各种事情窃取 CPU 时间。然后是整个“内存层次结构”(从 L1 缓存一直到交换空间),各种因素(NUMA、“ECC 纠错”的可能性、GPU 窃取一些 RAM 带宽)在 CPU 占用的时间上有所不同访问 RAM。然后是操作系统 - 调度程序在您的软件和其他软件之间随时切换任务,而虚拟内存则在发挥作用。
    • @QuantumHoneybees 如果您想了解这方面的信息,我建议您研究一下MOS6502Z80。电子堆栈交换可能也是一个好地方。 PIC family may interest as well
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多