2013-12-08 97 views
0

我如何並行該功能中的OpenMP對於C並行化功能,用C的OpenMP

int zeroRow(int**A,int n) { 
int i, j, sum, num = 0; 
for(i= 0;i< n;i++) { 
    sum = 0; 
    for(j = 0; j < n; j++) { 
    sum += A[i][j]; 
    } 
if(sum == 0) { 
    num++; 
    } 
} 
return num; 
} 

我做這個檢查,如果這是正確的程序。

int zeroRow(int**A,int n) { 
int num = 0; 
#pragma omp parallel for reduction(+:num); 
for(int i= 0;i< n;i++) { 
    int sum = 0; 
    for(int j = 0; j < n; j++) { 
    sum += A[i][j]; 
    } 
    if(sum == 0) { 
    num++; 
    } 
} 
return num; 
} 

,請告訴我,如果我做了什麼是正確的或擰我一直在使用減少並行外環和一個單獨的NUM是給每個線程。

+0

好吧我沒有縮進它第一次可能出現錯誤,當我按下CTRL-K,現在我手動插入它。@ H2Co3 –

+0

看起來沒問題。有問題嗎? –

+0

看起來確實是對的,但是,如果'j'是在並行區域之外定義的(例如,在C中),那麼它肯定應該被設置爲private。 – JakubT

回答

2

看起來是正確的並行化。

您應該添加的唯一一項是指定使用A的術語。 您相信默認情況是共享的。你應該明確地命名與

#pragma omp parallel for reduction(+:num) default(shared) 

#pragma omp parallel for reduction(+:num) shared(A) 

還你不需要寫一個分號狀態(;)在pragma行的末尾(但寫這將是沒有錯誤)

+0

據我所知,在並行塊之外定義的變量默認是共享的,所以'default(shared)'和shared(A)是不必要的。唯一的例外是用於並行化循環的變量。他們是私人的 –

+0

我沒有說任何相反的事情,但是如果你依賴這個默認的默認情況,你就共享/私人狀態更容易犯錯;最安全的方式將名稱的一切,並使用默認(無) – Henkersmann