2013-10-12 51 views
0

在我的代碼中,我有很多片段,我有一個雙循環,我需要更新結構內的值。問題在於它是一系列結構,因此導致大量的解除分離。以下是一個示例:OpenMP最快的方式來更新結構

for(i=0;i<y;i++) { 
      for(j=0;j<x;j++) { 
       index = i*x+j; 
       y1 = (i + 1) % y; 
       x1 = (j + 1) % x; 
       y2 = (i == 0) ? (i + y - 1) : (i - 1); 
       x2 = (j == 0) ? (j + x - 1) : (j - 1); 
       str[i *x + j].arr[0] = c[index].arr[0]; 
       str[i *x + x1].arr[1] = c[index].arr[1]; 
       str[y1*x + j].arr[2] = c[index].arr[2]; 
       str[i *x + x2].arr[3] = c[index].arr[3]; 
       str[y2*x + j].arr[4] = c[index].arr[4]; 
       str[y1*x + x1].arr[5] = c[index].arr[5]; 
       str[y1*x + x2].arr[6] = c[index].arr[6]; 

      } 
    } 

我想盡可能地加快速度,也許使用OpenMP。我認爲會有很多錯誤的分享,我也不能使用指針。你們知道一個有效的方法來加速(和類似的代碼)

+2

您是否在多核系統上運行? – ryyker

+0

你嘗試了什麼? – Walter

+0

即使沒有將事情分解到多個核心,也可以進行很多小的優化,但看起來您可能已經瞭解了其中的一些核心。一個重要的原因是C在存儲數組數據的方式上本質上是行重點。這意味着X [i] [j]和X [i] [j + 1]彼此相鄰,而X [i] [j]和X [i + 1] [j]實際上不是很遠。拿走是爲了確保你的索引是通過鄰居順序訪問內存,而不是在各大洲間跳動。 – ryyker

回答

0

你有沒有嘗試過這樣的事情?

#pragma omp parallel for 
for(i=0;i<y;i++) { 
    y1 = (i + 1) % y; 
    y2 = i? i-1 : y-1; 
    for(j=0;j<x;j++) { 
     index = i*x+j; 
     x1 = (j + 1) % x; 
     x2 = j? j-1:x-1; 
     str[i *x + j].arr[0] = c[index].arr[0]; 
     str[i *x + x1].arr[1] = c[index].arr[1]; 
     str[y1*x + j].arr[2] = c[index].arr[2]; 
     str[i *x + x2].arr[3] = c[index].arr[3]; 
     str[y2*x + j].arr[4] = c[index].arr[4]; 
     str[y1*x + x1].arr[5] = c[index].arr[5]; 
     str[y1*x + x2].arr[6] = c[index].arr[6]; 

    } 
} 

我認爲會有沒有這麼多的假共享,因爲str[]只能讀取和c[]似乎線程之間良好的分離(應該有不同線程寫入緩存線很少有重疊)。只是嘗試和時間。如果它能很好地擴展,那麼虛假分享就不是問題。

+0

謝謝。我幾乎與這一變化同時發生。所以沒有多少我可以做的結構我猜。 –