- 第一章 CPU 简介
- 第二章 Hello,world!
- 第三章 函数开始和结束
- 第四章 栈
- Chapter 5 printf() 与参数处理
- Chapter 6 scanf()
- CHAPER7 访问传递参数
- Chapter 8 一个或者多个字的返回值
- Chapter 9 指针
- Chapter 10 条件跳转
- 第 11 章 选择结构 switch()/case/default
- 第 12 章 循环结构
- 第 13 章 strlen()
- Chapter 14 Division by 9
- chapter 15 用 FPU 工作
- Chapter 16 数组
- Chapter 17 位域
- 第 18 章 结构体
- 19 章 联合体
- 第二十章 函数指针
- 第 21 章 在 32 位环境中的 64 位值
- 第二十二章 SIMD
- 23 章 64 位化
- 24 章 使用 x64 下的 SIMD 来处理浮点数
- 25 章 温度转换
- 26 章 C99 的限制
- 27 章 内联函数
- 第 28 章 得到不正确反汇编结果
- 第 29 章 花指令
- 第 30 章 16 位 Windows
- 第 31 章 类
- 三十二 ostream
- 34.2.2 MSVC
- 34.2.3 C++ 11 std::forward_list
- 34.3 std::vector
- 34.4 std::map and std::set
第二十二章 SIMD
SIMD 是 Single Instruction, Multiple Data 的首字母。简单说就是单指令多数据流。
就像 FPU,FPU 看起来更像独立于 x86 处理器。
SIMD 开始于 MMX x86。8 个新的 64 位寄存器 MM0-MM7 被添加。
每个 MMX 寄存器包含 2 个 32-bit 值/4 个 16-bit 值/8 字节。比如可以通过一次添加两个值到 MMX 寄存器来添加 8 个 8-bit(字节)。
一个简单的例子就是图形编辑器,将图像表示为一个二维数组,当用户改变图像的亮度,编辑器必须添加每个像素的差值。为了简单起见,将每个像素定义为一个 8 位字节,就可以同时改变 8 个像素的亮度。
当使用 MMX 的时候,这些寄存器实际上位于 FPU 寄存器。所以可以同时使用 FPU 和 MMX 寄存器。有人可能会认为,intel 基于晶体管保存,事实上,这种共生关系的原因是:老的操作系统不知道额外的 CPU 寄存器,上下文切换是不会保存这些寄存器,可以节省 FPU 寄存器。这样激活 MMX 的 CPU+旧的操作系统+利用 MMX 特性的处理器=所有一起工作。
SSE-SIMD 寄存器扩展至 128bits,独立于 FPU。
AVX-另一种 256bits 扩展。
实际应用还包括内存复制(memcpy) 和内存比较(memcmp) 等等。
一个例子是:DES 加密算法需要 64-bits block,56-bits key,加密块生成 64 位结果。DES 算法可以认为是一个非常大的电子电路,带有网格和 AND/OR/NOT 门。
Bitslice DES2—可以同时处理块和密钥。比如说 unsigned int 类型变量在 X86 下可以容纳 32 位,因此,使用 64+56 unsigned int 类型的变量,可以同时存储 32 个 blocks-keys 对。
我写了一个爆破 Oracle RDBMS 密码/哈希(基于 DES)的工具。稍微修改了 DES 算法(SSE2 和 AVX)现在可以同时加密 128 或 256block-keys 对。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论