2013-11-02 57 views
0

我想使用OpenMP任務乘以兩個矩陣。這是一個基本的代碼:什麼是在OpenMP中使用任務指令的正確方法

long i, j, k; 

    for (i = 0; i < N; i ++) 
     for (j = 0; j < N; j ++) 
     for (k = 0; k < N; k ++) 
      c[i * N + j] += a[i * N + k] * b[k * N + j]; 

所以,我想在列級別使用的任務,然後我修改這樣的代碼:

long i, j, k; 
#pragma omp parallel 
{ 
    #pragma omp single 
    { 
    for (i = 0; i < N; i ++) 
    #pragma omp task private(i, j, k) 
    { 
     for (j = 0; j < N; j ++) 
     for (k = 0; k < N; k ++) 

      c[i * N + j] += a[i * N + k] * b[k * N + j]; 
     } 
    } 
    } 

當我運行一個程序,我得到的消息是這樣的:

分割故障(核心轉儲)

現在,我知道我錯過了一些片,卜噸不知道它是什麼。任何想法?

回答

1

private OpenMP中的變量未初始化且具有隨機初始值。當任務執行時,i將具有隨機值,因此可能導致出現c[]a[]的出界訪問。

firstprivate變量類似於private,但它們的初始值設置爲引用變量在輸入構造時的值。在你的情況下,i必須是firstprivate而不是private

此外,建議i在並行區域製造private以實現較小的性能提升。因此,最終代碼應如下所示(所有變量共享類都在其使用範圍中聲明瞭明確的私有變量):

#pragma omp parallel shared(a, b, c) 
{ 
    #pragma omp single 
    { 
     long i; 
     for (i = 0; i < N; i++) 
     #pragma omp task shared(a, b, c) firstprivate(i) 
     { 
      int j, k; 
      for (j = 0; j < N; j++) 
       for (k = 0; k < N; k++) 
        c[i * N + j] += a[i * N + k] * b[k * N + j]; 
     } 
    } 
} 
相關問題