這是loop-carried dependencies一個循環的示例,並且因此不能被容易地作爲並行寫入,因爲任務(循環的每次迭代)不是獨立的。打破依賴可以從一個微不足道的修改到完全不可能的 (例如迭代循環)。
在這裏,情況是介於兩者之間。並行執行此操作的問題在於,您需要在您的鄰居改變該值之前找出最右邊的值。構造的OMP不會向您公開哪些循環迭代值是「您的」,因此我不認爲您可以使用OpenMP作爲工作共享構造來分解循環。但是,你可以自己做;但是它需要更多的代碼,並且它不會很好地減少到系列案例。
但是,如何做到這一點的例子如下所示。你必須自己打破環路,然後獲得最正確的價值。 OpenMP屏障確保沒有人開始修改值,直到所有線程緩存了其最新的最右邊值。
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(int argc, char **argv) {
int i;
char *array;
const int n=27;
array = malloc(n * sizeof(char));
for (i=0; i<n-1; i++)
array[i] = 'A'+i;
array[n-1] = '\0';
printf("Array pre-shift = <%s>\n",array);
#pragma omp parallel default(none) shared(array) private(i)
{
int nthreads = omp_get_num_threads();
int tid = omp_get_thread_num();
int blocksize = (n-2)/nthreads;
int start = tid*blocksize;
int end = start + blocksize - 1;
if (tid == nthreads-1) end = n-2;
/* we are responsible for values start...end */
char rightval = array[end+1];
#pragma omp barrier
for (i=start; i<end; i++)
array[i] = array[i+1];
array[end] = rightval;
}
printf("Array post-shift = <%s>\n",array);
return 0;
}
我有類似的問題,任何人都可以幫忙嗎?! – 2011-05-17 12:20:42