计算机视觉 基于CUDA编程的入门与实践 线程及同步三
2023-09-14 09:01:35 时间
一、线程同步
对于需要线程之间互相交换数据才能完成任务的场景,必须存在某种能让线程彼此交流的机制。就需要共享内存,当很多线程并行工作并且访问相同的数据或者存储器位置的时候,线程间必须正确的同步。
不过,线程间交换数据并不一定需要使用共享内存,只是共享内存较快而已。使用全局内存同样可以。例如配合正确的同步操作或者原子操作(原子操作也支持全局内存),依然可以正确地完成任务。只是使用共享内存,很多情况下较快(延迟较低,带宽较大)而已。
为了确保并行线程协作时的正确结果,我们必须同步线程。CUDA 提供了一个简单的屏障同步原语__syncthreads()。线程的执行只有在其块中的所有线程都执行了。因此,我们可以通过在存储之后和从共享内存加载任何线程之前调用上述争用条件来避免上述争用条件。
二、共享内存
共享内存位于芯片内部,因此它比全局内存快得多。(CUDA里面存储器的快慢有两方面,一个是延迟低,一个是带宽大。这里特指延迟低),相比没有经过缓存的全局内存访问,共享内存大约在延迟上低100倍。同一个块中的线程可以访问相同的一段共享内存(注意:不同块中的线程所见到的共享内存中的内容是不相同的),这在许多线程需要与其他线程共享它们的结果的应用程序中非常有用。但是如果不同步,也可能会造成混乱或错误的结果。如果某线程的计算结果在写入到共享内存完成之前被其他线程读取,那么将会导致错误。因此,应该正确地控制或管理内存访问。这是由__syncthreads()指令完成的,该指令确保在继续执行程序之前完成对内存的所有写入操作。这也被称为barrier。barrier的含义是块中的所有线程都将到达该代码行,然后在此等待其他线
相关文章
- c# 非阻塞算法_c# – 了解非阻塞线程同步和Thread.MemoryBarrier
- goldengate双向同步_mysql数据库定时同步
- 一文带你深入理解Java多线程与高并发:Atomic类和线程同步新机制
- 共享内存同步机制_共享内存通信机制
- 多线程锁有几种类型_线程互斥和同步的区别
- 线程并发带来的安全性问题 之 同步锁(一)
- 线程并发带来的安全性问题 之 同步锁(二)
- AP3465 4-30V 输入 3A 输出同步降压驱动器
- Cubox是什么应用?如何将Cubox同步至Notion、语雀、在线文档中
- distcp 并行同步脚本
- LED车灯照明方案 过EMC EMI 4-40V 3.6A 40大功率同步降压恒流
- MySQL 到 ClickHouse 实时数据同步实操
- 时间轻松实现Linux系统NTP时间同步(linux设置ntp)
- Linux实时文件同步化解决方案(linux实时同步)
- Oracle触发器类型:实现表行数据自动同步(oracle触发器类型)
- Redis主从同步原理
- 小技巧:一招让微软 Win11 和手机日历双向同步
- MySQL 数据不同步:解决方案探索(mysql数据不同步)
- es数据实时同步到Oracle数据库(es同步到oracle)
- Redis缓存实现跨进程同步数据(redis缓存同步机制)
- c#.net多线程编程教学——线程同步
- JAVA生产者消费者(线程同步)代码学习示例