版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.10.06 星期六 |
前言
很多做视频和图像的,相信对这个框架都不是很陌生,它渲染高级3D图形,并使用GPU执行数据并行计算。接下来的几篇我们就详细的解析这个框架。感兴趣的看下面几篇文章。
1. Metal框架详细解析(一)—— 基本概览
2. Metal框架详细解析(二) —— 器件和命令(一)
3. Metal框架详细解析(三) —— 渲染简单的2D三角形(一)
4. Metal框架详细解析(四) —— 关于GPU Family 4(一)
5. Metal框架详细解析(五) —— 关于GPU Family 4之关于Imageblocks(二)
6. Metal框架详细解析(六) —— 关于GPU Family 4之关于Tile Shading(三)
7. Metal框架详细解析(七) —— 关于GPU Family 4之关于光栅顺序组(四)
8. Metal框架详细解析(八) —— 关于GPU Family 4之关于增强的MSAA和Imageblock采样覆盖控制(五)
About Threadgroup Sharing - 关于线程组共享
了解增强的内存模型,该模型允许在线程之间灵活高效地共享数据。
Overview - 概览
A11上的Metal 2
引入了一种新的内存模型,它采用并扩展了C ++ 11
一致性模型。 此模型具有新功能,允许线程组和线程组内的线程使用原子操作或内存栅栏相互通信,而不是昂贵的barriers
。
线程组需要通信的一个示例是一个对浮点数组合求和的内核,如图1所示。传统上,您可以使用计算每个线程组的值总和的内核实现此求和,并将这些值写入中间缓冲区。 因为这些线程组无法通信,所以您需要调度第二个内核来计算中间缓冲区值的最终总和。
因为启动每个内核需要成本,所以这种方法可能效率不高。 此外,由于第二个内核使用单个线程组,因此可能无法完全利用图形处理单元(GPU)。
通过线程组共享,一个内核和一个dispatch
可以对输入数组中的每个元素求和。 您可以使用原子操作来计算已完成的线程组的数量。 当所有线程组完成后,最后一个执行线程组可以计算最终的总和,如图2所示。
A11上的Metal 2
引入了原子函数,允许对内存位置进行互斥访问,并允许您指定在线程组内或线程组之间的线程之间如何同步内存。 您可以为每个原子操作指定内存顺序和内存范围。
内存顺序用于指定围绕同步操作如何排序内存操作。 内存顺序可以放宽 - 这是最快的模式,并提供仅对原子操作进行独占访问的保证。 如果需要在线程之间同步数据,请使用acquire-release
内存顺序。 在此模式下,写入内存的线程执行释放以允许线程获取相同的内存并读取最新数据。
内存范围基于GPU内存层次结构,并指定是否需要在SIMD
组,线程组或设备中的线程之间同步原子操作。
后记
本篇主要讲述了线程组共享,感兴趣的给个赞或者关注~~~