当前位置: 首页 > news >正文

simd学习

如何查看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__

SSEAVX2对比

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
SSE2条加载 + 2条存储2个XMM寄存器16x
AVX21条加载 + 1条存储1个YMM寄存器

32x

SSEAVX2的关系就像:

  • SSE = 小货车(一次运16箱货物)

  • AVX2 = 大卡车(一次运32箱货物)

两者都是SIMD技术,但:

  • AVX2更强大(寄存器更大,指令更多)

  • SSE更兼容(支持更广泛的硬件)

  • AVX2包含SSE(向后兼容)

在高性能编程中,我们通常:

  1. 优先使用AVX2(如果可用)

  2. 降级使用SSE(作为备选)

  3. 提供回退方案(保证兼容性)

http://www.xdnf.cn/news/1482805.html

相关文章:

  • esbuild入门
  • Cursor安装使用 与 Cursor网页端登录成功,客户端怎么也登陆不上
  • 解析噬菌体实验核心:从材料选择到功能验证的标准化操作框架
  • 数据结构——队列(Java)
  • 基于STM32单片机的酒驾检测设计
  • OpenAvatarChat项目在Windows本地运行指南
  • 【基础-单选】关于自定义组件的生命周期下列说法错误的是
  • 四款主流深度相机在Python/C#开发中的典型案例及技术实现方案
  • vant组件
  • 昇腾310i Pro固件说明
  • Vue3中SCSS的使用指南
  • 数据结构与算法1 第一章 绪论
  • AI工具深度测评与选型指南 - AI工具测评框架及方法论
  • Gitea:轻量级的自托管Git服务
  • 【左程云算法06】链表入门练习合集
  • GDAL 读取影像元数据
  • SQL-窗口函数
  • 单词分析与助记之数据建表(以production为例)
  • 鸡兔同笼问题求解
  • 手撕C++ list容器:从节点到完整双向链表实现
  • Ubuntu 22.04.1上安装MySQL 8.0及设置root密码
  • 贪心算法应用:柔性制造系统(FMS)刀具分配问题详解
  • 深度拆解OpenHarmony NFC服务:从开关到卡模拟掌握近场通信技术
  • 雷卯针对米尔MYC-YF13X开发板防雷防静电方案
  • vspere 服务的部署介绍
  • panther X2 armbian24 安装宝塔(bt)面板注意事项
  • 【完整源码+数据集+部署教程】苹果实例分割检测系统源码和数据集:改进yolo11-AggregatedAtt
  • 004-Dephi数据类型
  • c++之基础B(双重循环)(第五课)
  • idf-esp32 | 打印task列表