主题:请假openmp的问题
wm694005136
[专家分:10] 发布于 2012-03-02 21:45:00
大家好,我正在学习用openmp编程,碰到一个问题。
在并行循环中,里面会有一个判断语句,if(a) b=b+1,就是说当a为true时,b要加1,循环结束后,我想知道b的值,这在串行没问题,但是并行中我不知道b这个变量应该怎么设,应该设为private,还是public。
先谢谢了
回复列表 (共17个回复)
沙发
yeg001 [专家分:14390] 发布于 2012-03-03 00:10:00
b如果是private那最终出来的值是无意义的. 设为public还要保证if(a) b=b+1同一时间只能被一个线程执行.
板凳
wm694005136 [专家分:10] 发布于 2012-03-03 08:08:00
[quote]设为public还要保证if(a) b=b+1同一时间只能被一个线程执行.[/quote]
这个怎么能保证呢?有其他办法可以解决的吗
3 楼
yeg001 [专家分:14390] 发布于 2012-03-03 09:45:00
可以用critical语句去限制的. if(a) b=b+1 这个语句本身不符合并行的要求.
如果只是b=b+1,还可以考虑用reduction语句.
4 楼
wm694005136 [专家分:10] 发布于 2012-03-03 10:18:00
恩,好的,我再看看你说的这两个语句,谢谢你
5 楼
cgl_lgs [专家分:21040] 发布于 2012-03-06 07:20:00
应该可以用atom吧?
6 楼
wm694005136 [专家分:10] 发布于 2012-03-06 09:38:00
[em2]谢谢小爱。
那atomic和reduction有什么区别呢?哪个效率更高?这两个里面都可以指定数组吗?
7 楼
cgl_lgs [专家分:21040] 发布于 2012-03-06 11:25:00
atomic是原子操作,也就是说你在if里定义了一个b=b+1的原子操作,它这样不会有加锁解锁的操作系统级的资源占用:)仅仅是硬件级的系统总线封锁而已:)效率会高很多:)
8 楼
cgl_lgs [专家分:21040] 发布于 2012-03-06 11:26:00
但是atomic只能做很简单的操作,是不可以做数组操作的:)
reduction是做归约操作,也就是多个线程的数据最后集中~~~~~和atomic完全不是一个东西喔:)
9 楼
cgl_lgs [专家分:21040] 发布于 2012-03-06 11:29:00
yeg001兄是论坛里的并行大拿,有啥事儿问他准没错:)哈哈:)另:您也在fortran space里?
10 楼
wm694005136 [专家分:10] 发布于 2012-03-06 12:05:00
恩,明白了,谢谢小爱。呵呵,是啊,我也在Fortran Space里,在群里也请教过您很多问题。抱歉,评分有上限,只能给这么多了
我来回复