在单核多线程程序中,经常需要同步多个线程以完成任务,在这个过程中有的线程会被挂起。在OpenMP中,为了同步各个线程,需要使用barrier。
测试代码:
void testBarrier()
{
omp_set_num_threads( 4 );
#pragma omp parallel
{
printf("test OpenMP 1/n");
#pragma omp barrier
printf("test OpenMP 2/n");
}
}
运行结果为:
test OpenMP 1
test OpenMP 1
test OpenMP 1
test OpenMP 1
test OpenMP 2
test OpenMP 2
test OpenMP 2
test OpenMP 2
如果没有使用barrier,
void testBarrier()
{
omp_set_num_threads( 4 );
#pragma omp parallel
{
printf("test OpenMP 1/n");
//#pragma omp barrier
printf("test OpenMP 2/n");
}
}
运行结果为:
test OpenMP 1
test OpenMP 2
test OpenMP 1
test OpenMP 2
test OpenMP 1
test OpenMP 2
test OpenMP 1
test OpenMP 2
所以,当使用了barrier后,只用所有的thread执行了barrier所在处之前的最近的parrallel region代码后,
barrier之后的代码才会被执行。
本文通过示例对比了在OpenMP程序中使用barrier前后的执行结果差异,阐述了barrier指令如何确保所有线程同步到达某个点,进而使得后续代码能够按预期顺序执行。
370

被折叠的 条评论
为什么被折叠?



