2017-05-18 48 views
1

我試圖利用我的Nvidia Geforce GT 740M進行並行編程,使用OpenMP和鏗鏘3.8編譯器。如何使用OpenMP在GPU上分發團隊?

當在CPU上並行處理時,我設法得到想要的結果。但是,在GPU上處理時,我的結果幾乎是隨機數。

因此,我認爲我沒有正確地分配我的線程團隊,並且可能會有一些數據競賽。我想我必須以不同方式執行我的for循環,但我不知道錯誤可能在哪裏。

#include <stdio.h> 
#include <stdlib.h> 
#include <omp.h> 


int main(int argc, char* argv[]) 
    { 
    const int n =100; float a = 3.0f; float b = 2.0f; 
    float *x = (float *) malloc(n * sizeof(float)); 
    float *y = (float *) malloc(n * sizeof(float)); 

    int i; 
    int j; 
    int k; 

    double start; 
    double end; 
    start = omp_get_wtime(); 


    for (k=0; k<n; k++){ 
     x[k] = 2.0f; 
     y[k] = 3.0f; 
    } 


    #pragma omp target data map(to:x[0:n]) map(tofrom:y[0:n]) map(to:i) map(to:j) 
    { 

     #pragma omp target teams 
     #pragma omp distribute 
     for(i = 0; i < n; i++) { 

      #pragma omp parallel for 
      for (j = 0; j < n; j++){ 
       y[j] = a*x[j] + y[j]; 
     } 
    } 


} 


end = omp_get_wtime(); 

printf("Work took %f seconds.\n", end - start); 

free(x); free(y); 

return 0; 
} 

我想這可能與我的GPU架構有關。所以,所以我加入這個:

GPU Information

林相當新的話題,所以感謝您的幫助:)

回答

0

是的,這裏有一個比賽。不同的團隊正在讀取和寫入數組'y'的相同元素。也許你想要這樣的東西?

for(i = 0; i < n; i++) { 
    #pragma omp target teams distribute parallel for 
    for (j = 0; j < n; j++){ 
    y[j] = a*x[j] + y[j]; 
    } 
} 
+0

是的,這的確解決了我的問題,謝謝。 但如果我有一個數組'y [i] [j]'而不是'y [j]'我仍然有同樣的問題。 我的猜測是我必須改變迭代器。而不是「+ 1」,迭代GPU塊或類似的東西。但我真的不知道如何。 – Atrobbus

+0

如果你有一個數組y [i] [j]它應該是免費的。你可以發佈你的修改程序嗎? –

+0

你是對的另一個變量引起的數據競爭。現在一切正常。 – Atrobbus