CUDA之线程同步
- 共享内存:线程时间需要互相交换数据才能完成任务的情况并不少见,因此,必须存在某种能让线程彼此交流的机制
- 当很多线程并行工作并且访问相同的数据或者存储器位置的时候,线程间必须正确的同步
- 线程之间交换数据并不一定要需要使用共享内存,只是共享内存较快而已
1.共享内存
- 共享内存位于芯片内部,因此它比全局内存要快得多,相比没有经过缓存的全局内存访问,共享内存大约在延迟上第100倍
- 同一个块中的线程可以访问相同的一段共享内存,不同块中的线程所见到的共享内存中的内容是不相同的
- 如果某线程的计算结果在写入到共享内存完成之前被其他线程读取,那么将会导致错误。因此应该正确的控制和管理内存访问,这是由
__syncthreads()
指令完成的,该指令确保在继续执行程序之前完成对内存的所有写入操作,即同步,也被称为barrier
。barrier
的含义是块中的所有线程都将到达该代码行,然后在此等待其他线程完成,当所有线程都到达了这里之后,他们可以一起继续往下执行 - 举个例子:
#include <stdio.h>
//