SSE加速随笔

news2024/11/28 16:42:09

Intel® Intrinsics Guide

搞懂SSE

寄存器与指令数据细节

        SSE指令集推出时,Intel公司在Pentium III CPU中增加了8个128位的SSE指令专用寄存器,称作XMM0到XMM7。这些XMM寄存器用于4个单精度浮点数运算的SIMD执行,并可以与MMX整数运算或x87浮点运算混合执行。

        2001年在Pentium 4上引入了SSE2技术,进一步扩展了指令集,使得XMM寄存器上可以执行8/16/32位宽的整数SIMD运算双精度浮点数的SIMD运算。对整型数据的支持使得所有的MMX指令都是多余的了,同时也避免了占用浮点数寄存器。SSE2为了更好地利用高速寄存器,还新增加了几条寄存指令,允许程序员控制已经寄存过的数据。这使得 SIMD技术基本完善。

        SSE3指令集扩展的指令包含寄存器的局部位之间的运算,例如高位和低位之间的加减运算;浮点数到整数的转换,以及对超线程技术的支持。

AVX是Intel的SSE延伸架构,把寄存器XMM 128bit提升至YMM 256bit,以增加一倍的运算效率。

数据结构

        由于通常没有内建的128bit和256bit数据类型,SIMD指令使用自己构建的数据类型,这些类型以union实现,这些数据类型可以称作向量,一般来说,MMX指令是__m64 类型的数据,SSE是__m128类型的数据等等

  • 每一种类型,从2个下划线开头,接一个m,然后是向量的位长度。
  • 如果向量类型是以d结束的,那么向量里面是double类型的数字。如果没有后缀,就代表向量只包含float类型的数字。
  • 整形的向量可以包含各种类型的整形数,例如char,short,unsigned long long。也就是说,__m256i可以包含32个char,16个short类型,8个int类型,4个long类型。这些整形数可以是有符号类型也可以是无符号类型

内存对齐

        为了方便CPU用指令对内存进行访问,通常要求某种类型对象的地址必须是某个值K(通常是2、4或8)的倍数,如果一个变量的内存地址正好位于它长度的整数倍,我们就称他是自然对齐的。

通常对于各种类型的对齐规则如下:

数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
联合 :按其包含的长度最大的数据类型对齐。
结构体: 结构体中每个数据类型都要对齐

对于SIMD的内存对齐是指__m128等union在内存中存储时的存储方式。

        对于各成员变量来说,存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数,各成员变量在存放的时候根据在结构中出现的顺序依次申请空间, 同时按照上面的对齐方式调整位置, 空缺的字节自动填充。

对于整个结构体来说,为了确保结构的大小为结构的字节边界数(即该结构中占用最大的空间的类型的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

intel官网

https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html

解决报错

SSE采用“接-化-发”原理

寄存器接收 

__m128i _mm_loadu_si128 (__m128i const* mem_addr)

处理转化
__m128i _mm_cvtepu8_epi16 (__m128i a)

__m256i _mm256_sub_epi16 (__m256i a, __m256i b)

......


发送出去

void _mm256_storeu_si256 (__m256i * mem_addr, __m256i a)

项目总结

大佬说:这个正常情况下用一维的就可以了,有必要的时候才用2维的

        大致意思是 公司一般用一维就够用了,因为二维的会多出来一个维度,公司的电脑是8核的 使用二维会增大好多计算量。 我理解 90%的情况是一维的

        yr:我们目前好像都是用一维的 , 我们一般都是对 row分割 . 理由大概率是这个吧 所以一般tbb对于大图像的提速会好一点

加速时会消耗内存提高速度 , 消耗内存就是空间换时间

        算法分为空间复杂度和时间复杂度,一般在工作中时间要求更高,可以改变算法逻辑,必要情况下,哪怕提高空间复杂度也要降低时间复杂度

        并发算法都是压榨设备的性能,特别是现在的多核处理器。但是如果设备性能不够高,即使很高的并发也实现不了,而且将串行修改成并行或者并发,都是要额外付出时间的,所以leader说没必要用二维度的range,就是因为公司电脑性能带不动二维,强行使用带不来较一维明显的效果,还压榨设备性能,也会造成硬件的加速老化。

        实际项目中往往牺牲内存提升速度,通过开辟更大的内存,即扩大空间复杂度。来降低算法实现的时间复杂度 所以同样的效果其实可以有很多实现方式,而且优劣分明。

加速算法主要就是在空间复杂度和时间复杂度上下文章

电脑提速从而减少浪费内存

1、tbb和OpenMP都是多线程的无法结合进行加速,尝试结合后,时间迸发;

2、tbb加速比较实用的还是lambda表达式的形式;

3、OpenMP使用需要配置VS属性:

在项目上右键->属性->配置属性->C/C++->语言->OpenMP支持,选择“是”即可。提供指向 OpenMP API 中使用的构造的链接。

4、SSE支持的数据类型是4个32位(共计128位)浮点数集合,就是C、C++语言中的float[4],并且必须是以16位字节边界对齐的。因此这也给输入和输出带来了不少的麻烦,实际上主要影响SSE发挥性能的就是不停地对数据进行复制以适用应它的数据格式。

5、用AVX指令集必须做好合适的IDE配置。

在C/C++ ->代码生成的启用增强指令集里

+++++++++++++++++++++++++++++++++++++++++++++++++++

使用注意事项

该代码段使用Intel SSE (Streaming SIMD Extensions) 指令集进行图像处理。通过看代码,它似乎对图像中的每个像素执行一些操作,具体地,它似乎是对两张图像执行了某种差异检测。

以下是我观察到的一些问题及建议:

  1. 拼写错误:
    • m_offest 应该是 m_offset。在 if (filterPtr[c] - srcPtr[c] <m_offest) 中确保变量名是正确的。
  1. 可能的内存对齐问题:
    • 当使用 _mm_loadu_si128 时,它从非对齐的内存加载数据。对于最佳性能,如果您的数据是对齐的,使用 _mm_load_si128 会更快。但这取决于 m_srcImage.ptr<const uchar>(r) 返回的数据是否已经对齐。
  1. 越界访问:
    • 在SSE循环中,确保您不会越过图像的尾部。(m_srcImage.cols) - 32 可能导致您在最后几列中丢失一些像素。但在您的代码中,之后的非SSE循环应该会处理这些,只要确保这两个循环之间没有重叠或遗漏。
  1. _x80reg_offset 未定义:
    • 代码中使用了 _x80 和 reg_offset,但没有给出其定义或赋值。这可能只是提供的代码片段的一部分,但确保这两个变量在上文中有正确的定义和初始化。
  1. 差异检测逻辑:
    • SSE循环和非SSE循环似乎有不同的逻辑。在SSE部分,您首先对像素值执行XOR操作,并在减去之前比较它们。在非SSE部分,您只是直接减去它们。这两者可能不完全等价,除非 _x80 仅仅是一个将无符号字节转换为有符号字节的偏移量。
  1. 比较操作的逻辑:
    • 在SSE部分,您使用了 _mm_cmplt_epi8,这会比较两个向量中的每个字节,并返回一个掩码,其中每个字节要么是 0xFF (如果a < b),要么是 0x00。这可能与非SSE部分中的逻辑不完全匹配,因为您在那里直接将值设置为 255 或 0。确保两者的逻辑是一致的。

总的来说,除了这些问题和考虑点外,代码似乎是为了性能优化而写的。确保在更改之后进行充分的测试,以确保您的修改不会引入新的问题或性能下降。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SSE部分和小于部分差异,防止

  1. 差异检测逻辑:

在使用SSE指令集进行图像处理时,保持一致性非常重要。下面是一种方法,可以使SSE循环和非SSE循环的逻辑保持一致。

差异检测逻辑的统一:

  1. 定义_x80的用途: _x80 应该是一个常量,其值是 128 (即 0x80 in hexadecimal),它用于将无符号整数转换为有符号整数,反之亦然。这样可以使得原本的 0..255 范围的无符号字节变为 -128..127 的有符号字节。
  2. 在非SSE循环中应用相同的转换: 为了使非SSE循环与SSE循环保持一致,您需要在处理之前将无符号字节转换为有符号字节。

修改后的非SSE循环部分可以是:


 

// 其他情况下,C小于32的时候处理
for (; c < m_srcImage.cols; c++)
{
//if (filterPtr[c] - srcPtr[c] <m_offest)  //m_offest偏移量
//	threshPtr[c] = 255;
//else
//	threshPtr[c] = 0;
// 将像素值转换为有符号形式,与SSE部分保持一致
    // 将像素值转换为有符号形式,与SSE部分保持一致
    const char signed_src = static_cast<char>(srcPtr[c] ^ 0x80);
    const char signed_filter = static_cast<char>(filterPtr[c] ^ 0x80);

    // 使用有符号字节进行差值计算
    if (signed_filter - signed_src < static_cast<char>(m_offset))
        threshPtr[c] = 255;
    else
        threshPtr[c] = 0;
}

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

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

相关文章

01、SpringBoot + MyBaits-Plus 集成微信支付 -->项目搭建

目录 SpringBoot MyBaits-Plus 集成微信支付 之 项目搭建1、创建boot项目2、引入Swagger作用&#xff1a;2-1、引入依赖2-2、写配置文件进行测试2-3、访问Swagger页面2-4、注解优化显示 3、定义统一结果作用&#xff1a;3-1、引入lombok依赖3-2、写个统一结果的类-->RR类的…

Windows、程序员必装的工具

一、Typora 啥也不说了直接上图 Markdown语法 Typora免费版 提取码&#xff1a;av01 二维码&#xff1a; 1&#xff09;页面展示 2&#xff09;主题 3&#xff09;偏好设置 4&#xff09;Markdown语法设置偏好 5&#xff09;编辑器 6&#xff09;系统 二、Snipaste Snipaste…

Java反射详解:入门+使用+原理+应用场景

反射非常强大和有用&#xff0c;现在市面上绝大部分框架(spring、mybatis、rocketmq等等)中都有反射的影子&#xff0c;反射机制在框架设计中占有举足轻重的作用。 所以&#xff0c;在你Java进阶的道路上&#xff0c;你需要掌握好反射。 怎么才能学好反射&#xff0c;我们需要…

STM32CubeIDE安装中文语言包

软件包地址&#xff1a;https://archive.eclipse.org/technology/babel/update-site/R0.16.1/2018-12/ 打开IDE&#xff1a;Help--->Install New Software--->Add Locations&#xff1a;输入软件包地址 等待搜索结束&#xff1a;选择中文语言包&#xff0c;单击next进行安…

QQ邮箱发送验证码源码/API+HTML源码/支持API接口、自定义地址和内容/简单易用

源码简介&#xff1a; 一款支持API接口、自定义QQ邮箱地址、自定义邮箱标题和内容的源码。 近来我正在开发一款新的软件&#xff0c;但在注册环节中遇到了一个问题&#xff1a;需要使用QQ邮箱验证码。因此&#xff0c;我积极寻找相关的API接口或开发文档&#xff0c;但遗憾的…

学习小结,学而时习之,坚持学习之,温顾学习之

学习python一个多月了&#xff0c;之前也有接触过&#xff0c;还花了不少钱报班&#xff0c;看了看入门的头两节课&#xff0c;就止步了。每一种编程语言的入门感觉都差不多&#xff0c;学到现在&#xff0c;我对python的基本数据类型还是没掌握好啊&#xff0c;每次列表字典怎…

面向萌新的数学建模入门指南

时间飞逝&#xff0c;我的大一建模生涯也告一段落。感谢建模路上帮助过我的学长和学姐们&#xff0c;滴水之恩当涌泉相报&#xff0c;写下这篇感想&#xff0c;希望可以给学弟学妹们一丝启发&#xff0c;也就完成我的想法了。拙劣的文笔&#xff0c;也不知道写些啥&#xff0c;…

二叉树采用二叉链表存储:编写计算整个二叉树高度的算法

二叉树采用二叉链表存储&#xff1a;编写计算整个二叉树高度的算法 (二叉树的高度也叫二叉树的深度) 代码思路&#xff1a; 首先你要明白什么是树的高度&#xff0c;简言之就是树有多少层&#xff0c;如下图&#xff1a; 下面这棵树的高度就是4 首先我们观察根节点&#xff0…

软件测试:压力测试详解

压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&#xff0c;并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试&#xff0c;并评估软件在极端…

使用免费 FlaskAPI 部署 YOLOv8

目标检测和实例分割是计算机视觉中关键的任务&#xff0c;使计算机能够在图像和视频中识别和定位物体。YOLOv8是一种先进的、实时的目标检测系统&#xff0c;因其速度和准确性而备受欢迎。 Flask是一个轻量级的Python Web框架&#xff0c;简化了Web应用程序的开发。通过结合Fla…

手把手教你:UE 4.27插件项目的自动化打包(Windows、Android、iOS统统搞定)

Windows平台 下载/安装Epic Games launcher&#xff1b;然后安装 Unreal Engine v4.27.2 注意&#xff1a;launcher和具体版本的engine务必安装在相同的父目录下&#xff01;如下&#xff1a; 2. 安装Visual Studio 2019或2022。安装完成后执行菜单&#xff1a;帮助 | 检查更…

3D医学三维技术影像PACS系统源码

一、系统概述 3D医学影像PACS系统&#xff0c;它集影像存储服务器、影像诊断工作站及RIS报告系统于一身,主要有图像处理模块、影像数据管理模块、RIS报告模块、光盘存档模块、DICOM通讯模块、胶片打印输出等模块组成&#xff0c; 具有完善的影像数据库管理功能&#xff0c;强大…

分享77个工作总结PPT,总有一款适合您

分享77个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1qdoA_Ylbxkmp2Qkh9VDw8A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 水彩插画风幼儿说课PPT模板 舞龙舞狮文化传承通…

FPGA高端项目:图像采集+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP …

官媒代运营:质疑代运营,理解代运营,成为代运营,超越代运营

官媒代运营 随着互联网的发展&#xff0c;品牌传播变得越来越重要。而代运营作为一种专业的、高效的品牌传播方式&#xff0c;逐渐受到企业的青睐。不过&#xff0c;很多人对代运营持质疑态度&#xff0c;认为它只是简单的外包服务。但实际上&#xff0c;代运营远不止于此&…

CV计算机视觉每日开源代码Paper with code速览-2023.11.1

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构】Battle of the Backbones: A Large-Scal…

JVM调优工具详解及调优实战(1)

文章目录 1. 前提准备2. Jmap3. Jstack4. Jinfo5. Jstat&#xff08;重点&#xff09;6. 案例分析 1. 前提准备 任意启动一个web项目&#xff0c;这里我已经启动好了 2. Jmap map命令用于生成堆转储快照&#xff0c;有时候也成为heapdump或者dump文件。Jmap不仅仅可以获取d…

易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队

在当今快速发展的信息化时代&#xff0c;企业对于高效、自动化的软件需求日益增长。而易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队&#xff0c;正是为了满足这一需求而诞生的。 一、团队背景 技术顾问、维&#xff1a;Daxiami6789 易语言软件定制开发爬虫模…

京东数据平台:2023年Q3季度黄金市场数据分析

继9月国内黄金市场持续上涨后&#xff0c;进入10月中下旬后&#xff0c;黄金行情再度反转&#xff0c;多家品牌金饰价格再次突破600元/克&#xff0c;达到611元/克。 今年以来&#xff0c;黄金行情不断走俏&#xff0c;销售市场也有明显增长。根据鲸参谋平台的数据显示&#xf…

geoserver在wms服务查询时中文乱码问题

一、geoserver上的问题 在服务查询时遇到了编码问题&#xff0c;首先就是确认数据存储位置的数据是否采用了GBK编码&#xff0c;排除geoserver的问题。 二、数据上的问题 一般高版本的arcgis或者arcgispro导出来shp的dbf文件在excel里打开中文都是乱码&#xff0c;而这个乱…