向量体系结构(5):步幅集中一分散

news2025/1/13 3:16:13

笔记来源《计算机体系结构 量化研究方法》

回答上一篇最后留下的问题

向量体系结构:向量执行时间-CSDN博客

(1)如何有效向量化多维矩阵运算?

(2)向量处理器如何高效处理稀疏矩阵?

步幅

步幅指在内存中从一个数组元素移动到下一个元素时跨过的字节数。

矩阵乘法示例(理解步幅的含义)

    内层循环对应矩阵B的某一行与矩阵D的某一列的逐元素乘法。由于C语言通常以行为主序存储多维数组,矩阵B和D的元素在内存中可能不是连续存放的。

   在C语言中,矩阵的行存储是连续的,但列之间存在较大的步幅。以矩阵D为例,如果要连续访问其列中的元素(内层循环的目的),每次迭代需要跳过整个行的宽度。Fortran语言通常以列主序存储数组,意味着矩阵的列元素在内存中是连续的,意味着访问其连续行元素时需要跨过较多内存空间。

   编译器在向量化代码时,需要识别并优化这些步幅问题,以便有效地利用向量处理器的并行能力。如果不对循环进行重新排序或调整访问模式,处理器可能无法有效加载连续的向量元素到寄存器中进行并行运算,这会影响性能。

   编译器可以通过循环变换(如循环展开、循环交换等)来改善内存访问模式,以减小步幅或使其适应向量寄存器的宽度。例如,通过改变循环顺序,使内存访问变得更加连续,从而减少跨步读取的次数。

向量处理器处理非连续数据

向量处理器提供了特殊指令来   处理非连续内存访问,如带有步幅参数的加载(Load)和存储(Store)指令,允许一次性读取或写入间隔固定字节数的多个数据元素。这有助于编译器即使在面对较大步幅时,也能生成有效的向量代码。

一旦数据载入向量寄存器,无论原始数据在内存中的分布如何(连续或非连续),处理器都视之为逻辑上相邻的元素,从而允许高效地执行向量运算。 

通过具备步幅功能的向量加载(LWS, Load Vector WithStride)和存储(SWS, Store Vector WithStride)指令,向量处理器能够直接处理非连续内存位置的数据。这些指令允许指定加载或存储数据时的间隔,即步幅,从而适应如矩阵运算中跨列或跨行访问的需要。

动态计算步幅:由于矩阵尺寸或向量长度可能在编译时未知或在运行时变化,向量处理器需要动态计算步幅值,并能够将此值存储在通用寄存器中,以便灵活地指导LWS和SWS指令的操作。

 LWS(Load Vector WithStride)允许处理器从内存中加载数据到向量寄存器,但不同于普通的连续加载,它可以指定一个步幅参数。

步幅是指在内存中从一个元素移动到下一个元素时跳跃的字节数或元素数。例如,在处理矩阵时,如果想要加载矩阵的一列到向量寄存器,即使这些元素在内存中不是连续存放的,LWS指令可以通过指定正确的步幅来实现这一点。

SWS(Store Vector WithStride)与LWS类似,但作用方向相反。SWS指令用于将向量寄存器中的数据存储回内存,并且同样支持指定步幅。这在需要将计算结果按照特定间隔分布回非连续内存位置时非常有用。

组冲突与停顿

      块大小与缓存效率:增大缓存块大小通常可以减少单位步幅访问(如线性遍历数组)时的缓存未命中率,但对于非单位步幅访问(如按列访问矩阵元素),可能反而因频繁跨越缓存行边界而导致缓存效率降低。这是因为非连续访问模式可能不匹配增大的块大小,导致数据未被有效利用或频繁替换。

     如果多个内存访问请求指向的是包含在同一个缓存行中的不同数据,且这些请求之间存在一定的步幅关系(即它们访问的地址模式导致频繁访问同一缓存行),这就会导致组冲突(Cache Bank Conflict或Bank Conflict)。这是因为缓存行在同一时间只能服务一个访问请求,其他请求必须等待,直到当前请求完成。

     当步幅与缓存行大小的最小公倍数较小,意味着数据访问模式频繁地“撞击”同一缓存行。例如,如果步幅为32字节,而缓存行大小也是32字节,那么每次访问都会命中相同的缓存行,造成连续的冲突。

     处理一个缓存行访问请求所需要的时间。如果在这个时间窗口内,有新的访问请求指向同一个缓存行,这些请求就必须等待,直到当前请求处理完毕。如果步幅与缓存行大小的关系导致请求过于频繁地访问同一缓存行,那么这种等待(停顿)就会频繁发生,显著降低系统的整体性能。

向量处理器经常需要存储稀疏矩阵。稀疏矩阵是指大部分元素为零的矩阵,直接存储会浪费大量空间,因此通常采用压缩存储格式,仅存储非零元素及其对应的索引。

稀疏矩阵

【数据结构和算法笔记】:稀疏矩阵的存储结构详解_稀疏矩阵存储结构-CSDN博客

向量计算时的稀疏矩阵

for(i = 0; i < n; i = i + 1)
    A[k[i]] += C[m[i]];

稀疏矩阵是指大部分元素为零的矩阵,直接存储会浪费大量空间,因此通常采用压缩存储格式,仅存储非零元素及其对应的索引。

向量体系结构使用集中分散操作来处理稀疏矩阵。

集中分散

集中-分散操作是处理稀疏矩阵时的关键技术,特别是在向量处理器和图形处理单元(GPU)中,用于高效地处理非连续存储的数据。这项技术允许在稀疏数据表示与连续(密集)数据操作之间进行有效转换,从而优化计算性能。

集中(Gather)操作

集中操作是从非连续的内存位置加载数据到一个连续的内存区域或向量寄存器中,通常用于将稀疏矩阵的非零元素收集到一个密集向量中,它把分散在内存中的数据集中起来。

实现:通过索引向量(如上例中的Rk和Rm)来指定哪些元素需要被加载。例如,指令LV Yk,Rk ;载入K 和 LY Ym,Rm ;载入M 分别根据Rk和Rm中的索引,从A[]和C[]中集中加载数据到向量寄存器Yk和Ym。这里,索引向量中的每个元素值代表了在原数组中的偏移量。

分散(Scatter)操作

分散操作则是将一个连续的内存区域或向量寄存器中的数据分散写回到非连续的内存位置,即将经过计算的密集向量数据写回稀疏矩阵的相应位置。它将数据分散回其原始的非连续存储位置。

  使用同样的索引向量来确定写入的位置。在上述代码中,SVI (Ra+Vk),Va;它将向量寄存器Va中的数据根据Vk中的索引分散回数组A[]的相应位置。

面临的挑战与优化

内存访问冲突与延迟:由于分散-集中操作涉及的内存地址不连续,可能导致内存访问模式较为随机,容易引起存储器组冲突和增加延迟。每个数据元素都需要独立寻址,难以利用缓存行的连续访问优势。

硬件支持与优化:现代向量处理器和GPU通常内置了对集中-分散操作的硬件支持,如VMIPS指令集中的LVI(载入索引向量)和SVI(存储索引向量)。尽管这些操作可能不如连续访问那样高效,但通过精心设计的硬件(如增强的内存控制器、更大的TLB、优化的缓存策略)和软件策略(如程序员手动优化索引访问模式,确保连续访问以利用单位步幅优势),可以显著提升性能。

GPU中的应用

在GPU中,所有的数据载入本质上是集中操作,而存储则为分散操作。为了优化性能,GPU程序员需要确保集中或分散操作中的地址尽可能连续,以利用单位步幅访问的优势。GPU硬件也会通过识别特定模式,自动将某些集中或分散操作转换为更高效的连续访问模式,进一步减少访问延迟和提高吞吐量。

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

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

相关文章

一文了解python机器学习Sklearn

1.3 安装和配置Sklearn 要使用Sklearn库&#xff0c;首先需要安装Python和相应的库。在本教程中&#xff0c;我们将使用Python 3.x版本。可以使用以下命令安装Sklearn库&#xff1a; pip install scikit-learn安装完成后&#xff0c;可以在Python代码中导入Sklearn库&#xf…

WIN10 anaconda 安装 CondaError: Run ‘conda init‘ before ‘conda activate‘

1 下载 https://www.anaconda.com/download/success 2 安装 3 修改环境变量 安装后修改环境变量 4 winrun 进入命令窗口 输入cmd 输入 conda info 5 创建 虚拟环境 conda create -n yolov8 python3.8 -y 6 CondaError: Run ‘conda init’ before ‘conda activate’ c…

架构每日一学 2:架构师六个生存法则之一:架构必须有且仅有一个目标(一)

本文首发于公众号&#xff1a;腐烂的橘子 为什么有的架构活动没有正确的目标&#xff1f; 在每个架构活动启动之前&#xff0c;必须有且仅有一个正确的目标&#xff0c;这是架构设计的起点[1]。何为正确&#xff1f;正确就是要与公司的战略目标相匹配。否则系统会变得复杂和无…

基于Spring Boot的医疗服务系统设计与实现

基于Spring Boot的医疗服务系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 医疗服务系统首页界面图&#xff0c;公告信息、医疗地图…

RHCE shell-第一次作业

要求&#xff1a; 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检査- 次磁盘剩余空间。 2、判断web服务是否运行(1、查看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式 判断该程序是否运…

基于FPGA的数字信号处理(8)--RTL运算的溢出与保护

前言 在做加、减、乘、除等运算时&#xff0c;经常会发生 溢出 的情况。比如1个4bits的计数器&#xff08;每个时钟累加1&#xff09;&#xff0c;在4’b1111 1 后&#xff0c;原本其期望值应该是 151 即16&#xff0c;但是4bits的寄存器能表示的最大值只是4‘b1111即15&…

Server 2022 IIS10 PHP 7.2.33 升级至 PHP 8.3 (8.3.6)

下载最新版本 PHP 8.3 (8.3.6)&#xff0c;因为是 FastCGI 执行方式&#xff0c;选择 Non Thread Safe(非线程安全)。 若有以下提示&#xff1a; The mysqli extension is missing. Please check your PHP configuration. 或者 PHP Fatal error: Uncaught Error: Class &qu…

PDF Shaper Ultimate 免安装中文破姐版 v14.1

软件介绍 PDF Shaper是一套完整的多功能PDF编辑工具&#xff0c;可实现最高的生产力和文档安全性。它允许你分割&#xff0c;合并&#xff0c;水印&#xff0c;署名&#xff0c;优化&#xff0c;转换&#xff0c;加密和解密您的PDF文件&#xff0c;也可插入和移动页&#xff0…

每日OJ题_DFS爆搜深搜回溯剪枝①_力扣784. 字母大小写全排列

目录 力扣784. 字母大小写全排列 解析代码1_path是全局变量 解析代码2_path是函数参数 力扣784. 字母大小写全排列 784. 字母大小写全排列 难度 中等 给定一个字符串 s &#xff0c;通过将字符串 s 中的每个字母转变大小写&#xff0c;我们可以获得一个新的字符串。 返回…

SpringSecurity6 学习

学习介绍 网上关于SpringSecurity的教程大部分都停留在6以前的版本 但是&#xff0c;SpringSecurity6.x版本后的内容进行大量的整改&#xff0c;网上的教程已经不能够满足 最新的版本使用。这里我查看了很多教程 发现一个宝藏课程&#xff0c;并且博主也出了一个关于SpringSec…

解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上,运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本,激活win10步骤流程。

一. 解决 0x803F7001在运行Microsoft Windows非核心版本的计算机错误 首先&#xff0c;按下winR打开"运行",输入 regedit 后回车&#xff0c;打开注册表。   然后再注册表下输入地址HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProt…

ssh远程访问windows系统下的jupyterlab

网上配置这一堆那一堆&#xff0c;特别乱&#xff0c;找了好久整理后发在这里 由于既想打游戏又想做深度学习&#xff0c;不舍得显卡性能白白消耗&#xff0c;这里尝试使用笔记本连接主机 OpenSSH 最初是为 Linux 系统开发的&#xff0c;现在也支持包括 Windows 和 macOS 在内…

【第三版 系统集成项目管理工程师】第2章 信息技术发展(知识总结)

持续更新。。。。。。。。。。。。。。。 【第2章】 信息技术发展 考情分析2. 1信息技术及其发展2.1.1 计算机软硬件-P501.计算机硬件2.计算机软件-P51 2.1.2计算机网络1.通信基础-P522.网络基础-P534.网络标准协议-P543.网络设备-P535.软件定义网络-P576.第五代移动通信技术-P…

【论文阅读】Tutorial on Diffusion Models for Imaging and Vision

1.The Basics: Variational Auto-Encoder 1.1 VAE Setting 自动编码器有一个输入变量x和一个潜在变量z Example. 获得图像的潜在表现并不是一件陌生的事情。回到jpeg压缩&#xff0c;使用离散余弦变换&#xff08;dct&#xff09;基φn对图像的底层图像/块进行编码。如果你给…

【Redis面试题】Redis常见的一些高频面试题

分享几个Redis入门级常见面试过程中遇到的题目! 你项目中哪里使用到了redis?可以讲一讲嘛 这个题目无论是大公司还是小公司都经常考,建议大家根据自己的项目做总结 redis的几种基础数据结构 redis为什么那么快&#xff1f; 1.基于内存实现&#xff1a;我们都知道内存读写是…

50个前端实战项目之04:隐藏的搜索小组件

大家好&#xff0c;我是宝哥。 今天讲50个前端实战项目之04&#xff1a;隐藏的搜索小组件。 源码下载地址 https://github.com/bradtraversy/50projects50days/tree/master/hidden-search 前端实战项目系列正在更新&#xff1a;04/50 01&#xff1a;可展开卡片02&#xff1a;进…

Springboot+Vue项目-基于Java+MySQL的图书商城管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

中国各省地图(高清晰一亿像素)

hello&#xff0c;我是小索奇 不知道大家有没有使用地图的习惯&#xff0c;反正小索奇去一个地方&#xff0c;就会使用地图&#xff0c;也会经常看世界地图&#xff0c;因为地理学得不好&#xff0c;有时候也记不住部分省份在哪里。所以会经常使用到地图 但去百度搜索里面寻找…

windows驱动开发-PNP管理器

PNP技术是由Microsoft提出的&#xff0c;英文Plug and play的缩写&#xff0c;中译即插即用&#xff0c;意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序&#xff0c;做到插上就能用&#xff0c;无须人工干预&#xff0c;是Windows自带的一项技术。所谓即插即用是指将…

阿里云API网关 产品的使用笔记

阿里云的产品虽多&#xff0c;还是一如既往的一用一个看不懂&#xff0c;该模块的文档依旧保持“稳定”发挥&#xff0c;磕了半天才全部跑通。 用阿里云API网关的原因是&#xff0c;在Agent中写插件调用API的时候&#xff0c;需要使用Https协议&#xff0c;又嫌搞备案、证书等事…