【发布时间】:2021-12-31 12:17:48
【问题描述】:
我必须编写一个计算部分和的代码: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
我问过我的教授,他不知道发生了什么事。我不明白我的代码为什么会这样,谁能帮帮我?
【问题讨论】:
-
由于 openmp
shared变量上的数据竞争,您的程序具有未定义的行为。 -
@EOF 非常感谢,我会进一步调查!