C++笔记之SIMD与SSE指令集
code review!
文章目录
- C++笔记之SIMD与SSE指令集
-
- [1. SIMD 与 SSE](#1. SIMD 与 SSE)
-
- [1.1 作用](#1.1 作用)
- [1.2 关系](#1.2 关系)
- [2. SSE 使用demo(C语言,使用Intrinsics)](#2. SSE 使用demo(C语言,使用Intrinsics))
-
- [2.1 关键点](#2.1 关键点)
1. SIMD 与 SSE
SIMD:Single Instruction Multiple Data(单指令多数据流)
SSE:Streaming SIMD Extensions(流式SIMD扩展)
1.1 作用
- SIMD:一种并行计算技术概念,用一条指令同时处理多个数据,提升计算效率
- SSE:Intel推出的一套具体指令集,是SIMD概念的一种硬件实现,主要用于加速浮点运算(图形、音视频处理等)
1.2 关系
SIMD是概念/技术范畴,SSE是其具体实现之一
- SIMD ⊃ SSE(包含关系)
- 其他SIMD实现还包括:MMX、AVX、AVX2、AVX-512(x86平台,均为SSE的前身或后续演进)、NEON(ARM平台)等
- 可理解为:SIMD是"电动车",SSE是"特斯拉Model 3"------一个是类别,一个是具体产品
2. SSE 使用demo(C语言,使用Intrinsics)
c
#include <xmmintrin.h> // SSE头文件
#include <stdio.h>
int main() {
// 两个数组,各4个float(128位 = 4×32位)
float a[4] = {1.0f, 2.0f, 3.0f, 4.0f};
float b[4] = {10.0f, 20.0f, 30.0f, 40.0f};
float result[4];
// 加载数据到SSE寄存器(128位,一次装4个float)
__m128 va = _mm_loadu_ps(a);
__m128 vb = _mm_loadu_ps(b);
// 一条指令完成4个float的加法!
__m128 vresult = _mm_add_ps(va, vb);
// 结果存回数组
_mm_storeu_ps(result, vresult);
// 输出结果
for (int i = 0; i < 4; i++) {
printf("%.1f + %.1f = %.1f\n", a[i], b[i], result[i]);
}
return 0;
}
输出:
1.0 + 10.0 = 11.0
2.0 + 20.0 = 22.0
3.0 + 30.0 = 33.0
4.0 + 40.0 = 44.0
2.1 关键点
__m128:SSE的128位数据类型,可装4个float_mm_loadu_ps:加载数据到寄存器_mm_add_ps:一条指令同时完成4次加法(这就是SIMD的核心)_mm_storeu_ps:取出结果
编译 :gcc -msse demo.c -o demo(需开启SSE支持)