我想知道编写并行程序以将变量声明插入并行部分是否有益?因为阿姆达尔定律说,如果程序的更多部分是并行的,那会更好,但是我看不到并行化变量声明和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;
}
}
答案 0 :(得分:2)
这些代码不等效:在第一种情况下,a和b是共享变量(因为共享是变量的默认行为),在第二种情况下,它们是线程专用变量,它们不在线程范围之外。平行区域。
此外,第二段代码的并行区域中的return
语句是非法的,并且必须引起编译错误。
OpenMP可执行指令适用于后续的结构化 块或OpenMP构造。每个指令均以#pragma omp开头。 该指令的其余部分遵循C和 编译器指令的C ++标准。结构化块是单个 语句或复合语句,在顶部有一个条目,并有一个 底部有一个出口。
包含return
语句的块不是结构化块,因为它在底部没有单个出口(即,闭括号}
并不是自{{1 }}是另一个。它可能不合法地遵循return
指令。