首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么内核不能使用SSE/AVX寄存器和指令?

为什么内核不能使用SSE/AVX寄存器和指令?
EN

Unix & Linux用户
提问于 2018-10-17 06:34:09
回答 1查看 8K关注 0票数 20

来自StackOverflow的这篇文章有

在某些环境中,对某些指令或使用某些寄存器有限制。例如,在Linux内核中,通常不允许使用SSE/AVX或FP寄存器。因此,大多数优化的memcpy变体都不能使用,因为它们依赖SSE或AVX寄存器,而在x86上使用了一个简单的基于64位mov的副本。对于这些平台,使用rep可以在不打破SIMD代码限制的情况下实现优化的memcpy的大部分性能。

为什么,x86_64内核不能使用SSE/AVX?如果它能使memcopy()更快,那么它似乎应该被允许。当我看到这个评论的时候,我只是在学习Intel程序集,特别是想学习SEE/AVX。

特别对Linux内核中的SSE/MME和AVX优化感兴趣。

EN

回答 1

Unix & Linux用户

发布于 2018-10-17 07:41:30

正如吉尔斯所提到的,只要FPU易于使用,内核就需要支持保存和恢复它的状态。由于用户空间可以使用FPU,因此在任何情况下都需要在上下文交换机(即当前CPU从一个线程切换到另一个线程时)处理--至少是在以前运行的线程使用FPU时。那么,为什么不将其扩展到内核呢?

有几个原因可以避免在内核中使用FPU:

  • 从可移植性的角度来看,一些体系结构根本不支持在内核中使用FPU,所以泛型代码不能依赖它;
  • 保存和恢复FPU状态是昂贵的,并且引入了某些与实现相关的约束(在x86 Linux上,在这里需要仔细考虑抢占)。

让内核避免使用FPU意味着用户空间的成本可以降低: FPU状态只需要在上下文切换返回到用户空间时之后(而不是在上下文切换之后)恢复,而不是在所有情况下(仅当所涉及的线程实际使用FPU时)。

然而,在内核中使用FPU (和MMX/SSE/AVX)是可能的,在x86特定的代码中,好处大于成本:因此它最终被用于密码代码和RAID6中。这些来自莱纳斯的邮件提供了更多细节。如果要使用FPU,则需要使用kernel_fpu_beginkernel_fpu_end之间的代码对所有FPU进行括号,并确保它不会出错或休眠。详细信息请参见arch/x86/include/asm/fpu/api.harch/x86/kernel/fpu/core.c

对于memcpy来说,性能的提高并不超过使用FPU的成本。

(x86具有相当复杂的FPU体系结构,但它提供了操作系统共享FPU所需的所有功能:它可以在每次发出FPU指令时捕获,这允许内核对从不使用FPU的进程进行优化,它还可以指示何时CPU和FPU状态可能会发散。它还提供了保存和恢复FPU状态的说明-- FSAVEFXSAVEXSAVE,这取决于FPU的年份。FPU支持可能是8086设计的一个方面,设计者在这里使用最有远见。)

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

https://unix.stackexchange.com/questions/475956

复制
相关文章

相似问题

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