如何查看cpu是否支持simd?
# 檢查特定指令集 grep -o avx2 /proc/cpuinfo | head -1 # 檢查AVX2 grep -o sse4 /proc/cpuinfo | head -1 # 檢查SSE4 grep -o avx512 /proc/cpuinfo | head -1 # 檢查AVX512
gcc編譯選項,增加支持simd
-mavx2 -D__AVX2__
SSE和AVX2對比
SSE(Streaming SIMD Extensions)
基本特性:
引入時間:1999年(Pentium III)
寄存器寬度:128位(16字節)
寄存器數量:8個(XMM0-XMM7)
數據并行度:一次處理多個數據元素
數據類型:
cpp
__m128i // 處理整數(16個char,8個short,4個int,2個long) __m128 // 處理單精度浮點數(4個float) __m128d // 處理雙精度浮點數(2個double)
常見操作:
cpp
// 加載和存儲 __m128i data = _mm_loadu_si128(ptr); // 加載16字節 _mm_storeu_si128(ptr, data); // 存儲16字節// 算術運算 __m128i sum = _mm_add_epi32(a, b); // 4個int同時相加 __m128i prod = _mm_mullo_epi16(a, b); // 8個short同時相乘
AVX2(Advanced Vector Extensions 2)
基本特性:
引入時間:2013年(Haswell架構)
寄存器寬度:256位(32字節)← 比SSE翻倍
寄存器數量:16個(YMM0-YMM15)← 比SSE翻倍
向后兼容:包含所有SSE功能
數據類型:
cpp
__m256i // 處理整數(32個char,16個short,8個int,4個long) __m256 // 處理單精度浮點數(8個float) __m256d // 處理雙精度浮點數(4個double)
增強功能:
cpp
// 更豐富的指令集 __m256i data = _mm256_loadu_si256(ptr); // 加載32字節 _mm256_storeu_si256(ptr, data); // 存儲32字節// 新的操作類型 __m256i gather = _mm256_i32gather_epi32(base, index, scale); // 聚集加載
4. 直觀對比
處理32個字符(char):
技術 | 指令數 | 寄存器使用 | 性能 |
---|---|---|---|
逐字節 | 32條加載 + 32條存儲 | 1個通用寄存器 | 1x |
SSE | 2條加載 + 2條存儲 | 2個XMM寄存器 | 16x |
AVX2 | 1條加載 + 1條存儲 | 1個YMM寄存器 | 32x |
SSE和AVX2的關系就像:
SSE?= 小貨車(一次運16箱貨物)
AVX2?= 大卡車(一次運32箱貨物)
兩者都是SIMD技術,但:
AVX2更強大(寄存器更大,指令更多)
SSE更兼容(支持更廣泛的硬件)
AVX2包含SSE(向后兼容)
在高性能編程中,我們通常:
優先使用AVX2(如果可用)
降級使用SSE(作為備選)
提供回退方案(保證兼容性)