同步

设备和主机之间的同步

//显式同步,阻塞直到该语句前得所有kernel调用执行完毕
cudaError_t cudaDeviceSynchronize(void);

//隐式同步
cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind);

线程块内的同步

  • 同一线程块内的同步方式有两种:
      Barriers
      Memory Fences

    __device__ void __syncthreads();
    __device__ void __threadfence_block();
    
  • Weakly-Ordered Memory Model指的是gpu对内存的写入操作未必是立即完成的,线程可能等到需要读取该段内存时,才将这之前的写入操作完成
  • 当线程同步语句包含在执行分支中时,要确保同一线程束内的所有线程都执行相同的分支,否则程序可能僵死

    if(threadIdx.x % 2 == 0) {
        __syncthreads();
    }
    else {
        __syncthreads();
    }
    
  • 实际上,memory fence支持块内同步,网格内同步,主机-设备,设备-设备同步。调用memory fence的线程会阻塞直到对应的线程集合中所有对全局内存,共享内存,页锁定内存,其他设备的全局内存的写入都完成

    void __threadfence_block();         //块同步
    void __threadfence();               //网格同步
    void __threadfence_system();        //系统同步
    

线程块之间同步

  • cuda不直接支持块间barrier,但由于同一stream中的多个kernel的执行是串行的,可以把需要块间同步的kernel分割成多个kernel,每个分割点对应一个barrier

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值