OpenCL 原子操作

原子操作在传统并行计算上也是用得非常多的技巧。例如,对一些同步原语(synchronization primitive)的实现都可能会用到原子操作。最常见的就是多个线程如果要对同一存储地址的内容进行更新,就要用到原子操作进行访存。例如,我们要对一个大数组进行求和操作,倘若我们是在一个具有双核的处理器上执行,那么我们可能会将一个核的线程执行前一半求和,另一个核上的线程执行后一半,最后将这两个结果相加。如果我们的实现是把最终结果存放在一个全局变量里,这个变量的地址对于这两个线程而言都是可获得的。那么一个线程做完一半求和之后用原子的加法操作对这个全局变量进行一次求和更新,这样,当另一个线程也用原子操作更新这个全局变量时结果是确定的。原子操作往往会对总线做一次锁步操作(lock-step),让当前总线上的访存操作能按次序进行。同时又会刷新当前Cache,使得任一线程对全局变量使用了原子操作之后,其他所有线程都可见。这样既保证了存储器访问次序,而且又能确保更新结果都能影响到各个线程,每个核心的L1 Cache都会被更新。所以,使用原子操作做同步对于执行开销而言是相当大的,但是对于需要使用更原始的阻塞当前线程执行的同步方式而言又是比较高效的。因此,当我们对某些特定数据做同步更新时,不需要使用栅栏等这种更低效的处理机制,我们可以直接对那个存储地址采用原子操作。

OpenCL C 2.0实现了C11的原子操作的子集,并且提供了非常丰富的原子操作种类,我们稍后会逐一详细讲解。不过,OpenCL 2.0之前的原子操作接口比较简单,而且与2.0版本完全不同。

赞(0)
未经允许不得转载:极客笔记 » OpenCL 原子操作
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址