我正在尝试执行以下代码,并期望第一个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
}
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
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次!!)
答案 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());
}