[英]Multiple nop instructions do not consistently take longer than a single nop instruction
我正在使用 rdtsc 在rdtsc
中計時多條 NOP 指令和一條 NOP 指令。 但是,我沒有得到執行 NOP 所需的周期數與執行的 NOP 數量成比例的增加。 我很困惑為什么會這樣。 我的 CPU 是 Intel Core i7-5600U @ 2.60Ghz。
這是代碼:
#include <stdio.h>
int main() {
unsigned long long t;
t = __rdtsc();
asm volatile("nop");
t = __rdtsc() - t;
printf("rdtsc for one NOP: %llu\n", t);
t = __rdtsc();
asm volatile("nop; nop; nop; nop; nop; nop; nop;");
t = __rdtsc() - t;
printf("rdtsc for seven NOPs: %llu\n", t);
}
我得到的值如下:
rdtsc for one NOP: 78
rdtsc for seven NOPs: 91
rdtsc for one NOP: 78
rdtsc for seven NOPs: 78
在未設置處理器親和性的情況下運行時。 像$ taskset -c 0./nop$
這樣設置處理器關聯時,結果是:
rdtsc for one NOP: 78
rdtsc for seven NOPs: 78
rdtsc for one NOP: 130
rdtsc for seven NOPs: 169
rdtsc for one NOP: 78
rdtsc for seven NOPs: 143
為什么會這樣?
您的結果可能是測量噪聲和/或頻率縮放,因為您在printf
從進行系統調用返回后立即啟動第二個間隔的計時器。
RDTSC 計算參考周期,而不是核心時鍾周期,因此您主要是在發現 CPU 頻率。 (較低的核心時鍾速度 = 相同數量的核心時鍾運行兩條 rdtsc 指令的參考周期更多)。 您的 RDTSC 指令基本上是背靠背的; 與 rdtsc 本身解碼到的rdtsc
數量相比, nop
指令可以忽略不計(在包括 Broadwell 在內的普通 CPU 上)。
RDTSC 也可以通過亂序執行重新排序。 並不是說nop
做任何 CPU 必須等待的事情,所以它只是將前端延遲 0.25 或 1.75 個周期,從發出第二個 rdtsc 的rdtsc
。 (實際上,我不確定微碼定序器是否可以在與來自另一條指令的 uop 相同的周期內發送 uops。所以可能是 1 或 2 個周期)。 我對如何從 C++ 獲取 x86_64 中的 CPU 周期數的回答? 有一堆關於 RDTSC 如何工作的背景。
您可能需要pause
指令。 它在 Skylake 及更高版本上閑置約 100 個周期,或在早期的 Intel 內核上閑置約 5 個周期。 或旋轉 RDTSC 。 如何計算 x86 linux 上的 asm 延遲循環的時間? 顯示了一個可能有用的延遲自旋循環,它休眠給定數量的 RDTSC 計數。 您需要知道參考時鍾速度以將其與納秒相關聯,但它通常在英特爾 CPU 上的額定最大非渦輪時鍾附近。 例如 4.0GHz Skylake 上的 4008 MHz。
如果可用, tpause
將 TSC 時間戳作為喚醒時間。 (見鏈接)。 但目前它只是低功率的 Tremont。
在具有巨大重新排序緩沖區的現代超標量/無序 x86 上,插入 NOP 永遠不會可靠地工作。 現代 x86 不是一個微控制器,您可以在其中計算嵌套延遲循環的迭代,如果周圍的代碼在前端沒有瓶頸。 OoO exec 只是要隱藏通過管道提供 NOP 的成本。
說明沒有成本,你可以加起來。 對於 model 一條指令的成本,您需要知道它的延遲、前端 uop 計數以及它需要哪些后端執行端口。 以及對管道的任何特殊影響,例如lfence
等待所有先前的 uops 退出,然后才能發出后續的 uops。 每條匯編指令需要多少個 CPU 周期?
另請參閱go 在預測現代超標量處理器上的操作延遲時的哪些考慮因素以及如何手動計算它們?
請注意,如果存在高速緩存未命中,或者甚至可能非常慢的 ALU 依賴鏈,您想要的 ~100ns 的“睡眠”時間不一定足夠長以耗盡亂序執行緩沖區(ROB)。 (后者不太可能在人工案例之外)。 所以你可能不想做像lfence
這樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.