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循环
这也意味着你不能从这样的循环中中断、返回。也不能直接操作循环变量。循环条件不能调用随机函数或执行任何条件表达式,简而言之:aomp 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 );
}
}