使用Rust编写操作系统(附录三):禁用SIMD
单指令多数据流(Single Instruction Multiple Data,SIMD)指令能够同时对多个数据字(data word)执行同一个操作,这能显著地加快程序运行的速度。架构支持下面的SIMD标准:
- SSE()。SSE指令集于1999年发布。它定义了一些全新的寄存器集合,而不是重复使用已有的浮点数单元寄存器。从
xmm0
到xmm15
,SSE定义了16个全新的寄存器,每个寄存器有128位长;
然而,庞大的SIMD寄存器可能在操作系统内核层面造成问题。当硬件中断发生时,我们的内核不得不备份所有它使用的寄存器:因为在程序继续时,内核依然需要它原来的寄存器数据。所以如果内核使用了SIMD寄存器,它就不得不额外备份大量的SIMD寄存器数据(可能多达512~1600个字节),这将很显著地降低效率。为了避免效率损失,我们在开发内核时,常常禁用sse
和mmx
这两个CPU特征(CPU feature)。(avx
特征是默认被禁用的。)
要禁用这两个特征,我们可以修改目标配置清单(target specification)的features
配置项。使用号,我们可以禁用sse
和mmx
两个CPU特征:
关于浮点数,我们有一个好消息和一个坏消息。坏消息是,x86_64
架构也使用SSE寄存器做一些浮点数运算。因此,禁用SSE环境下的浮点数运算,都将导致LLVM发生错误。Rust的core库基于浮点数运算实现——比如它实现了f32和f64类型——这样的特点,让我们无法通过避免使用浮点数而绕开这个错误。而好消息是,LLVM支持一个称作soft-float
的特征,它能够基于普通的整数运算软件模拟浮点运算;无需使用SSE寄存器,这让我们在内核中使用浮点数变为可能——只是性能上会慢一点点。
"features": "-mmx,-sse,+soft-float"
原文链接: 原作者:@phil-opp
译文链接:—
译者:洛佳 华中科技大学*