为什么一个omp线程完成而另一个无法做同样的事情?

时间:2014-03-05 09:10:59

标签: c++ c multithreading parallel-processing openmp

我正在尝试执行以下代码,并期望第一个for循环在2个线程中分割,工作正常,

第二个for循环将以“整数”执行2次,即按线程0和线程1执行,而输出不会发生。

omp_set_num_threads(2);
#pragma omp parallel
{

#pragma omp for
for(i=65;i<91;i++)
printf("%c ",i);

printf("\n\n");

//if(omp_get_thread_num()==1) //if enalbled then prints all a->z letters
{

for(i=97;i<123;i++){
printf("%c %d",i,omp_get_thread_num());
#pragma omp flush
}

}
#pragma omp barrier
}

运行1

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

a 1b 1c 1d 1e 1f 1g 1h 1i 1j 1k 1l 1m 1n 1o 1p 1q 1r 1s 1t 1u 1v 1w 1x 1y 1z 1

a 0b 0c 0d 0e 0f 0g 0h 0i 0j 0k 0l 0m 0n 0o 0pox 0r 0s 0t 0u 0v 0w 0x 0y 0z 0

运行2

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

a 0b 0c 0d 0e 0f 0g 0

a 1b 1c 1d 1e 1f 1g 1h 1i 1j 1k 1l 1h 0n 0o 0p 0r 0s 0t 0u 0v 0w 0x 0y 0z 0m 1

那么线程1不打印所有a-z的原因可能是什么? 可能会发生切换,但由于“隐含”障碍存在于并行构造的末尾  所以线程1 -thread0必须等待彼此完成。

我尝试了8-9次运行并注意到线程1始终无法打印其预期输出!

  

启用if条件thread1在每次运行时成功打印a-z(检查12次!!)

1 个答案:

答案 0 :(得分:0)

这应该可以按你的意愿运作:

OMP_SET_NUM_THREADS(2);

#pragma omp for
for(i=65;i<91;i++)
printf("%c ",i);

printf("\n\n");

#pragma omp parallel private(i)
{

for(i=97;i<123;i++)
printf("%c %d",i,omp_get_thread_num());
}