并行化变量声明是否有益?

时间:2018-11-22 08:54:58

标签: c openmp parallelism-amdahl

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

#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;
}

编写此代码对阿姆达尔定律有利(因此程序的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;
    }        
}

1 个答案:

答案 0 :(得分:2)

这些代码不等效:在第一种情况下,a和b是共享变量(因为共享是变量的默认行为),在第二种情况下,它们是线程专用变量,它们不在线程范围之外。平行区域。

此外,第二段代码的并行区域中的return语句是非法的,并且必须引起编译错误。

例如在此OpenMP 4.0 reference card

中看到的
  

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

包含return语句的块不是结构化块,因为它在底部没有单个出口(即,闭括号}并不是自{{1 }}是另一个。它可能不合法地遵循return指令。