簡體   English   中英

x86 當數據位於 2 個不同的塊中時存儲

[英]x86 store when data is in 2 different blocks

假設 linux-32:對齊規則說,例如,雙精度數(8 字節)必須對齊到 4 字節。 這意味着,如果我們假設 64 字節緩存塊(現代處理器的典型值),我們可以在第 60 個 position 中進行雙重對齊,這意味着這個雙重將在 2 個不同的緩存塊中。 甚至可能發生雙倍的兩個部分都位於位於 2 個不同的 4KB 頁面中的 2 個不同的緩存塊中。

在這個簡短的介紹將問題放在上下文中之后,我有幾個疑問:

1-對於我們尋求最大性能的匯編程序編程,建議通過放置 alignment 指令來防止這些事情發生,對吧? 或者,出於我不知道的任何原因,使 alignment 僅在 1 個塊中實現雙精度並不意味着任何性能變化?

2-在上述情況下,存儲指令將如何解碼? (假設現代英特爾微架構)。 我的意思是,我知道一個普通的存儲 x86 指令是在一對微融合的 str-addr 和 str-data 中解碼的,但是在這種情況下,涉及 2 個不同的緩存塊(甚至可能是 2 個不同的 4KB 頁),這將在 2 個微融合的 str-addr 和 str-data 對中解碼(一個用於雙精度的前 4 個字節,另一個用於最后 4 個字節)? 或者它將被解碼為單個微融合對,但必須同時執行 str-addr 和 str-data 兩次工作,直到最終能夠退出執行端口?

是的,當然你應該盡可能對齊double精度,就像編譯器一樣,除非 ABI 結構布局規則強制它們不對齊。 (ABI 是在 i386 是最新的時候設計的,所以無論如何雙倍總是需要 2 個負載。)

The current version of the i386 System V ABI requires 16-byte stack alignment, so local doubles (that have to get spilled at all instead of kept in regs) can be aligned, and malloc has to return memory suitable for any type, and alignof(max_align_t) = 16在 32 位 Linux 上(8 在 32 位 Windows 上)所以 32 位 malloc 將始終為您提供至少 16(或 8)字節對齊的 ZCD6917DZD36. 當然,在 static 存儲中,您可以使用align (NASM) 或.p2align (GAS) 指令控制 alignment。


有關高速緩存行拆分和頁面拆分的性能缺點,請參閱如何准確地對 x86_64 上的未對齊訪問速度進行基准測試


回復:解碼:地址在解碼時不知道,因此很明顯,行拆分頁面拆分的任何影響都將在稍后解決 對於存儲,在存儲緩沖區條目必須提交到 L1d 緩存之前可能無效。 在最近的英特爾上,拆分行/頁面存儲是否需要兩個存儲緩沖區條目? - 可能不,在執行存儲地址 uop 后分配第二個條目是不合理的。

對於加載,通過執行單元重新運行加載以獲得另一半(或任何不均勻的拆分),使用內部行拆分緩沖區來組合數據。 (不從 RS 重新調度,只是在加載端口內部處理。但是 RS 確實會積極地重放微指令以等待加載結果。)

為未對齊的存儲重新運行存儲數據 uop 似乎也不太可能。 我認為我們沒有看到uops_dispatched_port.port_4事件的額外計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM