OpenMP:并行(i; ...)和i值

Jak*_* M. 0 c c++ openmp

我有一个以下并行片段:

#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所有线程,那不是我想要的.

seh*_*ehe 6

事实证明你不能.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)