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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文细谈SNN的基本数学原理,LIF模型,STDP与STBP学习方法

首先本文是读完 如何看待第三代神经网络SNN&#xff1f;详解脉冲神经网络的架构原理、数据集和训练方法 原创-CSDN博客 一文通俗入门脉冲神经网络(SNN)第三代神经网络-CSDN博客 两篇文章的总结&#xff0c;文章仅用于学习。 本文主要讨论STDP和STBP方法。 我们都知道&…

JavaEE、SSM基础框架、JavaWeb、MVC(认识)

目录 一、引言 &#xff08;0&#xff09;简要介绍 &#xff08;1&#xff09;主要涉及的学习内容 &#xff08;2&#xff09;学习的必要性 &#xff08;3&#xff09;适用学习的人群&#xff08;最好有这个部分的知识基础&#xff09; &#xff08;4&#xff09;这个基础…

FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析

一、av_malloc函数分析 &#xff08;一&#xff09;av_malloc函数的声明 av_malloc函数的声明放在在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为5.0.3&#xff0c;该ffmpeg在CentOS 7.5上通过10.2.1版本的gcc编译&#xff09;的头文件libavutil/mem.h中&#xff1a;…

Science | 稀土开采威胁马来西亚的生物多样性

马来西亚是一个生物多样性热点地区&#xff0c;拥有超过17万种物种&#xff0c;其中1600多种处于濒临灭绝的风险。马来西亚的热带雨林蕴藏了大部分的生物多样性&#xff0c;并为全球提供重要的生态系统效益&#xff0c;同时为土著社区带来经济和文化价值。同时马来西亚具有可观…

Python批量保存Excel文件中的图表为图片

Excel工作簿作为一款功能强大的数据处理与分析工具&#xff0c;被广泛应用于各种领域&#xff0c;不仅能够方便地组织和计算数据&#xff0c;还支持用户创建丰富多彩的图表&#xff0c;直观展示数据背后的洞察与趋势。然而&#xff0c;在报告编制、网页内容制作或分享数据分析成…

30.保存游戏配置到文件

上一个内容&#xff1a;29.添加录入注入信息界面 以 29.添加录入注入信息界面 它的代码为基础进行修改 效果图&#xff1a; 首先在我们辅助程序所在目录下创建一个ini文件 文件内容 然后首先编写一个获取辅助程序路径的代码 TCHAR FileModule[0x100]{};GetModuleFileName(NUL…

Apache Paimon系列之:Append Table和Append Queue

Apache Paimon系列之&#xff1a;Append Table和Append Queue 一、Append Table二、Data Distribution三、自动小文件合并四、Append Queue五、压缩六、Streaming Source七、Watermark Definition八、Bounded Stream 一、Append Table 如果表没有定义主键&#xff0c;则默认为…

离散数学复习

1.关系的介绍和性质 &#xff08;1&#xff09;序偶和笛卡尔积 两个元素按照一定的顺序组成的二元组就是序偶&#xff0c;使用尖括号进行表示&#xff0c;尖括号里面的元素一般都是有顺序的&#xff1b; 笛卡尔积就是有两个集合&#xff0c;从第一个集合里面选择一个元素&am…

github国内加速访问有效方法

这里只介绍实测最有效的一种方法&#xff0c;修改主机的Hosts文件&#xff0c;如果访问github网站慢或者根本无法访问的时候可以采用下面方法进行解决。 1、搜索一个IP查询网站 首先百度搜索选择一个IP查询的网站&#xff0c;这里我用下面这个网站&#xff08;如果该网站失效…

相约北京“信通院数据智能大会”

推动企业数智化转型发展&#xff0c;凝聚产业共识&#xff0c;引领行业发展方向&#xff0c;摩斯将参与信通院首届“数据智能大会”&#xff08;6月19-20日&#xff0c;北京&#xff09;。 本次大会设置多个主题论坛&#xff0c;将发布多项研究成果&#xff0c;分享产业最新实…

如何通过改善团队合作来提高招聘效率

当招聘顶尖人才时&#xff0c;时间就是一切。招聘效率取决于团队快速响应和完成任务的能力&#xff0c;但招聘经理和面试官并不总是最关心重要的招聘任务。更重要的是&#xff0c;求职者的经历取决于准备好的面试官是否准时出现。有时候最好的候选人会接受另一份工作&#xff0…

Spring Cloud Alibaba Nacos持久化配置

所谓的持久化就是将Nacos配置持久化存储到数据库里面&#xff0c;在0.7版本之前&#xff0c;在单机模式时nacos使用嵌入式数据库实现数据的存储&#xff0c;不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力。 ① 找到并执行sql脚本 这里路径为&#xff1a;n…

时间复杂度 空间复杂度分析

时间复杂度就是需要执行多少次&#xff0c;空间复杂度就是对象被创建了多少次。 O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!) < O(n^n) 这里写目录标题 时间复杂度O(1)O(logn)、O(nlogn)O(mn)、O(m*n)最好、最坏情况时间复杂度平均情况…

32、循环语句while+until

一、循环控制语句 双层循环和循环语句的使用&#xff0c;while和until的语法使用 1、进入调试模式 在脚本里第一行写入set -x bash -x 脚本 1.1、echo 打印 continue&#xff1a;跳出当次&#xff0c;后续的条件成立&#xff0c;继续执行。 break&#xff1a;一旦break&am…

实时数仓Hologres V2.2发布,Serverless Computing降本20%

Highlight 新发布Serverless Computing&#xff0c;提升大任务稳定性&#xff0c;同时可降低20%计算成本 引擎性能优化&#xff0c;TPC-H 1TB测试相对V1.X 提升100% 实时湖仓加速架构升级&#xff0c;支持Paimon&#xff0c;直读ORC、Parquet数据性能提升5倍以上 新增实例监…

LLM中表格处理与多模态表格理解

文档处理中不可避免的遇到表格&#xff0c;关于表格的处理问题&#xff0c;整理如下&#xff0c;供各位参考。 问题描述 RAG中&#xff0c;对上传文档完成版式处理后进行切片&#xff0c;切片前如果识别文档元素是表格&#xff0c;那么则需要对表格进行处理。一般而言&#x…

JupyterLab使用指南(二):JupyterLab基础

第2章 JupyterLab基础 2.1 JupyterLab界面介绍 JupyterLab的用户界面非常直观和灵活。它包括文件浏览器、工作区、多标签页、命令面板和侧边栏等功能。以下是各个部分的详细介绍&#xff1a; 2.1.1 文件浏览器 文件浏览器位于界面左侧&#xff0c;用于导航和管理文件。你可…

计算机网络:网络层 - 虚拟专用网 VPN 网络地址转换 NAT

计算机网络&#xff1a;网络层 - 虚拟专用网 VPN & 网络地址转换 NAT 专用地址与全球地址虚拟专用网 VPN隧道技术 网络地址转换 NAT网络地址与端口号转换 NAPT 专用地址与全球地址 考虑到 IP 地址的紧缺&#xff0c;以及某些主机只需要和本机构内部的其他主机进行通信&…

cbsd创建ubuntu jail 时下载系统慢的问题解决

下载时速度慢 使用cbsd创建ubuntu jail的时候 cbsd jconstruct-tui 提示&#xff1a; no base dir in: /usr/jails/basejail/base_amd64_amd64_jammy Select base sources:0 .. CANCELa .. build b .. extract c .. pkg d .. repo 选了pkg没找到 fetch: https://pkg.convec…

【减法网络】Minusformer:通过逐步学习残差来改进时间序列预测

摘要 本文发现泛在时间序列(TS)预测模型容易出现严重的过拟合。为了解决这个问题&#xff0c;我们采用了一种去冗余的方法来逐步恢复TS的真实值。具体来说&#xff0c;我们引入了一种双流和减法机制&#xff0c;这是一种深度Boosting集成学习方法。通过将信息聚合机制从加法转…