单线程、SSE、AVX运行效率对比——加法运算

C++ AVX向量化编程实战:从基础指令到矩阵乘法优化 SIMD(单指令多数据)是一种并行计算技术,它允许CPU使用一条指令同时对多个数据执行相同操作,从而大幅提升数据密集型任务的执行效率。其核心原理是通过扩展的向量寄存器,将多个标量数据打包成一个向量进行处理。这项技术的核心价值在于能充分利用现代CPU的并行计算单元,显著提升科学计算、图像处理、物理模拟等场景下的性能。在C++中,开发者可以通过Intrinsic函数直接调用AVX等SIMD指令集,实现手动向量化优化。本文以浮点运算和矩阵乘法为例,详细讲解了如何利用AVX指令集进行环境配置、核心指令编程及性能调优 阅读详情
使用Intrinsics函数操作SIMD指令集——头文件查找表
头文件指令集描述
intrin.hAll Architectures
mmintrin.hMMX
xmmintrin.hSSE
emmintrin.hSSE2
pmmintrin.hSSE3
smmintrin.hSSE4.1
nmmintrin.hSSE4.2
immintrin.hAVX

math_function.h

#pragma once

#include <immintrin.h>
#include <stdio.h>

float MathSum(const float *input, int size);
float SSESum(const float *input, int size);
float AVXSum(const float *input, int size);

math_function.cpp

#include "math_function.h"

float MathSum(const float *input, int size)
{
	float output = 0.0;
	for (int i = 0; i < size; i++)
	{
		output += input[i];
	}
	return output;
}

float SSESum(const float *input, int size)
{
	if (input == nullptr)
	{
		printf("input data is null\n");
		return -1;
	}
	int nBlockWidth = 4;
	int cntBlock = size / nBlockWidth;
	int cntRem = size % nBlockWidth;

	float output = 0;
	__m128 loadData;
	__m128 sumData = _mm_setzero_ps();
	const float *p = input;
	for (int i = 0; i < cntBlock; i++)
	{
		loadData = _mm_load_ps(p);
		sumData = _mm_add_ps(sumData, loadData);
		p += nBlockWidth;
	}
	sumData = _mm_hadd_ps(sumData, sumData); // p[0] + p[1] + p[4] + p[5] + ...
	sumData = _mm_hadd_ps(sumData, sumData); // p[2] + p[3] + p[6] + p[7] + ...
	output += sumData.m128_f32[(0)];         // 前4组

	for (int i = 0; i < cntRem; i++)
	{
		output += p[i];
	}

	return output;
}

float AVXSum(const float *input, int size)
{
	if (input == nullptr)
	{
		printf("input data is null\n");
		return -1;
	}
	int nBlockWidth = 8;
	int cntBlock = size / nBlockWidth;
	int cntRem = size % nBlockWidth;

	float output = 0;
	__m256 loadData;
	__m256 sumData = _mm256_setzero_ps();
	const float *p = input;
	for (int i = 0; i < cntBlock; i++)
	{
		loadData = _mm256_load_ps(p);
		sumData = _mm256_add_ps(sumData, loadData);
		p += nBlockWidth;
	}
	sumData = _mm256_hadd_ps(sumData, sumData); // p[0] + p[1] + p[4] + p[5] + p[8] + p[9] + p[12] + p[13] + ... 
	sumData = _mm256_hadd_ps(sumData, sumData); // p[2] + p[3] + p[6] + p[7] + p[10] + p[11] + p[14] + p[15] + ... 
	output += sumData.m256_f32[(0)];            // 前4组
	output += sumData.m256_f32[(4)];            // 后4组

	for (int i = 0; i < cntRem; i++)
	{
		output += p[i];
	}

	return output;
}

main.cpp

#include "math_function.h"
#include <time.h>

int main(int argc, char* argv[])
{
	int size = 27;
	float *input = (float *)malloc(sizeof(float) * size);
	for (int i = 0; i < size; i++)
		input[i] = 0.0025;

	int cntLoop = 300000000;
	clock_t start_t = clock();
	float org = 0.0;
	for (int i = 0; i < cntLoop; i++)
		org = MathSum(input, size);
	printf("org = %f\t", org);
	printf("cost time: %d\n", clock() - start_t);

	start_t = clock();
	float sse = 0.0;
	for (int i = 0; i < cntLoop; i++)
		sse = SSESum(input, size);
	printf("sse = %f\t", sse);
	printf("cost time: %d\n", clock() - start_t);

	start_t = clock();
	float avx = 0.0;
	for (int i = 0; i < cntLoop; i++)
		avx = AVXSum(input, size);
	printf("avx = %f\t", avx);
	printf("cost time: %d\n", clock() - start_t);

	getchar();
	free(input);

	return 0;
}

运行结果

测试硬件:CPU-i7-9700K

预处理器:_WINDOWS

命令行:/arch:AVX 

优化项:/O2

任何问题请加唯一QQ2258205918(名称samylee)!

或唯一VX:samylee_csdn

英特尔Nova Lake全面支持AVX-512:SIMD指令集的技术解析与开发实践 SIMD(单指令多数据)是CPU并行计算的核心技术,通过单条指令同时处理多个数据元素实现性能飞跃。其原理基于向量寄存器扩展,如AVX-512的512位寄存器可并行处理16个32位浮点数。这种技术价值在于显著提升计算密集型任务的吞吐量,广泛应用于科学计算、AI推理和媒体处理等领域。以英特尔Nova Lake架构为例,其P核与E核统一支持AVX-512指令集,解决了混合架构的兼容性问题。开发者可通过掩码寄存器和向量冲突检测等特性优化矩阵运算和神经网络推理,在高性能计算和游戏开发等场景实现性能突破。 阅读详情

相关推荐

实测对比:基于AMD Zen架构的海光CPU,在国产化服务器上性能表现如何?

本文通过实测对比海光C86-7380 CPU与Intel Xeon Gold 6348、AMD EPYC 7763在国产化服务器中的性能表现,揭示其在基础算力、业务场景和能效比方面的优势。海光处理器在SPEC CPU 2017多线程测试中表现优异,TPC-C数据库负载下吞吐量提升8%,且能效比显著优于x86平台,为国产化替代提供可靠选择。

weixin_28745067的博客 683

Intel 内部指令 --- AVX和AVX2学习笔记

AVX编程基础 数据类型 数据类型 描述 __m128 包含4个float类型数字的向量 __m128d 包含2个double类型数字的向量 __m128i 包含若干个整型数字的向量 __m256 包含8个float类型数字的向量 __m256d 包含4个double类型数字的向量 __m256i 包含若干个整型数字的向量 每一种类型,从2个下划线开头,接一个m,然后是vector的位长度。 如果向量类型是以d结束的,那么向量里面是double类型的数字。如果没有后

sinat_22510827的博客 5855

FFTW3库编译优化指南:如何利用SIMD和多线程提升性能

本文详细介绍了FFTW3库的编译优化方法,重点讲解如何利用SIMD指令集和多线程技术提升性能。通过精确配置编译参数和运行时调优策略,开发者可以在数字信号处理和科学计算中获得数倍的性能提升。文章涵盖硬件检测、指令集优化、多线程并行实现等关键内容,帮助用户充分发挥FFTW3的潜力。

weixin_28834765的博客 420

Intel 内部指令---AVX编程基础

AVX编程基础 一、数据类型 数据类型 描述 __m128 包含4个float类型数字的向量 __m128d 包含2个double类型数字的向量 __m128i 包含若干个整型数字的向量 __m256 包含8个float类型数字的向量 __m256d 包含4个double类型数字的向量 __m256i 包含若干个整型数字的向量 每一种类型,从2个下划线开头...

线上幽灵 7498

LinX拷机程序深度测评:全面测试CPU浮点运算性能

我见过太多人拿着LinX跑了十分钟就说“我的CPU稳了”,然后第二天打游戏蓝屏重启……醒醒吧朋友!📌LinX只是众多压力测试工具之一。它擅长暴露浮点运算、散热设计、供电能力方面的问题,但对于以下场景覆盖不足:- 整数密集型负载(如压缩、编码)- 显存压力(GPU相关)- 磁盘I/O瓶颈- 多进程并发调度因此,完整的稳定性验证应该组合多种工具:→ 检验AVX稳定性与VRM负载→ 全面拷机→ 内存与缓存压力。

weixin_35257663的博客 764

Qt界面编程(三)—— 父子关系、对象树、信号和槽(自定义信号和槽、Qt5与Qt4的写法)

Qt框架默认提供的标准信号和槽不足以完成我们日常应用开发的需求,比如说点击某个按钮让另一个按钮的文字改变,这时候标准信号和槽就没有提供这样的函数。但是Qt信号和槽机制提供了允许我们自己设计自己的信号和槽。声明在类的signals域下没有返回值,void类型的函数只有函数声明,没有定义可以有参数,可以重载通过emit关键字来触发信号,形式:emit object->sig(参数);

此心光明事上练的博客 1695

稀疏矩阵加法_使用avx2加速稀疏矩阵推理

原始代码是循环累加和,计算效率较低,运行速度慢,可以考虑使用avx2指令集,实现计算加速。原始计算过程如下:weight为稀疏矩阵,内存不连续,存储方式为value-index(coo、crs、csc等),稀疏矩阵的存储​www.jianshu.comSPARSE_GROUP_SIZE表示模型进行稀疏训练时,稀疏块的大小,可以设为4/8/16等,从weight中每次取SPARSE_GROUP_SI...

weixin_39971172的博客 683

cellranger安装以及使用

接受cellranger count的输出数据,将同一组的不同测序样本的表达矩阵整合在一起,比如tumor组原来有4个样本,PBMC组有两个样本,现在可以使用aggr生成最后的tumor和PBMC两个矩阵,并且进行标准化去掉测序深度的影响。但是由于病毒基因组太小了,且注释结果只有CDS没有exon,所以曲线救国,将CDS整体替换为exon,也不进行过滤了,直接下一步。虽然安装完毕,但是现在要运行cellranger的话需要在终端输入cellranger的整个路径。自动执行这个命令,需要将“

m0_59974475的博客 9393

AVX2指令

一、数据类型 SSE指令有3种数据类型,分别为__m256、__m256i、__m256d。每一种类型都以"__"+"m"+“vector的位长度”构成。 __m256 包含8个float类型数据的向量 __m256i 包含若干个整型数据的向量,如char、short、int、unsigned long long等。例如256位的vector可以32个char、16个short、8个int,这些整型既可以是有符号的也可以是无符号的。 ...

fyire的博客 7743

解构LOL数值平衡:从基础公式到实战决策的深层逻辑

本文深入解析了《英雄联盟》数值平衡的底层逻辑,从基础攻击力公式到经济系统设计,揭示了MOBA游戏背后的精密数学架构。通过实战案例展示护甲减伤、技能伤害建模等核心机制,探讨装备定价与战斗节奏的数值关联,帮助玩家理解版本更新中的平衡艺术。

weixin_42540248的博客 347

如何让 RTX 5090 开启 PCIE P2P 以加速多卡通信

RTX 5090 基于新的 Blackwell 架构。NVIDIA 出于对某些主板兼容性(如 IOMMU、Resizable BAR 策略)的保守考虑,**屏蔽了 5090 的 BAR1 P2P 功能**。 我们需要通过 Patch 驱动源码,强制开启这一隐藏功能。 开启 P2P 后,PyTorch 的集合通信算子(Multi-GPU 训练的核心)延迟显著降低,**All-Reduce 甚至降低了 60% 以上**。

Hi20240217的博客 1717

SSE/AVX SIMD编程

SIMD函数的Intel官网 AVX和AVX2指令的介绍 我调用的是函数,不是汇编指令(special C functions calledintrinsic functions) 每个函数实际调用的可能不止1个指令,例如_mm256_fmadd_ps后面实际调用了3个函数 函数命名规则:_mm<bit_width>_<name>_<data_type&gt...

smartcat2010的博客 2611

2021年J题:基于STM32F103的周期信号波形识别与参数测量系统设计(立创EDA+SZPT_ZXL)

本文详细复盘了2021年全国大学生电子设计竞赛J题获奖项目,手把手教你如何基于STM32F103微控制器设计并实现周期信号波形识别与参数测量系统。文章深入剖析了硬件电路设计(包括程控放大、工作点抬升与滞回比较器)与核心软件算法(如动态采样、FFT频谱分析与波形识别逻辑),并分享了DMA传输、FFT库使用等实战要点与避坑指南,为嵌入式信号处理与电赛备赛提供了宝贵经验。

weixin_32673065的博客 227

单线程、SSE、AVX运行效率对比——最大值/最小值运算

前言 单列数组下,AVX比SSE稍慢! math_function.h #pragma once #include <immintrin.h> #include <stdio.h> float MathMax(const float *input, int size); float SSEMax(const float *input, int size); fl...

samylee的博客 7896

从UE4到Unity:双叶高光技术在角色皮肤渲染中的移植全流程

本文详细解析了将UE4中的双叶高光技术移植到Unity引擎的全流程。该技术通过模拟皮肤油脂层和真皮层的不同反射特性,能显著提升角色皮肤渲染的真实感。文章从核心原理、贴图资产处理、Shader代码重构到参数调校,提供了完整的跨引擎移植实战指南,帮助开发者实现高质量的皮肤质感还原。

alice7model的博客 477

IEEE S&P 2026 大模型安全论文整理

本文梳理了 IEEE S&P 2026(第47届 IEEE 安全与隐私研讨会)中与 LLM Safety 相关的论文,涵盖大模型越狱攻击、防御与对齐、隐私保护、RAG 安全、多模态大模型安全、智能体安全、图-LLM 安全、工具链安全及生成式 AI 安全与隐私等方向。

CSPhD-winston的博客 1331

单线程、SSE、AVX运行效率对比——乘法累加运算

前言 _mm_fmadd_ps执行效率比_mm_mul_ps +_mm_add_ps快! 同样_mm256_fmadd_ps也是如此! math_function.h #pragma once #include <immintrin.h> #include <stdio.h> float MathMulAdd(const float *input1, con...

samylee的博客 5760

基于STM32设计的物联网疫苗冷链物流监测系统

本设计基于物联网技术,开发了一套疫苗冷链物流环境监测系统。系统采用STM32F103C8T6作为主控芯片,集成SHT30温湿度传感器、震动传感器、GPS定位模块和4G通信模块,实现对运输环境的温度、湿度及震动状况的实时监测与控制。通过继电器驱动半导体制冷模块和加湿器,系统能够自动调节环境温湿度,保障疫苗运输的安全性。采集的环境数据通过MQTT协议上传至华为云物联网平台,配套开发的Android手机APP和Windows上位机软件基于Qt平台设计,支持远程实时查看环境数据和车辆定位,提升了疫苗冷链运输的智能化

862

效率对比:分别用 C++Amp,C++ PPL,SSE/AVX,Serial(串行)计算矩阵乘法。

本次测试矩阵乘法未作分块优化。 未使用cuda测试。 采用微妙级的计时器。 分别对16阶方矩阵到4048阶方阵采用如下方式做乘法计算,统计结果。 C++Amp(GPU), C++PPL(多线程16核), SSE/AVX(单线程), AVX-Db(单线程,双精度), Serial(单线程串行) 时间统计如下(单位:秒) Rank : 16 32 64 128 256 512 10...

carlclouder的博客 2382

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SSE 优化

SSE 是Intel公司的单指令多数据流式扩展(SSE,Streaming SIMD Extensions)技术能够有效增强CPU浮点运算的能力。 在写算法的过程中可以对算法进行提速。 参考如下: https://www.cnblogs.com/Imageshop/category/535367.html https://www.cnblogs.com/mqxs/p/3715832....

vicavo的专栏 1899

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

英特尔AVX指令集解析

  Sandy Bridge和Larrabee架构新指令集  Intel的微架构也进入了全速发展的时期,在刚刚结束的IDF峰会上Intel公司就发布了2010年的RoadMap。2010年Intel也将发布全新的处理器微架构Sandy Bridge,其中全新增加的指令集也将带来CPU性能的提升。  Intel公司将为Sandy Bridge带来全新的指令扩展集Intel Ad...

weixin_33851604的博客 1192

gemmlowp性能调优指南:7个关键技巧提升计算效率

gemmlowp是一款专注于低精度矩阵乘法的高性能计算库,通过优化算法和硬件利用,为移动设备和嵌入式系统提供高效的矩阵运算支持。本文将分享7个实用技巧,帮助开发者充分发挥gemmlowp的计算潜力,显著提升应用性能。 ## 1. 启用SIMD指令集加速 gemmlowp针对不同架构提供了SIMD优化实现,包括ARM NEON、x86 AVX/SSE和MIPS MSA。通过启用这些指令集,可以大

gitblog_00849的博客 1041

高精度高性能PI值计算程序设计和验证

一、PI的计算方法 程序中实现了4类14种PI的计算方法,每种方法都实测过,确保计算结果的准确性,所有方法至少试验过1~10万位的求解,输出有效数字完全相同,并与y-cruncher等标准程序输出结果进行了对照。 Method 1-7为类Machin公式,也就是反正切函数的Taylor级数;程序中实现了传统累加法和P2B3模型法(P2B3模型的含义在后面章节有专门介绍) Method 10-16为类BBP级数,包括标准BBP级数、Fabrice Bellard级数,程序实现了传统累加法和P2B3/BB

zhangfuliang93的博客 2645

加速图像处理的神器: Intel ISPC编译器 (一) ISPC简介

最近刷到这么一篇教程 使用SIMD利器ISPC加速游戏开发 简单的上手摸了一下,发现这是个神器,可以帮助我把自己写的单线程的基于C/C++的图像算法编译成SIMD的版本,这样就省得自己手工写SIMD汇编了;同时编译器级的自动优化效率也非常的高,比自己绞尽脑汁的手工调整代码顺序的优化要方便多了 :) 这里强烈的安利一下 :) ISPC相对其他编译器的优势 这里用一段简单的代码对比一下ISPC和MSVC的效率 先看MSVC 首先上一段C代码 代码逻辑就是简单的从vin buff..

sandmangu的专栏 7325

C++矩阵运算太慢?这4种现代优化方法你绝不能错过

提升C++数值计算性能?掌握矩阵运算的4种现代优化方法,涵盖SIMD向量化、表达式模板、内存布局优化与并行计算,显著加速科学计算与工程仿真场景。C++数值计算优化实战技巧,值得收藏。

simcode的专栏 558

waifu2x-converter-cpp多线程优化:线程池与SIMD指令集性能调优终极指南

waifu2x-converter-cpp是一款强大的图像超分辨率工具,通过深度学习算法将低分辨率图片转换为高清版本。本文将深入探讨该项目的多线程优化技术,特别是线程池设计与SIMD指令集的性能调优策略,帮助用户充分挖掘硬件潜力,实现图像处理速度的极致提升。🚀 ## 📊 为什么需要性能优化? waifu2x-converter-cpp的核心功能是基于卷积神经网络(CNN)的图像处理,这种计

gitblog_00432的博客 370
上一篇: LCNN_SSD(Open Source)
下一篇: 单线程、SSE、AVX运行效率对比——乘法累加运算
samylee
博客等级 码龄11年 585粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值