不支持全局的同步,这该如何是好?

netxuning 2014-12-15 11:14:17
barrier只保证group这一级同步,在需要全局内存都达到一致后才能进行下一步的操作时,该如何是好?有没有什么解决办法?
...全文
558 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenny_chen 2015-05-08
  • 打赏
  • 举报
回复
引用 6 楼 DigBug 的回复:
前几天刚做了AMD平台上的全局同步点,如果你想要,可以做,限制多多: 1、算好workgroup数,保证不能大于所有CU的active workgroup数。如果超过,死锁。 2、版主那个文章建议看看,但在AMD GCN架构下,无法实现lock-free的实现。必须使用actomic_cmp或atomic_cmpch等原子操作保证绕过cache。 3、lock-free的那个操作,在AMD非GCN和NV上似乎都过了。但我没看到OCL标准对volatile语义定义,所以不能保证每次volatile都能绕过cache,因此,lock-free可能是个机会主义者的实现。 4、其他哥们说的都挺好,其实原理很简单,自己想想就出来了。
volatile本身只是告诉这个编译器,其修饰的变量会被其它线程(工作项)修改,以至于编译器会生成绝对使用访存的操作,而不是寄存器访问的操作。但是编译器不会生成与存储器次序相关或者生成使用原子操作的代码,因为这些开销过大。 所以如果要使用原子操作或memory barrier的操作得自己显式调用相关的内建函数。
DigBug 2015-01-20
  • 打赏
  • 举报
回复
前几天刚做了AMD平台上的全局同步点,如果你想要,可以做,限制多多: 1、算好workgroup数,保证不能大于所有CU的active workgroup数。如果超过,死锁。 2、版主那个文章建议看看,但在AMD GCN架构下,无法实现lock-free的实现。必须使用actomic_cmp或atomic_cmpch等原子操作保证绕过cache。 3、lock-free的那个操作,在AMD非GCN和NV上似乎都过了。但我没看到OCL标准对volatile语义定义,所以不能保证每次volatile都能绕过cache,因此,lock-free可能是个机会主义者的实现。 4、其他哥们说的都挺好,其实原理很简单,自己想想就出来了。
outstander 2015-01-14
  • 打赏
  • 举报
回复
1.最简单的方法,在同步点退出kernel回到host端用clfinish同步。再启动kernel继续计算。缺点是开销极大。 2.其次可以用global int变量做计数器,每个到达同步点的线程进行原子加。每个线程再while循环等待计数器达到线程数后再继续运行。这个方法可以进一步用树形分布计数器进行改进,减少原子操作冲突,但依然比较慢。 3.采用无锁的全局同步,将全局同步转化为group或block内部的同步问题。请参加IPDPS 2010的论文:Inter-Block GPU Communication via Fast Barrier Synchronization .http://synergy.cs.vt.edu/pubs/papers/xiao-ipdps2010-gpusync.pdf
zenny_chen 2014-12-17
  • 打赏
  • 举报
回复
引用 3 楼 netxuning 的回复:
我现在在考虑,将整个矩阵读进各自group的__local当中,然后用barrier进行同步。但问题又来了,一个矩阵主元位置的值几乎是全局的所有work item都要取得的,其它goup的work item没有办法取到别的group的某个值吧?
如果要针对所有group,那么只能动用全局存储空间了~
netxuning 2014-12-16
  • 打赏
  • 举报
回复
引用 2 楼 zenny_chen 的回复:
可以考虑使用mem_fence接口。这个是对存储器事务进行同步的。 Orders loads and stores of a work-item executing a kernel. This means that loads and stores preceding the mem_fence will be committed to memory before any loads and stores following the mem_fence. 如果你真的要做到global的线程执行同步,那么可以考虑barrier与原子操作相结合进行解决。当然,对全局work-item进行同步的代价相对而言还是比较高昂的。
谢谢,我现在在实现部分主元法解方程组。处理一个m*n矩阵的时候,就分配2维的m*n个work items, 当中间遇到要进行行交换的时候,我的做法是用其中n个work-items去交换两行,这会导致有的work item快,有的work item慢,最后全局数据不同步,出现问题。我用了barrier,没效果的。 我现在在考虑,将整个矩阵读进各自group的__local当中,然后用barrier进行同步。但问题又来了,一个矩阵主元位置的值几乎是全局的所有work item都要取得的,其它goup的work item没有办法取到别的group的某个值吧?
zenny_chen 2014-12-15
  • 打赏
  • 举报
回复
可以考虑使用mem_fence接口。这个是对存储器事务进行同步的。 Orders loads and stores of a work-item executing a kernel. This means that loads and stores preceding the mem_fence will be committed to memory before any loads and stores following the mem_fence. 如果你真的要做到global的线程执行同步,那么可以考虑barrier与原子操作相结合进行解决。当然,对全局work-item进行同步的代价相对而言还是比较高昂的。
清风水岸 2014-12-15
  • 打赏
  • 举报
回复
可以使用全局的atom_inc结合全局变量达到效果。具体可参照http://www.cocoachina.com/bbs/read.php?tid=37608这个帖子中的内容

608

社区成员

发帖
与我相关
我的任务
社区描述
异构开发技术
社区管理员
  • OpenCL和异构编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧