在单核多线程程序中,对临界变量以及临界区的访问,是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。
本文通过测试代码展示了在OpenMP环境下使用原子指令处理临界变量的重要性,阐述了不使用原子指令可能导致的问题及结果不确定性,并解释了原子指令如何帮助实现更准确、稳定的多线程计算。
1769

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



