简介: 相对SSE2指令,引入新的指令,进一步优化优化多媒体处理和并行计算任务。另外,SSE3还改进了缓存管理方面的性能,使得处理器在特定工作负载下能够更高效地运行,主要目的是改进线程同步和特定应用程序领域,例如媒体和游戏。这些新增指令强化了处理器在浮点转换至整数、复杂算法、视频编码、SIMD浮点寄存器操作以及线程同步等五个方面的表现,最终达到提升多媒体和游戏性能的目的
x87-FP Integer Conversion | |
FISTTP | FISTTP m16int Store ST(0) in m16int/m32int/m64int with truncation. 将x87 FPU(浮点运算单元)中的ST(0)寄存器中的浮点值转换为16位或32位或64位整数,并将结果存储到内存中。 |
Specialized 128-bit Unaligned Data Load 专用128位未对齐数据加载 | |
LDDQU | LDDQU xmm1, mem 将内存中的非对齐的128位整数值加载到xmm1寄存器中 |
Floating-Point Packed ADD/SUB Instructions 浮点压缩ADD/SUB指令 | |
ADDSUBPS | ADDSUBPS xmm1, xmm2/m128 Add/subtract single precision floating-point values from xmm2/m128 to xmm1. 对打包的单精度浮点值执行加法和减法操作 DEST[31:0] := DEST[31:0] - SRC[31:0] |
ADDSUBPD | ADDSUBPD xmm1, xmm2/m128 对打包的双精度浮点值执行加法和减法操作 DEST[63:0] := DEST[63:0] - SRC[63:0] |
Floating-Point Horizontal ADD/SUB Instructions 浮点水平ADD/SUB指令 | |
HADDPS | HADDPS xmm1, xmm2/m128 Horizontal add packed single precision floating-point values from xmm2/m128 to xmm1. 用于对存储在xmm1和xmm2/m128寄存器中的两组四个单精度浮点值进行水平相加操作 DEST[31:0] := SRC1[63:32] + SRC1[31:0] |
HSUBPS | HSUBPS xmm1, xmm2/m128 对存储在xmm1和xmm2/m128寄存器中的两组四个单精度浮点值进行水平相减操作 DEST[31:0] := SRC1[31:0] - SRC1[63:32] |
HADDPD | HADDPD xmm1, xmm2/m128 Horizontal add packed double precision floating-point values from xmm2/m128 to xmm1. 用于对存储在xmm1和xmm2/m128寄存器中的两组两个双精度浮点值进行水平相加操作 DEST[63:0] := SRC1[127:64] + SRC1[63:0] |
HSUBPD | HSUBPD xmm1, xmm2/m128 Horizontal subtract packed double precision floating-point values from xmm2/m128 to xmm1. 用于对存储在xmm1和xmm2/m128寄存器中的两组两个双精度浮点值进行水平相减操作 DEST[63:0] := SRC1[63:0] - SRC1[127:64] |
Floating-Point LOAD/MOVE/DUPLICATE Instructions | |
MOVSHDUP | MOVSHDUP xmm1, xmm2/m128 Move odd index single precision floating-point values from xmm2/mem and duplicate each element into xmm1. 用于对存储在xmm1和xmm2/m128寄存器中的两组四个单精度浮点值进行操作,其中m128表示存储了四个单精度浮点值的内存位置。 DEST[31:0] := SRC[63:32] |
MOVSLDUP | MOVSLDUP xmm1, xmm2/m128 Move even index single precision floating-point values from xmm2/mem and duplicate each element into xmm1. 对存储在xmm1和xmm2/m128寄存器中的两组四个单精度浮点值进行操作,其中m128表示存储了四个单精度浮点值的内存位置 DEST[31:0] := SRC[31:0] |
MOVDDUP | MOVDDUP xmm1, xmm2/m64 对存储在xmm1和xmm2/m64寄存器中的两组两个双精度浮点值进行操作,其中m64表示存储了两个双精度浮点值的内存位置 DEST[63:0] := SRC[63:0] |
Agent Synchronization Instructions 代理同步指令 | |
MONITOR | MONITOR 与MWAIT指令一起使用,用于实现基于硬件的线程同步机制 指令的目的是向处理器提供关于哪些内存位置可能被特定线程访问的提示。这使得处理器能够通过减少缓存一致性流量和避免由于虚假共享而引起的不必要延迟来优化性能 |
MWAIT | MWAIT 一种提示,允许处理器停止指令执行并进入与实现相关的优化状态,直到一类事件发生 通常与英特尔高级配置与电源接口(ACPI)一起使用,以在特定处理器状态下提供节能功能。 执行MWAIT指令会导致处理器进入低功耗状态,并等待特定事件的发生 (* MWAIT takes the argument in EAX as a hint extension and is architected to take the argument in ECX as an instruction extension |
MONITOR和MWAIT是一对x86指令,用于实现基于硬件的线程同步机制。MONITOR指令用于指定处理器应该监视的内存地址范围,而MWAIT指令导致处理器进入低功耗状态,并等待在监视的地址范围内发生特定事件。结合使用时,这些指令能够通过允许线程进入低功耗状态,直到另一个线程修改了监视范围内的特定内存地址,从而实现高效的线程同步。这有助于提高多线程应用程序的整体系统性能和功耗效率。
;-------------------------MONITOR, MWAIT 例子-----------
section .data
shared_data dd 0 ; 共享数据
section .text
global main
extern thread1, thread2
main:
mov eax, 0 ; 初始化共享数据为0
mov [shared_data], eax
mov eax, 1 ; 设置监视地址范围开始位置
mov ebx, offset shared_data
add ebx, 4 ; 监视地址范围结束位置(共享数据的下一个地址)
monitor ; 设置监视地址范围
jmp thread1 ; 启动线程1
thread1:
mov eax, 1 ; 修改共享数据为1
mov [shared_data], eax
mwait ; 线程1进入低功耗状态等待
; 线程1被唤醒后继续执行
mov eax, [shared_data]
cmp eax, 2 ; 检查共享数据是否已经被线程2修改
je done ; 如果是,则完成
jmp thread1 ; 否则继续等待
thread2:
mov eax, 2 ; 修改共享数据为2
mov [shared_data], eax
mwait ; 线程2进入低功耗状态等待
; 线程2被唤醒后继续执行
mov eax, [shared_data]
cmp eax, 1 ; 检查共享数据是否已经被线程1修改
je done ; 如果是,则完成
jmp thread2 ; 否则继续等待
done:
; 完成,退出程序
mov eax, 1
xor ebx, ebx
int 0x80
在这个示例中,我们有两个线程(thread1和thread2),它们同时访问一个共享数据(shared_data)。首先,我们使用MONITOR指令设置监视地址范围,该范围从shared_data开始,到shared_data的下一个地址结束。然后,线程1将共享数据修改为1,并调用MWAIT指令进入低功耗状态等待。线程2也会修改共享数据为2,并进入低功耗状态等待。当其中一个线程修改了共享数据后,另一个线程将被唤醒并继续执行。最后,程序完成并退出。
请注意,上述示例是汇编语言代码,需要在适当的环境中进行编译和运行,例如使用NASM汇编器和链接器。