我正在学习如何使用GNU C编译器6.2.1和C++来使用OpenMP,并测试了以下代码:
#include <stdio.h>
#include <omp.h>
#include <iostream>
int b=10;
int main()
{
int array[8];
std::cout << "Test with #pragma omp simd linear:\n";
#pragma omp simd linear(b)
for (int n=0;n<8;++n) array[n]=b;
for (int n=0;n<8;++n) printf("Iteration %d: %d\n", n, array[n]);
std::cout << "Test with #pragma omp parallel for linear:\n";
#pragma omp parallel for linear(b)
for (int n=0;n<8;++n) array[n]=b;
for (int n=0;n<8;++n) printf("Iteration %d: %d\n", n, array[n]);
}
在这两种情况下,我都期望得到一个从10到17的数字列表,但事实并非如此。对于
#pragma omp simd linear(b)
,它被直接忽略,只为array
中的每个值打印10。对于#pragma omp parallel for linear(b)
,程序输出10,10,12,12,14,14,16,16
。我使用
g++ -fopenmp -Wall main.cpp -o main.o
编译文件。我该如何解决这个问题?编辑:仔细阅读规范后,我发现
linear
条款将初始值覆盖为最后一个获得的值(即如果我们从b=10
开始,在第一次循环后,我们有b=17
)。然而,如果我在并行循环中添加schedule(dynamic)
,程序就可以正确运行。为什么我必须指定该参数才能正确执行?
simd
从句的linear
从句(测试代码的后一半无法在GCC上编译)。为了让b在GCC上发生变化,我使用了#pragma omp parallel for simd linear(b)
,但是每个线程内部,b的值仍然是固定的。您可以提交错误报告并向GCC团队或其他编译器开发人员组提问。 - user3528438