首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么SIMD指令没有在内核中使用?

为什么SIMD指令没有在内核中使用?
EN

Stack Overflow用户
提问于 2017-10-10 23:54:44
回答 1查看 2.1K关注 0票数 7

我在内核中找不到很多SIMD指令(比如SSE/AVX)的使用(除了一个地方用来加速RAID6的奇偶计算)。

( Q1)这种情况的具体原因,或者仅仅是用例的缺乏?

( Q2)如果我想使用SIMD指令,比如设备驱动程序,今天需要做什么?

( Q3)将像ISPC这样的框架整合到内核中有多难(仅仅是为了实验)?

EN

回答 1

Stack Overflow用户

发布于 2017-10-11 00:15:00

保存/恢复FPU (包括SIMD矢量寄存器)状态比单纯的整数GP寄存器状态更昂贵。在大多数情况下,这是不值得的。

在Linux内核代码中,您所要做的就是围绕代码调用kernel_fpu_begin() / 。这就是RAID驱动程序所做的。fp.html

x86没有任何未来的方法来保存/恢复一个或两个向量寄存器。(除了使用遗留的SSE指令手动保存/恢复xmm寄存器外,如果用户空间具有任何ymm/zmm寄存器的上半部分,则可能导致SSE/AVX transition stalls on Intel CPUs )。

遗留SSE工作的原因是,一些Windows驱动程序已经在做这件事,而英特尔想要引入AVX,所以他们发明了这种过渡惩罚的东西,而不是让遗留的SSE指令在ymm寄存器的上面128 B为零。(有关该设计决策的更多细节,请参见this。)因此,基本上我们可以将SSE/AVX转换的罪魁祸首归咎于Windows二进制驱动程序。

关于非x86体系结构的IDK,以及现有SIMD指令集是否有一种保存/恢复寄存器的方法,该寄存器将继续工作在较长的向量上。如果扩展继续使用多个32位FP寄存器作为单个更宽寄存器的模式,ARM32可能会这样做.(例如q2是通过s11s8组成的。)因此,如果256 b霓虹灯扩展只允许您使用两个q寄存器作为256 b寄存器,那么保存/恢复一对q寄存器应该是未来的证明。或者,如果新的更宽的向量是分开的,并且不扩展现有寄存器。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46677676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档