【发布时间】:2018-07-18 17:19:14
【问题描述】:
我最近开始使用 gcc 探索 OpenMP。 基本上我正在执行这段代码来演示 Eratosthenes 的筛子。
void main() {
int n, iterate_limit;
printf("Enter the number limit for sieve of erathoros:");
scanf("%d", &n);
iterate_limit = (int) sqrt((double) n);
printf("iterate limit is %d\n", iterate_limit);
int primes[n], prime_index = 0;
int non_primes[n], non_prime_index = 0;
#pragma omp parallel for
for (int i = 2; i <= iterate_limit; i++) {
if (isprime(i) == 1) {
int num = i;
printf("prime is %d\n", i);
primes[prime_index] = num;
prime_index++;
num += i;
while (num < n) {
non_primes[non_prime_index] = num;
non_prime_index++;
num += i;
}
}
}
printf("primes are\n");
for (int i = 0; i < prime_index; i++) {
printf("%d\n ", primes[i]);
}
}
理想情况下,数组primes 应该包含所有要消除其倍数的数字,它适用于输入 25 或 50。但奇怪的是,当输入更大的数字(例如 99 或 125)时, primes 数组中的值与预期不同。
即使printf("prime is %d\n",i); 给出了有效的输出。
这是 125 作为输入的输出:
Enter the number limit for sieve of erathoros:125
iterate limit is 11
[New LWP 17676]
[New LWP 17677]
[New LWP 17678]
prime is 11
prime is 5
prime is 7
prime is 2
prime is 3
primes are
60
63
66
69
72
[LWP 17676 exited]
[LWP 17677 exited]
[LWP 17674 exited]
[Inferior 1 (process 17674) exited normally]
为什么我得到 60,63,66,69,72 而不是 2,3,5,7,11?
我正在运行 Ubuntu 18。
编辑:
正如Osiris 所指出的,我没有检查我的non_primes 数组中的重复项,这似乎覆盖了我的primes 数组。重复消除确实提供了一个临时解决方案。
但是由于John Bollinger 提到的数据竞争,增加输入数或增加线程数会导致不正确的结果@
【问题讨论】:
标签: c gcc parallel-processing openmp