CUDA学习(六)

CUDA线程执行模型为两层,一层Grid,一层Block,block之间时不可以通信的,但是block里面的线程可以相互通信,逻辑层和物理层的实现,以及代码端的书写都需要好好学习

  • __syncthreads()

__syncthreads()实现了线程块内的线程同步,它保证了线程块中的所有线程都执行到同一位置。这都是线程操作所必须的内容。

只有当整个线程块走向相同分支时,才能在条件语句里面使用__syncthreads(),否则可能引起错误。另外,一个warp内的线程不用同步,也就是说,如果需要同步的线程处于同一warp中,则不需要调用__syncthreads()。

  • memory fence函数

memory fence函数用来保证线程生产的数据能够安全地被其他线程消费。

__threadfence():该线程在该语句前对全局存储器或共享存储器的访问已经全部完成,执行的结果对grid中的所有线程可见。

__threadfence_block():该线程在该语句前对全局存储器或共享存储器的访问已经全部完成,执行的结果对block中的所有线程可见。

  • kernel间通信

kernel之间的数据传递,可以通过global memory实现

而GPU之间的通信主要依靠mapped memory实现

  • GPU与CPU之间的线程同步

在CUDA主机端代码中使用cudaThreadSynchronize(),可以实现GPU与CPU线程的同步。kernel启动后控制权将异步返回,利用该函数可以确定所有设备端线程均已运行结束。

  • Volatile关键字

Volatile关键字与C++的该关键字具有相同的作用,都时保证自己的代码不被优化,每一行相关的代码都被编译为指令

  • Atom操作

当多个线程同时访问全局或共享存储器的同一位置时,保证每个线程能够实现对共享可写数据的互斥操作:在一个操作完成之前,其他任何线程都无法访问此地址

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值