0

0

c++如何使用SIMD c++ AVX/SSE指令集入门【性能优化】

尼克

尼克

发布时间:2025-12-26 16:15:07

|

335人浏览过

|

来源于php中文网

原创

使用AVX2需包含、用__m256类型、32字节内存对齐、-mavx2编译标志,逐块加载-计算-存储,如32元float数组相加需4次__m256运算。

c++如何使用simd c++ avx/sse指令集入门【性能优化】

直接用 C++ 写 AVX/SSE 指令,不靠编译器自动向量化,核心是:用 immintrin.h(或对应头文件)引入内在函数(intrinsics),操作 __m128 / __m256 等向量类型,手动调度数据和计算逻辑。

从 SSE 到 AVX:选对头文件和数据类型

SSE 使用 128 位寄存器,AVX 使用 256 位(AVX2 还支持整数运算,AVX-512 是 512 位,需额外开启)。实际开发中建议优先用 AVX2(主流 CPU 均支持):

  • SSE(float):包含 #include ,用 __m128,一次处理 4 个 float
  • AVX(float):包含 #include ,用 __m256,一次处理 8 个 float
  • AVX2(int):同样用 ,支持 __m256i 处理 8 个 int32_t 或 32 个 int8_t
  • 编译时加标志,如 GCC/Clang: -mavx2 -mfma;MSVC:项目属性 → 启用增强指令集 → AVX2

典型操作流程:加载→计算→存储

以“两个 float 数组逐元素相加”为例(长度为 32 的数组 a、b、c):

爱图表
爱图表

AI驱动的智能化图表创作平台

下载
  • 对齐分配内存:SIMD 要求地址按寄存器宽度对齐(AVX2 需 32 字节对齐),推荐用 aligned_alloc(32, size)_mm_malloc(size, 32)
  • 分块循环:每次处理 8 个 float(对应一个 __m256),共 4 次迭代:
    for (int i = 0; i < 32; i += 8) {
        __m256 va = _mm256_load_ps(&a[i]);
        __m256 vb = _mm256_load_ps(&b[i]);
        __m256 vc = _mm256_add_ps(va, vb);
        _mm256_store_ps(&c[i], vc);
    }
  • 注意边界:若数组长度不是 8 的倍数,剩余元素用标量补足,或用 masked load/store(AVX2 不直接支持,AVX-512 有 _mm256_mask_load_ps

常见陷阱与实用技巧

  • 未对齐加载崩溃:用 _mm256_loadu_ps(u 表示 unaligned)可避免崩溃,但性能略降;生产环境仍建议对齐 + 正常 load
  • 混用浮点/整数指令易出错_mm256_add_ps(float)和 _mm256_add_epi32(int32)不能互换,类型不匹配会静默出错
  • 避免频繁标量/向量转换:比如提取单个元素用 _mm256_extract_ps 开销大,应尽量保持向量化流水
  • 用内联函数封装常用模式:例如写一个 vec_add(float* a, float* b, float* c, int n),内部处理对齐、循环、余数

验证是否生效 & 性能对比方法

别只信代码写了 intrinsic 就变快 —— 实测才是关键:

立即学习C++免费学习笔记(深入)”;

  • std::chrono::high_resolution_clock 测量标量版 vs SIMD 版的耗时(重复多次取平均)
  • 检查汇编输出:GCC 加 -S -O2 生成 .s 文件,搜索 vaddpsvmovaps 等指令确认是否生成了 AVX 指令
  • 用 perf(Linux)或 VTune(Intel)看 IPC、L1 cache miss、vector utilization 等指标,判断瓶颈在计算还是访存
  • 注意:小数组或简单运算可能被标量击败(函数调用/对齐开销占比高),SIMD 优势通常在数百元素以上才明显

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

295

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

551

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

92

2025.10.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

512

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

46

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

182

2025.08.29

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6万人学习

Git 教程
Git 教程

共21课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号