我必須撰寫一個計算部分和的代碼:S(i) = Σ a(j)(j 從 0 到 i)。每次,我都必須在回圈中顯示 S(i)(在代碼中命名為 somme)的值,并且我必須使用 OpenMP 對其進行編碼。這是我的代碼:
#include <stdio.h>
#include <omp.h>
#define n 16
int main(void) {
int a[n] = {2,3,6,9,4,7,0,2,2,6,8,9,11,0,2,4};
int i, j, t, somme;
#pragma omp parallel num_threads(16)
#pragma omp for
for (i=0; i<n; i ){
t = omp_get_thread_num();
somme = a[0];
for (j=1; j<i 1; j ) somme = a[j];
printf("<%d>: S(%d) = %d\n", t, i, somme);
}
return 0;
}
但是,當我用 16 個執行緒運行代碼時,有些執行緒是重復的,并且這些執行緒的結果是錯誤的:
<15>: S(15) = 75
<7>: S(7) = 33
<6>: S(2) = 11
<6>: S(6) = 31
<8>: S(8) = 35
<9>: S(9) = 41
<10>: S(10) = 49
<11>: S(11) = 58
<14>: S(14) = 71
<12>: S(12) = 69
<14>: S(13) = 69
<5>: S(5) = 35
<3>: S(3) = 20
<0>: S(0) = 2
<5>: S(1) = 35
<4>: S(4) = 24
我問過我的教授,他不知道發生了什么。我不明白為什么我的代碼表現得像這樣,有人可以幫助我嗎?
uj5u.com熱心網友回復:
正如@EOF 所提到的,由于共享變數 ( i,j,t,somme),您會出現資料競爭。您必須將它們設為私有:
#pragma omp for private(i,j,t,somme)
或者,如果您在所需的最小范圍內定義變數,則效果會更好:
int main(void) {
int a[n] = {2,3,6,9,4,7,0,2,2,6,8,9,11,0,2,4};
#pragma omp parallel num_threads(16)
#pragma omp for
for (int i=0; i<n; i ){
int t = omp_get_thread_num();
int somme = a[0];
for (int j=1; j<i 1; j ) somme = a[j];
printf("<%d>: S(%d) = %d\n", t, i, somme);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/363021.html
上一篇:如何減少此C程式的令牌數量
