fpu, mmx及sse的一些 介绍(原创)

本文详细介绍了FPU、MMX和SSE技术的特点及其应用。FPU提供了强大的浮点运算能力,MMX则针对整数运算进行了优化,而SSE指令集进一步增强了向量处理能力。通过具体的汇编语言示例,展示了如何利用这些技术提高计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要需要FPU和MMX/SSE?
提供了SIMD环境(single instruction multi data),即单指令多数据。
内嵌浮点运算单元,64及128位寄存器等。甚至sin/cos等数学函数也囊括其中,
著名的xvid项目就是使用gcc编译后使用MMX/SSE优化汇编的典型案例。

转载请注明原创:http://www.cppblog.com/jinglexy,现在使用博客:http://blog.youkuaiyun.com/jinglexy
msn and mail: jinglexy at yahoo dot com dot cn 上海体育馆2007.4.18

FPU: 8个80位浮点寄存器(数据),16位状态寄存器,16位控制寄存器,16为标识寄存器。
     使用FPU指令对这些寄存器进行操作,这些寄存器构成一个循环栈,st7栈底,st0栈顶,
     当一个值被压入时,被存入st0,原来st0中的值被存入st7
MMX: 将8个FPU寄存器重命名为8个64位MMX寄存器,即mm0到mm7。
     57条MMX指令,加快了整形浮点运算,但是对于复杂浮点运算无帮助

SSE: 8个128位寄存器(从xmm0到xmm7),MXSCR寄存器,EFLAGS寄存器,专有指令(复杂浮点运算)
SSE2: 寄存器和SSE相同,增加了5种数据类型(都是128位),专有指令
SSE3: 仅增加了几个新的指令

由于MMX使用的寄存器影射到FPU寄存器上,所以MMX指令执行前,需要保存FPU堆栈。

示例1,FPU寄存器及指令使用(下面所有程序都使用at&t风格汇编):
data1:
        .byte 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
data2:
        .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.section .text
.globl _start
_start:
        nop
        fbld  data1     压入st0
        fimul data2     st0中的值和data2相乘,保存在st0中
        fbstp data1     st0弹出到内存44


示例2, SSE寄存器及指令使用
.lcomm data 16
value1:
        .float 12.34, 2345.543, -3493.2, 0.44901
value2:
        .float -54439.234, 23231.4, 1.0098, 0.000003
.section .text
.globl _start
_start:
        movups value1, %xmm0
        movups value2, %xmm1
        movups %xmm0, %xmm2
        movups %xmm0, data


 
我要继续提问,cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 25 model : 33 model name : AMD Ryzen 5 5600 6-Core Processor stepping : 2 microcode : 0xa20120e cpu MHz : 3493.436 cache size : 512 KB physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 16 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves clzero wbnoinvd arat umip pku ospke vaes vpclmulqdq rdpid overflow_recov succor fsrm bugs : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass srso bogomips : 6986.87 TLB size : 2560 4K pages clflush size : 64 cache_alignment : 64 address sizes : 45 bits physical, 48 bits virtual power management: processor : 1 vendor_id : AuthenticAMD cpu family : 25 model : 33 model name : AMD Ryzen 5 5600 6-Core Processor stepping : 2 microcode : 0xa20120e cpu MHz : 3493.436 cache size : 512 KB physical id : 2 siblings : 1 core id : 0 cpu cores : 1 apicid : 2 initial apicid : 2 fpu : yes fpu_exception : yes cpuid level : 16 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext ibpb vmmcall fsgsbase bmi1 av
03-12
<think>好的,用户想了解MMXSSE指令集的特点以及它们的对比分析。首先,我需要回忆一下这两个指令集的基本信息。 MMX是Intel在1996年推出的,主要用于多媒体处理。它引入了64位的MMX寄存器,可以同时处理多个整型数据,也就是SIMD技术。不过,MMX使用的是浮点寄存器的别名,可能会导致与浮点运算的冲突。另外,MMX只支持整型数据,不支持浮点数,这可能限制了它的应用范围。记得引用中提到的步骤:创建打包整数、使用MMX指令计算、存入结果[^3]。 然后是SSE指令集,最初出现在1999年的Pentium III。SSE增加了128位的XMM寄存器,支持单精度浮点运算,这对图形处理和科学计算很重要。SSE还引入了独立的寄存器,避免了MMX与浮点运算的冲突。引用里提到SSE2扩展了双精度浮点和整数指令,还有高速缓存控制指令[^1]。另外,头文件方面,SSE对应xmmintrin.h,SSE2是emmintrin.h[^2]。 接下来需要对比两者的寄存器宽度、数据类型、寄存器独立性、应用场景等。MMX的64位寄存器处理整型,而SSE的128位处理浮点和整型。SSE的独立寄存器可能更高效,不会影响浮点单元。应用上,MMX适合早期的多媒体处理,SSE更适合需要浮点运算的领域,比如3D图形。 还要考虑它们的扩展性,比如SSE后来发展到SSE2、SSE3等,支持更多数据类型和指令。而MMX后来被SSE系列取代。用户可能还想知道如何在实际编程中使用这些指令集,比如使用intrinsics函数,引用中的头文件信息可以派上用场[^2]。 需要确保回答结构清晰,分点列出各自特点,再对比分析。还要注意用户提到的系统级指令,比如数学表达式用$...$,独立公式用$$...$$,不过这个问题可能不需要太多数学公式,但如果有的话要正确应用。最后生成相关问题,比如优化方法、应用场景等。 检查是否有遗漏的信息,比如MMX的符号位处理[^4],可能需要在特点中提到。同时,确保引用标识正确对应,比如引用关于SSE2的扩展,引用关于MMX的使用步骤。 总结:MMXSSE寄存器大小、数据类型、寄存器独立性、扩展性等方面有显著差异。SSE在浮点处理和应用范围上更优,而MMX是早期的SIMD尝试,后来被SSE取代。需要将这些点组织成用户容易理解的对比分析。</think>### MMXSSE指令集对比分析 #### 一、MMX指令集特点 1. **寄存器结构** 使用64位$MM0$-$MM7$寄存器,复用浮点运算单元(FPU)的寄存器空间,导致与浮点运算存在资源冲突[^4]。 2. **数据类型支持** 支持**打包整型数据**(8位字节、16位字、32位双字),例如同时处理8个8位像素数据,通过SIMD(单指令多数据)实现并行计算。 3. **指令功能** 提供算术运算(如$PADDB$加法)、逻辑运算(如$PAND$与操作)、移位操作(如$PSLLW$左移)等,专为多媒体处理(如图像压缩)优化。 4. **局限性** - 无独立寄存器,需与浮点运算交替切换 - 不支持浮点运算 - 数据打包/解包过程增加额外开销 #### 二、SSE指令集特点 1. **寄存器扩展** 新增128位独立$XMM0$-$XMM7$寄存器SSE2扩展至$XMM8$-$XMM15$),彻底分离浮点与SIMD运算资源。 2. **数据类型增强** - **浮点运算**:支持4个32位单精度浮点数(SSE)或2个64位双精度浮点数(SSE2) - **整型扩展**:SSE2补充了64位/128位整型操作指令 3. **指令集丰富性** 包含浮点运算(如$ADDPS$并行加法)、数据搬移(如$MOVAPS$对齐加载)、高速缓存控制(如$PREFETCH$预取数据)等,覆盖计算、存储、优化全流程。 4. **编程便利性** 通过Intrinsics函数(如`_mm_add_ps`)可直接调用指令,头文件`xmmintrin.h`(SSE)和`emmintrin.h`(SSE2)提供标准化接口。 #### 三、对比分析 | 特性 | MMX | SSE | |---------------------|------------------------------|------------------------------| | **寄存器位宽** | 64位 | 128位 | | **数据类型** | 仅整型 | 整型+单/双精度浮点 | | **寄存器独立性** | 共享FPU寄存器 | 独立XMM寄存器 | | **典型应用场景** | 图像处理、视频编码 | 3D图形、科学计算、音视频编码 | | **指令扩展性** | 被SSE替代 | 演进至SSE4/AVX | #### 四、技术演进关系 MMX为SIMD技术奠基,但SSE通过以下改进实现超越: 1. 独立寄存器消除资源冲突 2. 浮点指令支持科学计算需求 3. SSE2补充整型指令后完全覆盖MMX功能 例如,SSE2的`MOVQ`指令可替代MMX的64位数据传输,同时兼容128位操作。 #### 五、性能优化示例 ```cpp // SSE实现4个浮点并行加法 #include <xmmintrin.h> __m128 a = _mm_set_ps(1.0, 2.0, 3.0, 4.0); __m128 b = _mm_set_ps(5.0, 6.0, 7.0, 8.0); __m128 c = _mm_add_ps(a, b); // 单指令完成4组加法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值