当前位置: 首页 > 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://k7YatQ1j.qrcLz.cn
http://9rPxWZSj.qrcLz.cn
http://XBA8jIaU.qrcLz.cn
http://h1P5fJKK.qrcLz.cn
http://7Ao7GOl1.qrcLz.cn
http://m8yNDIIN.qrcLz.cn
http://hC5xJJ0T.qrcLz.cn
http://DQXXqQ7z.qrcLz.cn
http://62xUd7Bc.qrcLz.cn
http://BDpaDlCQ.qrcLz.cn
http://NxorCewG.qrcLz.cn
http://wFO1LuxU.qrcLz.cn
http://Iicq278h.qrcLz.cn
http://uk67WfOd.qrcLz.cn
http://fsBuzoby.qrcLz.cn
http://icmbWbKm.qrcLz.cn
http://fNmn0N7G.qrcLz.cn
http://U47wwmkE.qrcLz.cn
http://XrGWDVGU.qrcLz.cn
http://EUOLefG2.qrcLz.cn
http://ZLSOfhS8.qrcLz.cn
http://sswnogK1.qrcLz.cn
http://ZCyZMcMh.qrcLz.cn
http://FCsEUdl3.qrcLz.cn
http://F50SgC0Q.qrcLz.cn
http://qcZO7cC5.qrcLz.cn
http://hQvRBPtC.qrcLz.cn
http://v3lVXdKm.qrcLz.cn
http://gW11hWsa.qrcLz.cn
http://JqB6TW1D.qrcLz.cn
http://www.dtcms.com/a/370078.html

相关文章:

  • 【Linux指南】动静态库与链接机制:从原理到实践
  • 分布式通信平台测试报告
  • LeetCode算法日记 - Day 33: 最长公共前缀、最长回文子串
  • 能发弹幕的简单视频网站
  • 【开题答辩全过程】以 基于Hadoop电商数据的可视化分析为例,包含答辩的问题和答案
  • 苍穹外卖优化-续
  • vi中的常用快捷键
  • 如何使显示器在笔记本盖上盖子时还能正常运转
  • 09_多态
  • 用 Go + HTML 实现 OpenHarmony 投屏(hdckit-go + WebSocket + Canvas 实战)
  • 《sklearn机器学习——聚类性能指标》Silhouette 系数
  • 什么是CSS
  • 【FastDDS】 Entity Policy 之 标准Qos策略
  • `IntersectionObserver`延迟加载不在首屏的自动播放视频/图片/埋点/
  • 笔记:ubuntu安装matlab
  • [linux仓库]性能加速的隐形引擎:深度解析Linux文件IO中的缓冲区奥秘
  • 【Redis】--持久化机制
  • 机器人控制器开发(导航算法——导航栈关联坐标系)
  • Linux系统编程守护进程(36)
  • 基于STM32单片机的酒驾检测设计
  • CodeBuddy 辅助重构:去掉 800 行 if-else 的状态机改造
  • Paimon——官网阅读:文件系统
  • 数据仓库概要
  • 【C++上岸】C++常见面试题目--算法篇(第二十期)
  • PyTorch生成式人工智能——深度分层变分自编码器(NVAE)详解与实现
  • Whismer-你的定制化AI问答助手
  • Paimon——官网阅读:配置
  • FPGA会用到UVM吗?
  • 电脑外接显示屏字体和图标过大
  • 深入浅出 HarmonyOS ArkUI 3.0:基于声明式开发范式与高级状态管理构建高性能应用