【CUDA学习】__syncthreads的理解
2018-03-09 02:21
155 查看
__syncthreads()是cuda的内建函数,用于块内线程通信.__syncthreads() is you garden variety thread barrier. Any thread reaching the barrier waits until all of the other threads in that block also reach it. It isdesigned for avoiding race conditions when loading shared memory, and the compiler will not move memory reads/writes around a __syncthreads().其中,最重要的理解是那些可以到达__syncthreads()的线程需要其他可以到达该点的线程,而不是等待块内所有其他线程。一般使用__syncthreads()程序结构如下:
这种结构块内所有线程都会到达__syncthreads(),块内线程同步.
这种结构将块内线程分成两部分,每一部分对共享存储器进行些操作,并在各自部分里同步.这种结构空易出现的问题是若两部分都要对某一地址的共享存储器进行写操作,将可能出现最后写的结果不一致错误.要让错误不发生需要使用原子操作.
这种结构,块内只有部分线程对共享存储器做处理,并且部分线程是同步.那些不满足if条件的线程,会直接执行后面的语句.若后面的语句里面和if里面的语句都对共享存储器的同一地址进行写操作时将会产生wait forever。若没有这种情况出现,程序则可以正常执行完.在使用if condition 和__syncthreads(),最好使用第一结构,容易理解,不容易出错~
1 __share__ val[]; 2 ... 3 if(index < n) 4 { 5 if(tid condition) 6 { 7 do something with val; 8 } 9 __syncthreads(); 10 do something with val; 11 __syncthreads(); 12 }
这种结构块内所有线程都会到达__syncthreads(),块内线程同步.
1 __share__ val[]; 2 ... 3 if(index < n) 4 { 5 if(tid condition) 6 { 7 do something with val; 8 __syncthreads(); 9 } 10 else 11 { 12 do something with val; 13 __syncthreads(); 14 } 15 }
这种结构将块内线程分成两部分,每一部分对共享存储器进行些操作,并在各自部分里同步.这种结构空易出现的问题是若两部分都要对某一地址的共享存储器进行写操作,将可能出现最后写的结果不一致错误.要让错误不发生需要使用原子操作.
1 __share__ val[]; 2 .... 3 if(index < n) 4 { 5 if(tid condition) 6 { 7 do something with val; 8 __syncthreads(); 9 } 10 do something with val; 11 }
这种结构,块内只有部分线程对共享存储器做处理,并且部分线程是同步.那些不满足if条件的线程,会直接执行后面的语句.若后面的语句里面和if里面的语句都对共享存储器的同一地址进行写操作时将会产生wait forever。若没有这种情况出现,程序则可以正常执行完.在使用if condition 和__syncthreads(),最好使用第一结构,容易理解,不容易出错~
相关文章推荐
- 【CUDA学习】__syncthreads的理解
- 【CUDA开发】__syncthreads的理解
- CUDA学习:进一步理解块、线程
- CUDA系列学习(六) 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现
- CUDA 学习(二)、使用GPU理解并行计算
- 【并行计算-CUDA开发】__syncthreads的理解
- 深入理解Java虚拟机-学习笔记
- 学习计划, -VB delphi 进行简单的编程理解
- 【LVL1_6_c】 指针数组 数组指针 的区别(仅仅是初步学习理解)
- 【机器学习基础】理解为什么机器可以学习2——Hoeffding不等式
- Java程序员的C#学习笔记(关于.NET的理解)
- 更好的理解一门语言是学习其他语言
- KJFrameForAndroid框架学习----深入理解注解原理
- JS 学习笔记--理解闭包
- 设计模式之原型模式学习理解
- Java学习笔记之深入理解动态绑定和静态绑定
- Spring学习——IOC和AOP的理解
- 学习AOP之透过Spring的Ioc理解Advisor
- JMeter学习(七)聚合报告之 90% Line 正确理解
- 学习Python:深刻理解Python中的元类(metaclass)