C++ SIMD性能优化

2024-06-18 03:04
文章标签 c++ 优化 性能 simd

本文主要是介绍C++ SIMD性能优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

// 使用SIMD指令优化的向量加法
//<mmintrin.h> MMX
//<xmmintrin.h>	SSE
//<emmintrin.h>	SSE2
//<pmmintrin.h>	SSE3
//<tmmintrin.h>	SSSE3
//<smmintrin.h>	SSE4.1
//<nmmintrin.h> SSE4.2
//<wmmintrin.h> AES
//<immintrin.h>	AVX, AVX2, FMA, BMI, POPCNT, AVX512
//<x86intrin.h>	Auto(GCC)
//<intrin.h> Auto(MSVC)
#include <emmintrin.h> // 包含SSE2指令集
#include <valarray>
#include <iostream>
#include <chrono>
#include <vector>__m128i vector_add(__m128i a, __m128i b) {return _mm_add_epi32(a, b);
}void add_vectors(int* a, int* b, int* c, int size) {for (int i = 0; i < size; i += 4) {__m128i va = _mm_load_si128((__m128i*)(a + i));__m128i vb = _mm_load_si128((__m128i*)(b + i));__m128i vc = _mm_add_epi32(va, vb);_mm_store_si128((__m128i*)(c + i), vc);}
}int test() {std::valarray<float> a = { 1.0, 2.0, 3.0, 4.0 };std::valarray<float> b = { 5.0, 6.0, 7.0, 8.0 };std::valarray<float> c = a + b;for (auto& element : c) {std::cout << element << " ";}std::cout << std::endl;// 数据量小std::vector<int> a1(10);std::vector<int> b1(10);for (size_t i = 0; i < 10; i++){a1[i] = i;b1[i] = i + 1;}std::vector<int> c1(10);std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();add_vectors(&a1[0], &b1[0], &c1[0], 4);std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();std::cout << "simd cost " << (t2 - t1).count() << std::endl;std::chrono::steady_clock::time_point t3 = std::chrono::steady_clock::now();for (size_t i = 0; i < c1.size(); ++i)c1.at(i) = a1.at(i) + b1.at(i);std::chrono::steady_clock::time_point t4 = std::chrono::steady_clock::now();std::cout << "cost " << (t4 - t3).count() << std::endl;// 数据量大std::vector<int> a2(10000);std::vector<int> b2(10000);for (size_t i = 0; i < 10000; i++){a2[i] = i;b2[i] = i + 1;}std::vector<int> c2(10000);t1 = std::chrono::steady_clock::now();add_vectors(&a2[0], &b2[0], &c2[0], 4);t2 = std::chrono::steady_clock::now();std::cout << "simd cost " << (t2 - t1).count() << std::endl;t3 = std::chrono::steady_clock::now();for (size_t i = 0; i < c2.size(); ++i)c2.at(i) = a2.at(i) + b2.at(i);t4 = std::chrono::steady_clock::now();std::cout << "cost " << (t4 - t3).count() << std::endl;//for (const auto& ele : c1)//    std::cout << ele << " ";return 0;
}

输出

6 8 10 12
simd cost 500
cost 400
simd cost 5700
cost 49200


总结: 数据运算量小无效果,数据运算量大效果提升显著

参考

GitHub - parallel101/simdtutor: x86-64 SIMD矢量优化系列教程

GitHub - google/highway: Performance-portable, length-agnostic SIMD with runtime dispatch


创作不易,小小的支持一下吧!

这篇关于C++ SIMD性能优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071132

相关文章

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析