英特尔GPU架构深度解读( 四 )


Xe-LP执行单元:成双成对
更深入地讲 , 我们拥有Xe-LP GPU架构中最小的线程级构建块 , 即古老的执行单元 。多年来 , 英特尔已对其进行了几次调整 , 而对于Xe-LP , 它们又在进行调整 。
作为快速更新单元 , 截止到英特尔的Gen11 GPU架构为止 , EU由一个线程控制单元和两组4宽SIMD组成 。一个块处理浮点数和整数运算 , 而另一块可以处理浮点数和特殊函数 , 英特尔将其称为“扩展运算” 。尽管如此 , Gen11的最小波面宽度为8个线程宽(SIMD8) , 因此执行一个波面可能需要多个时钟周期 , 而英特尔会将多个波面交织为一种延迟隐藏形式 。

英特尔GPU架构深度解读

文章插图
同时 , Xe-LP给EU的设计带来了一些重要的变化 。首先 , 一个EU不再是一个独立的大区 。现在 , 两个EU共享一个线程控制单元 。结果 , 线程控制单元现在获得了两个EU(不再是一个)的组合资源来分散工作 。尽管SIMD阵列本身也发生了变化 , 这使问题进一步复杂化 , 但其影响在于 , GPU中的线程控制单元现在越来越少 , 这将减少在任何给定时刻In-flight波面数量 。
实际上 , 有人争论这两个EU是否为描述它们的最准确方法 。最佳选择将它们捆绑在一起作为一个单一的“大EU” , 因为这两个部分都不是真正独立的 。但是由于缺少更多底层细节 , 而且我确定英特尔希望在对EU进行计数时保持半一致性 , 所以他们选择了96个“小EU” 。
同时 , 无论您如何捆绑EU , 都存在EU本身的问题 。对于Xe-LP , 英特尔已经重组了SIMD模块 。一对具有功能差异的SIMD4已不再支持SIMD8和SIMD2 。较大的SIMD8本质上将先前在Gen11的两个SIMD4模块之间分配的所有浮点和整数ALU组合在一起 , 并从中分离出一个SIMD8 。最终结果是FPU ALU的数量没有改变(每个EU仍然是8个ALU) , 但是可以处理整数的管道数量已经改变(从4到8) , 可以扩展的ALU数量也已经改变运算法则(从4到2) 。
英特尔GPU架构深度解读

文章插图
说到这一点 , 扩展运算现在已移至其自己的SIMD2 , 并且每个EU都有一个 。这意味着执行扩展的数学函数不再像Gen11那样直接阻止浮点算术的执行(EU不必为此放弃FP管道) 。需要着重强调的一点是 , EU可以同时向FP / INT SIMD8和EM SIMD2同时发布指令 , 这意味着在至少某些情况下 , 进行扩展运算也不会间接阻止FP / INT运算 。
英特尔GPU架构深度解读

文章插图
与共同发布时出现的问题一样 , 细节仍然很棘手 。在这一点上 , 我们尚不清楚共同发布的局限性是什么 。但它仍然很可能更适合英特尔实际看到的那种工作负载 。AMD和NVIDIA还使用专用的EM / SFU单元 , 并且比例也很小 , 对于这两家公司来说 , 所有这些似乎都很好 。因此 , 在这方面 , 英特尔的ALU设置看起来更像是它的现代竞争对手 。我怀疑 , 这也是英特尔为了从Xe-LP上相同数量的FLOP中获取更多效果而做出的瓶颈优化形式之一 。
这些ALU更改还会影响波面在GPU中的移动方式 。SIMD8是常规算术中最小的ALU阵列 , 英特尔的最小波面尺寸现在与底层硬件相同 。这意味着Xe-LP至少在最小波面尺寸的情况下 , 不再需要多个周期来在单个周期内从波面执行一条指令 。在Gen11中 , 英特尔还允许存在SIMD16和SIMD32波阵面 , 而我正在等待Xe-LP白皮书以确认是否保留了这些(在这种情况下 , 它们仍然需要多个周期) , 或者英特尔是否正在将所有内容强制设为SIMD8 。
值得注意的是 , 这一变化与AMD去年的RDNA(1)架构非常相似 , 它通过增加SIMD大小并返回其波面大小来消除波面的多周期执行 。在这种情况下 , 这样做是为了帮助保持其SIMD插槽的占用率更高 , 并减少指令等待时间 , 如果英特尔也遇到类似的情况 , 我不会感到惊讶 。
英特尔GPU架构深度解读

文章插图
这种重组的另一个好处是 , 英特尔能够从整体上简化其线程调度硬件 。直到第11代 , 英特尔仍在使用硬件记分板来确定何时运行线程以及何时准备就绪线程的数据 。但是 , 借助Xe-Lp , 计分板已经转移到软件中 , 由英特尔编译器来负责 。


推荐阅读