回 帖 发 新 帖 刷新版面

主题:请假openmp的问题

大家好,我正在学习用openmp编程,碰到一个问题。
在并行循环中,里面会有一个判断语句,if(a) b=b+1,就是说当a为true时,b要加1,循环结束后,我想知道b的值,这在串行没问题,但是并行中我不知道b这个变量应该怎么设,应该设为private,还是public。
先谢谢了

回复列表 (共17个回复)

沙发

b如果是private那最终出来的值是无意义的. 设为public还要保证if(a) b=b+1同一时间只能被一个线程执行.

板凳

[quote]设为public还要保证if(a) b=b+1同一时间只能被一个线程执行.[/quote]
这个怎么能保证呢?有其他办法可以解决的吗

3 楼

可以用critical语句去限制的. if(a) b=b+1 这个语句本身不符合并行的要求.
如果只是b=b+1,还可以考虑用reduction语句.

4 楼


恩,好的,我再看看你说的这两个语句,谢谢你

5 楼

应该可以用atom吧?

6 楼

[em2]谢谢小爱。
那atomic和reduction有什么区别呢?哪个效率更高?这两个里面都可以指定数组吗?

7 楼

atomic是原子操作,也就是说你在if里定义了一个b=b+1的原子操作,它这样不会有加锁解锁的操作系统级的资源占用:)仅仅是硬件级的系统总线封锁而已:)效率会高很多:)

8 楼

但是atomic只能做很简单的操作,是不可以做数组操作的:)
reduction是做归约操作,也就是多个线程的数据最后集中~~~~~和atomic完全不是一个东西喔:)

9 楼

yeg001兄是论坛里的并行大拿,有啥事儿问他准没错:)哈哈:)另:您也在fortran space里?

10 楼


恩,明白了,谢谢小爱。呵呵,是啊,我也在Fortran Space里,在群里也请教过您很多问题。抱歉,评分有上限,只能给这么多了

我来回复

您尚未登录,请登录后再回复。点此登录或注册