X86架构下SSE系列指令使用

从SSE迁移到NEON:一份给x86老手的Arm平台SIMD优化指南(附sse2neon使用心得) 本文为x86开发者提供了从SSE迁移到NEON的详细指南,涵盖架构差异、sse2neon工具使用及性能优化策略。通过对比SSE与NEON的核心特性,解析指令集转换技巧,并分享内存访问和指令级并行等深度优化方法,帮助开发者在Arm平台上实现高效的SIMD性能优化。 阅读详情
X86架构下SSE系列指令使用


sse指令集中的指令,一条指令可以实现多项数据运算,即SIMD-Single Instruction Multiple Data。
相关资料可参考:
http://blog.chinaunix.net/uid-20385936-id-3902720.html 
http://blog.youkuaiyun.com/fengbingchun/article/details/18460199 


下面的简短示例代码,函数f1使用sse实现了两个数组的累加:array_c = array_a + array_b;
#include <stdio.h>
#include <emmintrin.h>


int array_a[4] __attribute__ ((aligned (128))) = {1,2,3,4};
int array_b[4] __attribute__ ((aligned (128))) = {3,7,2,1};
int array_c[4] __attribute__ ((aligned (128)));


void f1(void *a, void *b, void *c)
{
    __m128i big1 = _mm_load_si128((__m128i *)(a));
    __m128i big2 = _mm_load_si128((__m128i *)(b));
    __m128i big3 = _mm_add_epi16(big1,big2);
    _mm_store_si128((__m128i *)c,big3);
}


int main()
{
    int i;
    f1(array_a, array_b, array_c);


    for (i=0;i<4;i++)
    {
        printf("%d ", array_c[i]);
    }
    
    return 0;
}




编译运行效果:
# gcc test.c -msse2 -O2 
# ./a.out 
4 9 5 5


再看看函数f1的汇编代码,真是相当简单,3条指令就完成了数组的累加


0000000000400570 <f1>:
<span style="color:#ff0000;">  400570:	66 0f 6f 07          	movdqa (%rdi),%xmm0
  400574:	66 0f fd 06          	paddw  (%rsi),%xmm0
  400578:	66 0f 7f 02          	movdqa %xmm0,(%rdx)</span>
  40057c:	c3                   	retq   
  40057d:	0f 1f 00             	nopl   (%rax)


若要使用SSE指令,需要在编译选项中增加-msse2(或-msse3, 或-msse4),当启用了高版本的的选项时,低版本的选项也就同时自动启用了。
当启用了-msse系列的选项时,编译器就可以编译使用了加速指令的嵌入式汇编代码,也可以针对代码中调用的sse系列的bultin函数(例如int __builtin_ia32_comisdgt (v2df, v2df))生成相应的sse指令代码。
如何让源代码同时适应启用与不启用-msse系列选项的情况呢?
当gcc编译命令中带了-msse系列选项时,会有相应的预定义的宏存在。
通过如下命令,就能知道,启用-msse4时,编译器会预定义哪些sse相关的宏,这就告诉了编码者,当前编译启动了何种sse。
从输出也能看出,启用高级别的sse时,低级别的sse也就自动打开了。
# gcc  -dM  -E  -msse4 - <<<''  | grep SSE
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSSE3__ 1
#define __SSE__ 1
#define __SSE3__ 1


如何在代码中使用sse相关指令呢?
要么自己写嵌入式汇编代码,
要么调用相关的builtin函数(不同级别的sse有不同的builtin函数集,这些函数在编译时自动生成sse指令代码),
要么#include <emmintrin.h>并使用其中声明的接口。


通过查看/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/emmintrin.h的内容,可以发现,这个头文件,实际上是将sse2系列的相关builtin函数进行了包装。这样的话,如果直接使用emmintrin.h中的接口,相当于只能使用到sse2级别的加速指令。
17、MMX技术编程与X86-SSE流SIMD扩展 本文详细介绍了MMX技术编程和x86-SSE流SIMD扩展的基本概念、编程实现及其性能优势。通过示例程序MmxCalcMinMax和MmxCalcMean展示了MMX指令如何提升整数数组处理的性能,并分析了使用汇编语言实现高效SIMD算法的关键技术。此外,还概述了x86-SSE的发展历程、寄存器集、数据类型和控制状态机制,并通过简单示例说明了SSE在单精度浮点加法中的应用。文章强调了在实际开发中充分利用SIMD架构的重要性,并展望了其未来的发展潜力。 阅读详情

相关推荐

车载处理器系统的架构区分

车载主要有三种处理器:PowerPC / X86 /ARM

weixin_43084908的博客 734

C++17中在CMake配置中添加-msse4支持的步骤

重新运行CMake:在修改了`CMakeLists.txt`之后,需要重新运行CMake来配置项目。请注意,`-msse4`是一个GCC和Clang特有的选项,用于启用对SSE4指令集的支持。如果你使用的是其他编译器,比如MSVC,这个选项可能不适用。此外,确保你的CPU支持SSE4指令集,否则这个选项可能不会带来任何性能提升,甚至可能导致编译错误。:首先,确保你已经设置了C++的编译标准,如你已经做的那样,设置为C++17。在CMake中设置编译选项,包括特定的CPU指令集支持,如。

chaisxp的博客 6971

x86 指令集,sse,等

x86指令集介绍,包括sse,帮助开发人员更快的进行sse编程,基于intel的平台。sse4.2

aarch64架构编译pyECO过程中报错,找不到emmintrin.h

emmintrin.h这个头文件,本身不是在aarch64中使用的指令集,需要将其改写为neon的代码,即在arm架构下可以使用的指令集。 这一步操作,英特尔提供了相应的函数sse2neon.h。 sse2neon.h的使用方法很简单,先将其放入/usr/local/include或者/usr/include或者你的代码工程下,总之就是要能调用到,而后修改代码中原本的#include <emmintrin.h>为#include <sse2neon.h>即可使用。 sse2neon

yiyayi1的博客 1244

petalinux i2c的配置

1.硬件平台配置 1.内核配置 cd petalinux-config -c kernel -> Device Drivers -> I2C support -> i2C Hardware Bus support -> Xilinx I2C Controller Pressing 启用CONFIG_I2C_XILINX=y 2.修改用户设备树 cd cd project-spec/meta-user/recipes-bsp/device-tree/files/ i2c2:

u013403954的博客 4313

优雅谈大模型:“System2”与“System 1”

研究人员探索了三种System 2方法——RaR、S2A 和 BSM,这些方法已经成功提炼到新的LLM,这个新的模型与System 1相比,产生了更好的结果,而且成本低于System 2。然而这种方法是有局限性,只能适用于特定的任务。

鲁班模锤 5165

在C/C++代码中使用SSE等指令集的指令(1)介绍

我们知道,在C/C++代码中,可以插入汇编代码提高性能。现在的指令集有了很多的高级指令,如果我们希望使用这些高级指令来实现一些高效的算法,就可以在代码中嵌入汇编,使用SSE等高级指令,这是可行的,但是如果对汇编不太熟悉,不愿意使用汇编的人来说,其实也是可以的,这就是Compiler Intrinsics(http://msdn.microsoft.com/zh-cn/site/26td21ds)。PS:下面的内容以Windows平台为主,对于Linux下,也有类似的方法。(1)什么是IntrinsicsIn

sinat_22510827的博客 743

LTE随机接入实战:如何通过PRACH前导码优化小区覆盖半径(附计算公式)

本文深入探讨了LTE网络中PRACH前导码格式对小区覆盖半径的关键影响。通过解析不同前导码格式(如Format 0-3)的物理参数与覆盖能力,提供了核心计算公式与实战Python脚本,指导网络工程师根据覆盖需求、环境多径和容量等因素,科学选择前导码格式以优化边缘用户接入成功率,实现精准的网络规划与优化。

qq_27496129的博客 576

SSE 指令 gcc编译

Intel SSE指令,目前很多机器都支持,Pentium 4机器支持到SSSE3,双核机器现在支持到了4.1和4.2,在使用gcc编译器 进行编译时,X86机器需要添加-msse或者是-msse4,根据具体的机器CPU决定。在使用时发现了一个问题:      指令:_mm_set_epi32   (对应为SSE2指令)     当采用-msse4编译 _mm_set_epi32,   虽然这

Start from here 5004

深入分析大众点评 Ajax 接口:直接请求 JSON 数据高效获取评论

大众点评网站采用前后端分离架构,通过Ajax接口动态加载数据。按F12打开开发者工具,切换到Network(网络)面板。实际环境中,我们需要使用Python重现这一加密逻辑。查看请求响应,寻找包含评论数据的JSON接口。参数是大众点评的反爬机制核心,需要特别处理。:尊重网站的robots.txt文件规定。:仅将数据用于合法合规的研究和分析目的。:不侵犯大众点评的商业秘密和知识产权。打开大众点评网站,进入任意商户页面。:对采集到的用户信息进行脱敏处理。:避免对目标网站造成过大负担。

Z_suger7的博客 1586

销售预测的方法与模型(三)丨安全库存与再订货(补货)

较高的 Z 值对应较高的服务水平(例如,服务水平 99% 对应 Z 值 2.33),意味着企业希望更低的缺货风险,因此需要更高的安全库存。在再订货点的管理中,考虑到供应商交货的不确定性,通常需要结合安全库存,以防止在交货期间库存用尽。要对L开根号,根号L表示交货周期越长,企业需要的安全库存越多,因为在较长的供应期内,需求波动的累积效应更明显。举例:供应商的交期服从标准差为2件/天的正态分布,顾客需求为50件/天的正态分布,若要客户服务水平达到 90%,安全库存量应该是多少?下面介绍几种核心的模型与公式。

weixin_45675709的博客 1535

2020-04-01 SSE4.2 #include <x86intrin.h> #include <smmintrin.h>

#ifndef __SSE4_2__ #pragma GCC push_options #pragma GCC target("sse4.2") #define __DISABLE_SSE4_2__ #endif /* __SSE4_1__ */ /* Accumulate CRC32 (polynomial 0x11EDC6F41) value. */ extern __in...

阿群的笔记(同步备份自简书) 1292

Vitis Model Composer闪退?手把手教你用命令行启动Vivado 2021后的System Generator

本文详细解析了Vitis Model Composer闪退问题的根本原因,并提供了命令行启动Vivado 2021后System Generator的完整解决方案。从环境变量配置、组件缺失排查到权限问题处理,手把手教你通过命令行深度排错,并分享高级自动化脚本和系统优化技巧,帮助开发者高效使用Vitis Model Composer与System Generator进行HDL开发。

weixin_26905487的博客 349

c语言怎么调用sse指令,X86架构下SSE系列指令使用

X86架构下SSE系列指令使用sse指令集中的指令,一条指令可以实现多项数据运算,即SIMD-Single Instruction Multiple Data。相关资料可参考:http://blog.chinaunix.net/uid-20385936-id-3902720.htmlhttp://blog.csdn.net/fengbingchun/article/details/18460199...

weixin_29722783的博客 999

SIGIR 2026:信息检索前沿技术与投稿指南

信息检索(Information Retrieval, IR)是计算机科学中处理大规模数据检索的核心技术,其基本原理是通过算法模型从海量数据中高效提取相关信息。随着深度学习的发展,神经信息检索(Neural IR)和多模态检索成为研究热点,如稠密检索模型(DPR)和跨模态预训练(CLIP)等技术的应用显著提升了检索精度。这些技术不仅在学术领域具有重要价值,还在电商搜索、医疗检索等实际场景中展现出巨大潜力。SIGIR作为信息检索领域的顶级会议,汇聚了全球顶尖学者和工业界专家,是展示最新研究成果的重要平台。本文

weixin_29189363的博客 291

基于Freertos与lwip移植FreeModbusTcp协议

基于FreeRTOS的N32G457VEL7之LWIP网络协议栈移植-优快云博客。

Dd_456456的博客 3239

x86系列CPU寄存器和汇编指令总结

本文介绍了x86系列cpu的发展及其寄存器作用、x86 cpu汇编指令、nasm汇编介绍等

weixin_38597669的博客 2459

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[x86]SIMD指令集发展历程表(MMX、SSE、AVX等)

自1996年的MMX指令集以来,Intel和AMD不断为x86体系添加新的SIMD指令集。时至2012年,Intel的Ivy Bridge即将发布,这16年来SIMD指令集有了哪些发展呢?于是我决定整理一份SIMD指令集的发展历程表。 通过阅读Intel和AMD的手册,以及搜索网上资料,我初步完成了这项工作。表格如下—— 指令集 条 Date ICPU IDate A

zyl910的专栏 3292

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMD理解和学习入门资源

SIMD 学习CPU的全称是“中央处理单元”,它是计算机的核心,计算都由它完成。不同的CPU架构有不同的指令集(汇编),彼此不通用这就导致运行在上面的软件不兼容,必须重新编译。如果没有做适配,一个架构下的软件就无法移植到另一个架构。 目前市面上的CPU架构主要分为X86架构和arm架构。 intel 与 amd 厂商使用的是基于X86架构的CPU,X86架构使用的是复杂指令集即指令一步到位,而arm使用的是精简指令集即指令由几个指令完成。 X86架构性能好,但是耗电多、电压高,主要用于桌面合服务器。 然而A

tony365的博客 974

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

第40部分-Linux x86 64位汇编 Intel向量指令历史

第40部分-Linux x86 64位汇编 Intel向量指令历史 SIMD主要是四种技术: 多媒体扩展(MMX, Multimedia Extension) 流化SIMD扩展(SSE,Streaming SIMD Extension) 流化SIMD扩展第二实现(SSE2, Streaming SIMD Extension Second Implementation) 流化SIMD扩展第三年实现(SSE3,Streaming SIMD Extension Third Implement) SIM

badman250的专栏 818

x86util.asm

;***************************************************************************** ;* x86util.asm ;***************************************************************************** ;* Copyright (C) 2008-2010 ...

蕉竹斋 474

高级向量扩展指令集(英語:,简称AVX)是x86架构微处理器中的指令

(英語:,简称)是x86架构中的,由英特尔在2008年3月提出,并在2011年第一季度发布的系列处理器中首次支持。AMD在随后的2011年第三季度发布的Bulldozer系列处理器中开始支持AVX。AVX指令集提供了新的特性、指令和编码方案。AVX是指令集的SSE延伸架構,如IA16至IA32般的把暫存器XMM 128bit提升至YMM 256bit,以增加一倍的運算效率。此架構支持了三運算指令(3-Operand Instructions),減少在編碼上需要先複製才能運算的動作。

1323

从x86到ARM,代码移植指北

最近ARM架构的处理器从云到端全面开花,比如苹果MAC上的ARM架构处理器M1 MAX就堪称王炸,华为的鲲鹏系列ARM处理器也已经稳定服务了很长时间,目前业内有口皆碑,因此基于x86环境编写的程序也都需要考虑迁移到ARM架构上去,以适应扑面而来的ARM热潮。 针对这个迁移工作笔者进行了一些预研工作。从目前的情况看基于Java、Python等高级语言开发的程序是很容易移植的,问题的关键在于不少Java的包是调用C语言代码的,这时候就要考虑 .so 的动态库移植及内联的汇编语言移植,其中要点如下。 C语..

Python爱好者的专栏 5712

FASM v 1.67 by Tomasz Grysztar

Description:The flat assembler is a fast and efficient self-assembling 80x86 assembler for DOS, Windows and Linux operating systems. Currently it supports all 8086-80486/Pentium instructions with MM

Linhanshi Blog 1003

FASM v 1.67.25

 Description:The flat assembler is a fast and efficient self-assembling 80x86 assembler for DOS, Windows and Linux operating systems. Currently it supports all 8086-80486/Pentium instructions with

Linhanshi Blog 722

终极汇编编程神器:AsmDude2让Visual Studio变身专业汇编IDE

AsmDude2是一款基于语言服务器协议(LSP)构建的Visual Studio扩展,专为汇编语言开发打造。它将Visual Studio 2022转变为功能强大的汇编IDE,提供语法高亮、代码补全、签名帮助和指令描述等专业功能,让汇编编程变得前所未有的高效与便捷。 ## 🌟 AsmDude2核心功能解析 ### 🚀 一键开启汇编开发环境 AsmDude2作为轻量级VS2022扩展,通

gitblog_00937的博客 365
上一篇: 小兵以太网测试仪Linux版(Linux发包工具)使用说明
下一篇: 通过telnet查看程序中的变量及执行调试函数
无忧老猪
博客等级 码龄18年 200粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值