【发布时间】:2023-03-13 20:25:01
【问题描述】:
我知道,当应用程序想要执行浮点运算时,必须将英特尔处理器配置为在浮点模式下工作。每次我需要执行浮点运算时更改模式不是太昂贵吗?谁负责做这个“模式改变”:编译器还是操作系统?考虑到浮点寄存器与整数寄存器是分开的,为什么 FPU 并不总是准备好工作?
【问题讨论】:
-
现代英特尔处理器通常不会出现这种情况。浮点工作没有单独的模式。为什么你认为有?你在哪里读到这个?它到底说了什么? FPU 和 MMX 操作之间存在排斥,但现在已经过时了。你是这么想的吗?
-
我在《Linux内核开发第3版》一书中读到:“当用户空间进程使用浮点指令时,内核管理从整数到浮点模式的转换。内核是什么使用浮点指令时必须做的事情因架构而异,但内核通常会捕获一个陷阱,然后启动从整数模式到浮点模式的转换。”
-
在技术黑暗的时代,人们担心在进程切换时切换出使用进程的纯整数寄存器会浪费时间。为了避免这种开销,许多处理器架构的浮点单元都有一点来记忆自上次显式清除该位以来 FPU 是否已被使用,因此操作系统可以检查它是否需要保留 FPU 状态。此功能尚未在现代操作系统中使用,因为不再值得担心开销。此外,至少在某些英特尔微架构上,这是一个推测执行漏洞。
-
好的,所以这本书正在讨论为当前进程启用浮点运算的标志。我想这可以称为一种模式,但书上说得不优雅。这个想法是,如果一个进程不使用浮点操作(包括加载和存储),它在浮点寄存器中没有需要保存和恢复的数据。因此,当一个进程首次启动时,内核将其标记为“不允许”使用浮点寄存器。如果一个进程从不使用浮点运算,它会继续它的快乐方式......
标签: linux x86 floating-point context-switch fpu