这是并行计算斐波那契数列的代码。我想知道它在斐波那契数列计算过程中是如何工作的。斐波那契数列的计算需要涉及前两个值,openmp中如何保证前两个值一定已经计算过呢?如果不计算的话,它是如何工作的?
#include <omp.h>
#include <iostream>
using namespace std;
const int N = 20;
int main()
{
int i, tid;
int a[N];
a[0] = 0;
a[1] = 1;
omp_set_num_threads(4);
#pragma omp parallel shared(a) private(i, tid)
{
#pragma omp for
for (i = 2; i < N; i++) {
a[i] = a[i - 1] + a[i - 2];
printf("i = %d, I am Thread %d\n", i, omp_get_thread_num());
}
}
for (i = 0; i < N; i++)
cout << a[i] << endl;
return 0;
}
除此之外,如果我在for循环中没有使用printf语句,那么这段代码运行正确,但是如果我添加中间printf语句,最终的计算变成
我是并行计算的初学者,除了以上问题我想知道有哪些推荐的网站和书籍可以学习,非常感谢!
对不起, 该算法不能仅通过应用 OpenMP 编译指示来并行化。
正如您在问题中已经指出的那样, for i 循环遭受“循环携带依赖性”:需要之前计算 a[i-1] 和 a[i-2] 。
OpenMP 没有能力做这样的事情。