假设 L1 和 L2 缓存请求导致未命中,处理器是否会停止运行,直到访问主内存为止?
我听说过切换到另一个线程的想法,如果是的话,用什么来唤醒停滞的线程?
现代 CPU 中会同时发生很多很多事情。当然,任何需要内存访问结果的事情都无法进行,但可能还有很多事情要做。假设有以下 C 代码:
double sum = 0.0;
for (int i = 0; i < 4; ++i) sum += a [i];
if (sum > 10.0) call_some_function ();
并假设读取数组 a 停止。由于读取 a[0] 会停止,因此加法 sum += a[0] 将停止。然而,处理器继续执行其他指令。就像增加 i、检查 i 10.0)”。
此时处理器不知道 sum 是什么。然而,它可以根据之前分支中发生的情况猜测结果,并开始推测性地执行函数 call_some_function ()。所以它继续运行,但要小心:当 call_some_function () 将东西存储到内存时,它还没有发生。
经过许多周期后,最终读取 [0] 成功。当发生这种情况时,它将被添加到 sum,然后一个 [1] 将被添加到 sum,然后一个 [2],然后一个 [3],然后比较 sum > 10.0 将正确执行。那么分支的决定将被证明是正确的还是错误的。如果不正确,则 call_some_function () 的所有结果都将被丢弃。如果正确,则call_some_function()的所有结果都从推测结果转变为真实结果。
如果停顿时间太长,处理器最终将无事可做。它可以轻松处理无法执行的四次加法和一次比较,但最终它太多了,处理器必须停止。然而,在超线程系统上,您有另一个线程可以继续愉快地运行,并且以更高的速度运行,因为没有其他人使用该核心,因此整个核心仍然可以继续做有用的工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)