C++ OpenMP:并行用于(i;…)和i值

C++ OpenMP:并行用于(i;…)和i值,c++,c,openmp,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

我有一个类似的片段:

#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 ); 
    }
}
而我得到的是:

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

如何使
i
保持上一次迭代的值
lastprivate(i)
为所有线程生成
i=10
,这不是我想要的。

事实证明你不能。OpenMP改变了程序语义

编译器根据定义良好的规则集重写并行for循环

这也意味着你不能从这样的循环中中断、返回。也不能直接操作循环变量。循环条件不能调用随机函数或执行任何条件表达式,简而言之:a
omp parallel for
loop不是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 ); 
    }
}
#包括
#包括“stdio.h”
int main()
{
omp_设置_数量_线程(4);
#pragma-omp并行
{
int i;
#pragma omp for
对于(i=0;i<10;i++){
printf(“A%d:%d\n”,omp\u get\u thread\u num(),i);
}
#pragma-omp-critical
printf(“i%d:%d\n”,omp\u get\u thread\u num(),i);
}
}

多亏了sehe的帖子,我想出了以下解决问题的肮脏伎俩

    int i, last_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);
            last_i = i;
        }
#pragma omp critical
        printf("i  %d: %d\n", omp_get_thread_num(), last_i ); 
    }
}
int i,last_i;
#pragma omp并行专用(i)
{
#pragma omp for
对于(i=0;i<10;i++){
printf(“A%d:%d\n”,omp\u get\u thread\u num(),i);
last_i=i;
}
#pragma-omp-critical
printf(“i%d:%d\n”,omp\u get\u thread\u num(),last\u i);
}
}

你能解释一下你想用这些信息做什么吗?OpenMP中的私下<代码>指令在C++和现代C中是完全没有用的。只需在并行块中声明你的私有变量,就没有理由不这样做了。我刚刚意识到,实际上我可能不需要它:)但是,我学到了一些关于
并行的东西!
    int i, last_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);
            last_i = i;
        }
#pragma omp critical
        printf("i  %d: %d\n", omp_get_thread_num(), last_i ); 
    }
}