使用for循环时的简单openmp c++问题

问题描述 投票:0回答:1

这是并行计算斐波那契数列的代码。我想知道它在斐波那契数列计算过程中是如何工作的。斐波那契数列的计算需要涉及前两个值,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语句,最终的计算变成 enter image description here

我是并行计算的初学者,除了以上问题我想知道有哪些推荐的网站和书籍可以学习,非常感谢!

c++ visual-studio-2017 openmp
1个回答
0
投票

对不起, 该算法不能仅通过应用 OpenMP 编译指示来并行化。

正如您在问题中已经指出的那样, for i 循环遭受“循环携带依赖性”:需要之前计算 a[i-1] 和 a[i-2] 。

OpenMP 没有能力做这样的事情。

© www.soinside.com 2019 - 2024. All rights reserved.