我有一个以下并行片段:
#include <omp.h>
#include "stdio.h"
int main()
{
omp_set_num_threads(4);
int i;
#pragma omp parallel private(i)
{
#pragma omp for
for(i = 0;i < 10; i++) {
printf("A %d: %d\n", omp_get_thread_num(),i);
}
#pragma omp critical
printf("i %d: %d\n", omp_get_thread_num(), i );
}
}
Run Code Online (Sandbox Code Playgroud)
我认为在循环之后,每个线程将i等于i线程循环中的最后一个值.我想要的输出是:
A 0: 0
A 0: 1
A 0: 2
A 3: 9
A 2: 6
A 2: 7
A 2: 8
A 1: 3
A 1: 4
A 1: 5
i 0: 3
i 3: 10
i 2: 9
i 1: 6
Run Code Online (Sandbox Code Playgroud)
而我得到的是:
A 0: 0
A 0: 1
A 0: 2
A 3: 9
A 2: 6
A 2: 7
A 2: 8
A 1: 3
A 1: 4
A 1: 5
i 0: -1217085452
i 3: -1217085452
i 2: -1217085452
i 1: -1217085452
Run Code Online (Sandbox Code Playgroud)
如何i保持最后一次迭代的价值?lastprivate(i)让i = 10所有线程,那不是我想要的.
事实证明你不能.OpenMP改变了程序语义.
编译器根据明确定义的规则集重写并行for循环.
这也意味着你不能打破,从这样的循环返回.您也不能直接操作循环变量.循环条件不能调用随机函数或做任何条件表达式,总之:一个omp parallel for环是不 for循环
#include <omp.h>
#include "stdio.h"
int main()
{
omp_set_num_threads(4);
#pragma omp parallel
{
int i;
#pragma omp for
for(i = 0;i < 10; i++) {
printf("A %d: %d\n", omp_get_thread_num(),i);
}
#pragma omp critical
printf("i %d: %d\n", omp_get_thread_num(), i );
}
}
Run Code Online (Sandbox Code Playgroud)