5

今天我對並行編程課的教授有了一個不同的理解,關於什麼是「虛假分享」。我的教授說的沒什麼意義,所以我馬上指出了。她認爲「虛假分享」會導致程序結果出現錯誤。什麼是「虛假分享」?如何重現/避免它?

我說過,當不同的內存地址分配給同一個緩存行時發生「錯誤共享」,將數據寫入其中一個會導致另一個緩存被踢出緩存。如果處理器在兩個虛假共享地址之間寫入並轉向,則它們都不能停留在高速緩存上,因此所有的操作都將導致DRAM的存取。

這是我目前爲止的意見。事實上,我並不確定我所說的是什麼......如果我有誤解,請指出。

所以有一些問題。緩存被假定爲64字節對齊,4路組關聯。

  1. 是否有可能由兩個以上的64字節分隔的地址是「假分享」?
  2. 單線程程序是否可能遇到「錯誤共享」問題?
  3. 重現「錯誤分享」的最佳代碼示例是什麼?
  4. 一般來說,應該注意避免程序員「虛假分享」?

回答

2

我會在你的問題上分享我的觀點。

  1. 兩個地址之間的字節數大於塊大小,不會駐留在完全相同的緩存行上。因此,如果核心在其緩存中具有第一個地址,而另一個核心請求第二個地址,則由於該請求,第一個地址不會從緩存中移除。所以不會發生錯誤的分享錯誤。

  2. 我無法想象在沒有併發的情況下會發生錯誤共享,因爲除了單線程來競爭緩存行之外,沒有其他任何人。

  3. here採取使用OpenMP,一個簡單的例子來重現錯誤共享將是:

    double sum=0.0, sum_local[NUM_THREADS]; 
    
    #pragma omp parallel num_threads(NUM_THREADS) 
    { 
        int me = omp_get_thread_num(); 
        sum_local[me] = 0.0; 
    
        #pragma omp for 
        for (i = 0; i < N; i++) 
         sum_local[me] += x[i] * y[i]; 
    
        #pragma omp atomic 
        sum += sum_local[me]; 
    } 
    
  4. 一些一般指出,我能想到的,以避免錯誤共享將是:

    a。儘可能使用私人數據。

    b。有時您可以使用padding來調整數據,以確保其他變量不會駐留在共享數據所在的同一緩存中。

歡迎任何更正或補充。