在单核多线程程序中,对临界变量以及临界区的访问,是atomic方式的。在OpenMP中,由于是多个thread共同负责完成一个任务,所以必然有访问操作(回写)
同一个变量的情形,OpenMP引入atomic directive应对这种情形。
测试代码:
void testAtomic()
{
omp_set_num_threads( 4 );
int sum = 0;
#pragma omp parallel for
for(int i = 1; i <= 100; i++)
#pragma omp atomic
sum += i;
printf("sum = %d/n", sum);
}
测试结果:
sum = 5050
如果不使用atomic
void testAtomic()
{
omp_set_num_threads( 4 );
int sum = 0;
#pragma omp parallel for
for(int i = 1; i <= 100; i++)
//#pragma omp atomic
sum += i;
printf("sum = %d/n", sum);
}
那么结果是不对的,而且每次运行的结果可能不同。这种现象的原因跟单核多线程临界变量是相同的。这样看来,单核多线程的理论可以帮助更好更快的
理解OpenMP。
本文通过对比使用与未使用atomic指令的情况,展示了在OpenMP并行环境中如何正确地处理共享变量,以避免出现竞态条件导致的结果不一致问题。
370

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



