CUDA简介——同步

1. 引言

前序博客:

  • CUDA简介——基本概念
  • CUDA简介——编程模式
  • CUDA简介——For循环并行化
  • CUDA简介——Grid和Block内Thread索引
  • CUDA简介——CUDA内存模式

CUDA简介——同步_第1张图片

本文重点关注Thread同步和Barriers。

Threads并行执行,可能存在如下问题:

  • 1)Race condition条件竞争:Thread A会在Thread B写入结果之前,读取某地址的值。

为此,需要引入Thread同步机制:

  • 强迫一部分Device代码顺序执行,以强迫同一Block内的Threads同步。
    具体可为:
    • 1)实现Explicit Barrier:Barrier为Kernel内某个point,在该point,Block内所有Threads会stop并相互等待。当Block内所有Threads都到达该Barrier时,会继续各自执行。
      具体实现方式为:__syncthreads();
      CUDA简介——同步_第2张图片
      CUDA简介——同步_第3张图片
      CUDA简介——同步_第4张图片

以数组左移为例:

  • 由于a[i]=a[i+1]为读写操作,需确保a[i]先读后写。为此,需引入名为temp的register。并__syncthreads;等待所有读取操作完成。
  • 为确保所有位移操作均已结束,再返回位移后的结果,需__syncthreads;等待所有写操作完成。

CUDA简介——同步_第5张图片

除此之外,还可实现Kernel launches间的Implicit Barrier:

  • Host代码并不会等待Device代码执行结束返回后,再继续执行后续Host代码。即Host代码和Device代码是异步执行的。
  • 为让Host代码等待kernel执行完成,需使用关键字:cudaDeviceSynchronize()。这样,Host代码会暂停,直到前一kernel执行完成。
    CUDA简介——同步_第6张图片

不过,若连续启动2个kernel,则确保第二个kernel无法分配grid到device中执行,其implicitly需等待第一个kernel执行结束后,才会执行第二个kernel。
CUDA简介——同步_第7张图片

参考资料

[1] Intro to CUDA (part 6): Synchronization

你可能感兴趣的:(基础理论,基础理论)