为什么一个omp线程完成,而另一个却不能完成

why one omp thread completes while other unable to do same?

本文关键字:另一个 不能 线程 omp 一个 为什么      更新时间:2023-10-16

我正在尝试执行以下代码,并期望第一个for循环被划分为两个线程,这两个线程运行良好,

第二个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("nn");
//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

一个1b 1c 1d 1e 1f 1g 1h 1i 1j 1l 1m 1n 1o 1q 1r 1t 1u 1v 1w 1y 1z 1

a 0b 0c 0d 0e 0g 0h 0i 0j 0k 0l 0n 0o 0p 0q 0r 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

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

那么线程1没有打印所有a-z的原因是什么呢?转换可能发生,但由于"隐含"屏障存在于并行结构的末尾因此线程1和线程0必须等待彼此完成。

我尝试了8-9次运行,注意到线程1总是无法打印预期的输出!

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

这应该可以随心所欲地工作:

omp_set_num_threads(2);

#pragma omp for
for(i=65;i<91;i++)
printf("%c ",i);
printf("nn");
#pragma omp parallel private(i)
{
for(i=97;i<123;i++)
printf("%c %d",i,omp_get_thread_num());
}