1

我想知道在编写并行程序以将变量声明插入并行部分时是否有益?因为阿姆达尔定律说,如果程序的更多部分是并行的,那就更好了,但我看不出并行化变量声明和返回语句的意义,例如,这是正常的并行代码:

#include <omp.h>

int main(void) {
    int a = 0;
    int b[5];

    #pragma omp parallel
    {
        #pragma omp for
        for (int i = 0; i < 5; ++i) {
            b[i] = a;
        }
    }

    return 0;
}

写这个对 Am​​dahl 定律有好处吗(所以 100% 的程序是并行的):

#include <omp.h>

int main(void) {
    #pragma omp parallel
    {
        int a = 0;
        int b[5];
        #pragma omp for
        for (int i = 0; i < 5; ++i) {
            b[i] = a;
        }

        return 0;
    }        
}
4

1 回答 1

2

这些代码是不等价的:在第一种情况下,a 和 b 是共享变量(因为 shared 是变量的默认行为),在第二种情况下,它们是不存在于并行区域范围之外的线程私有变量。

此外,return第二段代码中并行区域内的语句是非法的,必然导致编译错误。

例如在此OpenMP 4.0 参考卡中可以看到

OpenMP 可执行指令适用于后续的结构化块或 OpenMP 构造。每个指令都以#pragma omp 开头。该指令的其余部分遵循编译器指令的 C 和 C++ 标准的约定。结构化块是单个语句或复合语句,顶部有一个入口,底部有一个出口。

包含该return语句的块不是结构化块,因为它在底部没有单个出口(即右大括号}不是唯一的出口,因为return是另一个出口)。它可能不合法地遵循该#pragma omp parallel指令。

于 2018-11-22T09:25:59.433 回答