# intel_simd_test **Repository Path**: play565/intel_simd_test ## Basic Information - **Project Name**: intel_simd_test - **Description**: 测试在fex翻译环境下SIMD命令的执行情况 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-27 - **Last Updated**: 2025-03-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 指令说明 ### 1. `_mm256_load_si256` - **功能**:从对齐的内存地址加载 256 位整数到 AVX 寄存器。 - **指令集**:AVX2 - **汇编指令**:`vmovdqa`(对齐加载) - **CPU 支持**:Intel Haswell (2013+) / AMD Excavator (2015+) - **应用场景**:加载对齐的整型数据(如 `int64_t[4]`)。 ### 2. `_mm256_slli_epi64` - **功能**:对 AVX 寄存器中的每个 **64 位整数** 执行逻辑左移。 - **指令集**:AVX2 - **汇编指令**:`vpsllq`(向量 64 位左移) - **CPU 支持**:Intel Haswell (2013+) / AMD Excavator (2015+) - **示例**:`[0x01, 0x02]` 左移 2 位 → `[0x04, 0x08]`。 ### 3. `_mm_cvtsi128_si32` - **功能**:提取 XMM 寄存器的低 32 位整数。 - **指令集**:SSE2 - **汇编指令**:`movd`(XMM → 通用寄存器) - **CPU 支持**:Intel Pentium 4 (2001+) / AMD K8 (2003+) - **示例**:`[a, b, c, d]` → 返回 `a`。 ### 4. `_mm_unpacklo_epi64` - **功能**:将两个寄存器的低 64 位交错合并。 - **指令集**:SSE2 - **汇编指令**:`punpcklqdq` - **CPU 支持**:Intel Pentium 4 (2001+) / AMD K8 (2003+) - **示例**:`a = [A, B]`, `b = [C, D]` → 结果 `[A, C]`。 ### 5. `_mm_mulhi_epi16` - **功能**:16 位有符号整数乘法,返回高 16 位。 - **指令集**:SSE2 - **汇编指令**:`pmulhw` - **CPU 支持**:Intel Pentium 4 (2001+) / AMD K8 (2003+) - **用途**:避免溢出(如定点数运算)。 ### 6. `_mm_rsqrt_ps` - **功能**:快速计算单精度浮点数的倒数平方根(近似值)。 - **指令集**:SSE - **汇编指令**:`rsqrtps` - **CPU 支持**:Intel Pentium III (1999+) / AMD Athlon XP (2002+) - **特点**:速度快、精度低,适用于图形计算。 ### 7. `_mm_store_si128` - **功能**:将 128 位整数从寄存器存储到对齐的内存。 - **指令集**:SSE2 - **汇编指令**:`movdqa`(对齐存储) - **CPU 支持**:Intel Pentium 4 (2001+) / AMD K8 (2003+) - **注意**:非对齐存储需用 `_mm_storeu_si128`。 ### 8. `_mm_xor_si128` - **功能**:对两个 128 位寄存器执行按位异或(XOR)。 - **指令集**:SSE2 - **汇编指令**:`pxor` - **CPU 支持**:Intel Pentium 4 (2001+) / AMD K8 (2003+) - **用途**:加密算法、掩码操作、数据清零(`a ^ a = 0`)。 ### 9. `_mm_crc32_u64` - **功能**:计算 64 位无符号整数的 CRC32 校验值。 - **指令集**:SSE4.2 + CRC32 扩展 - **汇编指令**:`crc32` - **CPU 支持**:Intel Nehalem (2008+) / AMD Bulldozer (2011+) - **应用**:数据完整性校验(如网络协议、文件校验)。 ### 10. `_mm_shuffle_epi32` - **功能**:根据立即数重排 32 位整数。 - **指令集**:SSE2 - **汇编指令**:`pshufd` - **CPU 支持**:Intel Pentium 4 (2001+) / AMD K8 (2003+) - **示例**:`_MM_SHUFFLE(3,1,2,0)` → `[a, b, c, d]` → `[c, b, d, a]`。 ## 指令集与函数对照表 | 指令集 | 对应函数 | 典型应用场景 | |--------------|--------------------------------------------------------------------------|-----------------------------| | **AVX2** | `_mm256_load_si256`, `_mm256_slli_epi64` | 大整数批量操作 | | **SSE2** | `_mm_cvtsi128_si32`, `_mm_unpacklo_epi64`, `_mm_mulhi_epi16`, `_mm_store_si128`, `_mm_xor_si128`, `_mm_shuffle_epi32` | 通用整数运算、数据重组 | | **SSE** | `_mm_rsqrt_ps` | 图形计算(快速近似) | | **SSE4.2** | `_mm_crc32_u64` | 数据校验 | --- ### 关键注意事项 1. **对齐要求**: - `_mm256_load_si256` 和 `_mm_store_si128` 需内存对齐(32/16 字节),否则使用 `_mm256_loadu_si256` 或 `_mm_storeu_si128`。 2. **精度与性能权衡**: - `_mm_rsqrt_ps` 是近似计算,后续通常需用牛顿迭代法提升精度。 3. **CPU 兼容性**: - 使用前需通过 CPUID 检测指令集支持,或编译器标志(如 `-mavx2`, `-msse4.2`)显式启用。 4. **适用场景优先级**: - **AVX2**:需 256 位并行计算的场景(如矩阵运算)。 - **SSE4.2**:CRC 校验等专用操作。 - **SSE2**:通用 128 位整数/浮点操作(兼容性最佳)。