簡體   English   中英

內存性能中的存儲操作如何工作?

[英]how does store operation in memory performance work?

我正在使用這本教科書 Randal E. Bryant, David R. O'Hallaron - Computer Systems。 A Programmer's Perspective [3rd ed.] (2016, Pearson),還有一段我不太明白。

代碼:

void write_read(long *src, long *dst, long n)
{
 long cnt = n;
 long val = 0;

 while (cnt) {
  *dst = val;
  val = (*src)+1;
  cnt--;
 }
}

write_read內部循環:

#src in %rdi, dst in %rsi, val in %rax
 .L3: 
    movq %rax, (%rsi)  # Write val to dst
    movq (%rdi), %rax  # t = *src
    addq $1, %rax      # val = t+1
    subq $1, %rdx      # cnt--
    jne .L3            # If != 0, goto loop

給出這段代碼,教科書給出了這個圖來描述程序流程程序流

對於那些無法訪問 TB 的人,這是給出的解釋:

圖 5.35 顯示了此循環代碼的數據流表示。 movq %rax,(%rsi)指令被翻譯成兩個操作: s_addr 指令計算存儲操作的地址,在存儲緩沖區中創建一個條目,並設置該條目的地址字段。 s_data 操作設置條目的數據字段。 正如我們將看到的,這兩個計算獨立執行的事實對程序性能很重要。 這激發了參考機中這些操作的獨立功能單元。

除了寄存器的寫入和讀取導致的操作之間的數據依賴之外,運算符右側的弧表示這些操作的一組隱式依賴。 特別是,s_addr 操作的地址計算必須明確在 s_data 操作之前。

此外,通過解碼指令movq (%rdi), %rax生成的加載操作movq (%rdi), %rax必須檢查任何掛起的存儲操作的地址,在它和 s_addr 操作之間創建數據依賴關系。 該圖顯示了 s_data 和加載操作之間的虛線弧。 這種依賴是有條件的:如果兩個地址匹配,則加載操作必須等到 s_data 將其結果存入存儲緩沖區,但如果兩個地址不同,則兩個操作可以獨立進行。

a) 我不太清楚的是為什么在這行movq %rax,(%rsi)之后需要在s_data之后完成load 我假設當s_data時, %rax的值存儲在%rsi的地址指向的位置? 這是否意味着在每個s_data之后都需要一個load調用?

b)它並沒有真正顯示在圖中,但根據我從書中給出的解釋中所理解的, movq (%rdi), %rax這行需要它自己的一組s_addrs_data 那么說所有movq調用都需要s_addrs_data調用,然后在調用load之前檢查地址是否匹配,是否准確?

對這些部分很困惑,如果有人能解釋s_addrs_data調用如何與load s_data工作以及何時需要具有這些功能,將不勝感激,謝謝!

藍色框中的操作是由流水線的解碼器發出的微操作(也稱為 uops 或微指令)。 它們是正在執行的程序的一部分。 movq (%rdi), %rax指令被解碼到加載 uop 中。 uop 是管道中的執行單元。 Uops 沒有被調用,它們被執行

根據書中討論的假設處理器設計,像movq %rax, (%rsi)這樣的簡單存儲指令被解碼為兩個uop ,稱為s_addrs_data 這也發生在真正的 x86 處理器中。 一個宏指令可能被解碼成多個 uop 的一個原因是因為一個 uop 的格式不允許它保存指令中給出的所有信息,例如當指令有太多操作數或代表一個復雜的任務時. 另一個原因是增加指令級並行性。 存儲的地址和存儲的數據可以在不同的周期變得可用。 如果地址可用但數據不可用,則可以將s_addr uop分派到加載存儲單元,以便提前將下游加載 uop 的地址與存儲地址進行比較,而無需等待店鋪。 確定較晚加載是否取決於較早存儲的過程稱為內存消歧。 如果加載movq (%rdi), %rax不與較早的存儲movq %rax, (%rsi)重疊,則它可以立即執行,無論%rax的值是否准備就緒。

當執行s_data uop 時%rax的值存儲在分配了存儲 uop 的存儲緩沖區條目的數據字段中。 在所有較早的指令完成執行以維持程序順序之后,將值存儲在目標內存位置后發生。

書中說“s_addr 操作的地址計算必須明確在 s_data 操作之前”可能是因為,根據書中的說法s_addr uop必須先在存儲緩沖區中創建一個條目,然后才能將數據存儲在其中。 這對於假設的設計來說可能沒問題,但這是一種不必要的依賴,因為分配可以在執行之前完成。 無論如何,本書沒有討論資源分配和回收。

一個簡單的加載指令被解碼為單個加載指令。 沒有理由將負載分成多個 uops。

暫無
暫無

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

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