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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法解析:有序数组的平方(以JS为例)

题目&#xff1a; 算法解析 算法概述 这个算法的目标是计算一个数组中每个元素的平方&#xff0c;并将结果存储在一个新的数组中&#xff0c;同时保持结果数组的排序顺序。它使用了三个指针&#xff1a;i、j和k&#xff0c;分别指向当前考虑的较小元素、较大元素和结果数组的…

【数据结构】排序(下)

个人主页~ 排序&#xff08;上&#xff09; 栈和队列 排序 二、常见排序的实现8、快速排序的优化9、非递归快速排序&#xff08;1&#xff09;基本思想&#xff08;2&#xff09;代码实现&#xff08;3&#xff09;时间复杂度&#xff08;4&#xff09;空间复杂度 10、归并排序…

kali中安装zsteg教程

1、下载文件 git clone http://www.github.com/zed-0xff/zsteg 2、第一步需要保证虚拟机是有网络的&#xff0c;不然无法克隆 3、可以将网络设置成如下后重启&#xff0c;访问百度看看能不能访问&#xff0c;若可以访问&#xff0c;则进行下一步 4、查看源&#xff0c;删除源&…

✊构建浏览器工作原理知识体系(网络协议篇)

🌻 前言 书接上回~ 系列文章目录: # ✊构建浏览器工作原理知识体系(开篇)# ✊构建浏览器工作原理知识体系(浏览器内核篇)# ✊构建浏览器工作原理知识体系(网络协议篇)✊构建浏览器工作原理知识体系(网页加载超详细全过程篇)为什么你觉得偶尔看浏览器的工作原理,…

程序员日志之计算机相关专业还值得选择吗?

目录 传送门正文日志1、概要2、专业选择2.1、专业2.2、学校2.3、城市 3、计算机相关专业还值得选择吗&#xff1f; 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyB…

【会议】一张图片讲清楚:项目启动会议

另附上启动会前需要准备的内容&#xff1a;

【吉林大学Java程序设计】第10章:Java数据库编程技术(JDBC)

第10章&#xff1a;Java数据库编程技术&#xff08;JDBC&#xff09; 1. 数据库系统概述数据库系统SQL语言 2.JDBC概述JDBC APIJDBC Driver API 3.JDBC编程步骤示例1&#xff1a;MySQL数据库操作程序示例2&#xff1a;Java DB数据库操作程序 重点小结 1. 数据库系统概述 数据库…

当OpenHarmony遇上OpenEuler

1、 安装openEuler 虚拟机、物理机器当然都可以安装。虚拟机又可以使用WSL、或者VMWare、VirtualBox虚拟机软件&#xff0c;如果需要安装最新版本&#xff0c;建议使用后者。当前WSL只支持OpenEuler 20.03。 1.1 WSL openEuler WSL的安装都是程序员的必备技能了&#xff0c;…

掌控未来:用决策树算法揭秘胜利者的必胜策略!

掌控未来&#xff1a;用决策树算法揭秘胜利者的必胜策略&#xff01; 一、引言1.1. 决策树的定义1.2. 发展历程1.3. 当前应用概况1.4. 本文内容安排 二、决策树的基本概念2.1 节点和叶节点2.2 决策树的结构结构图示不同结构的决策树 三、决策树的算法原理3.1 基本思想3.2 核心算…

设计灵感源泉!7个令人赞叹的网页界面设计展示

网页的界面设计主要是指视觉设计和风格设计。高质量的界面更容易吸引用户的注意力&#xff0c;从而更准确地向用户传达信息。对于设计师来说&#xff0c;他们需要从高质量的作品中获得稳定的灵感&#xff0c;以帮助他们更高效地实现设计目标。在本文中&#xff0c;梳理了7个高质…

黄金价格与美元的关系变了?

在一些传统的定价框架中&#xff0c;现货黄金的价格走势取&#xff0c;决于美元的实际利率水平——实际利率越高&#xff0c;黄金价格越低&#xff0c;反之亦然。在大多数的时候&#xff0c;美元的实际利率决定了美元指数的高低所以人们通常认为&#xff0c;现货金价与美元呈反…

猫头虎推荐20个值得体验的通用大模型

猫头虎推荐20个值得体验的通用大模型 &#x1f680; 大家好&#xff0c;我是猫头虎&#xff0c;一名专注于科技领域的自媒体博主。今天是周一&#xff0c;新的开始&#xff0c;我们来深入探讨一下当前最值得体验的通用大模型。这些AI模型不仅功能强大&#xff0c;而且在各自领…

10.无代码爬虫软件做网页数据抓取流程——工作流程设置与数据预览

首先&#xff0c;多数情况下免费版本的功能&#xff0c;已经可以满足绝大多数采集需求&#xff0c;想了解八爪鱼采集器版本区别的详情&#xff0c;请访问这篇帖子&#xff1a;https://blog.csdn.net/cctv1123/article/details/139581468 八爪鱼采集器免费版和个人版、团队版下…

LLaMA Factory多卡微调的实战教程(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

利用Python语言调用讯飞星火认知大模型接口实战指南

什么是API接口 API&#xff08;应用程序编程接口&#xff09;是一组规则&#xff0c;允许不同的软件系统相互通信。通过API&#xff0c;开发者可以访问外部系统的功能和数据&#xff0c;而无需了解其内部实现。 API接口就像一座桥梁&#xff0c;连接应用程序和服务。例如&…

自动化产线设备联网,协同打造5G智慧工厂

1、需求背景 随着信息技术、物联网、人工智能等领域的飞速发展&#xff0c;智慧工厂成为制造业升级和转型的关键方向。在智慧工厂中&#xff0c;产线设备之间的实时通信和协同操作可以提高整个生产流程的自动化水平。 提升生产效率 通过稳定的网络连接&#xff0c;保证设备之…

Python工具箱系列(五十三)

​​水印 水印是一种常见的图片处理需求。当既需要展示&#xff0c;又需要保护知识产权时&#xff0c;就需要使用文字或者图片来打水印。下面的代码展示了文字水印与图片水印的过程。 ​--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown from pat…

MySQL数据库初识

目录 一.数据库相关概述 1.数据库概念 数据&#xff08;Data&#xff09; 表 数据库&#xff08;database&#xff09; 数据库管理系统&#xff08;DBMS&#xff09; 数据库系统 2.数据库系统发展史 3.数据库分类 3.1.关系数据库 3.2.非关系型数据库 二.MySQL数据库…

vue分页

先看效果 再看代码 <!-- 分页 --><div v-if"pageParams.pageCount > 1" class"flex justify-end mt-6"><n-paginationv-model:page"pageParams.page" v-model:page-size"pageParams.pageSize" :page-count"pa…

【代码随想录】【算法训练营】【第41天】 [416]分割等和子集

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 40&#xff0c;休息&#xff0c;休息一下~ day 41&#xff0c;艰难的周一~ 题目详情 [416] 分割等和子集 题目描述 416 分割等和子集 解题思路 前提&#xff1a;是否可以将数组分为和相等的…