4.2 MATRIX MULTIPLICATION

矩阵-矩阵乘法,或简称矩阵乘法,在 i X j(i 行 by j 列)矩阵 M 和 j x k 矩阵 N 之间产生 i X k 矩阵P。矩阵乘法是基本线性代数子程序(BLAS)标准的重要组成部分(见第3章中的“线性代数函数”边栏:可扩展并行执行)。该函数是许多线性代数求解器(如LU分解)的基础。正如我们将看到的,矩阵乘法为减少可以用相对简单的技术捕获的全局内存访问提供了机会。矩阵乘法函数的执行速度可以按数量级变化,这取决于全局内存访问的减少程度。因此,矩阵乘法为这种技术提供了一个很好的初始示例。

在这里插入图片描述
当执行矩阵乘法时,输出矩阵P的每个元素都是M行和N列的内积。我们将继续使用惯例,其中 P R o w , C o l P_{Row, Col} PRow,Col是垂直方向的Row位置的元素,水平方向的Col位置。如图4.2所示, P R o w , C o l P_{Row, Col} PRow,Col(P中的小方块)是由M的Row行(在M中显示为水平条带)和由N的Col列(在N中显示为垂直条带)形成的向量的内积两个向量的内积,也称为点积是单个向量元素的乘积之和,即
例如在这里插入图片描述
在我们最初的矩阵乘法实现中,我们使用与colorToGreyscaleConversion相同的方法将线程映射到P元素;即每个线程负责计算一个P元素。每个线程要计算的P元素的行和列索引如下:
在这里插入图片描述
通过这种一对一映射,Row和Col线程索引也是输出数组的行和列索引。图4.3显示基于此线程到数据映射的内核源代码。如果Row和Col都在范围内,读者应该立即看到计算Row、Col和if语句测试的熟悉模式。这些语句与colorToGreyscale转换中的对应语句几乎相同。唯一显著的区别是,我们假设矩阵MulKernel的平方矩阵,从而用宽度替换宽度和高度。
在这里插入图片描述
线程到数据映射有效地将P划分为tiles,其中一个在图4.2.中显示为一个大正方形。每个块负责计算其中一个4.2.。

我们现在把注意力转向每个线程所做的工作。回想一下, P R o w , C o l P_{Row,Col} PRowCol是M的Row行和N的Col列的内积。在图4.3中,我们使用for-loop来执行此内积操作。在进入循环之前,我们将局部变量Pvalue初始化为0。循环的每个迭代都从M的行访问一个元素,从N的Coith列访问一个元素,将两个元素乘以一起,并将乘积累积到Pvalue中。

首先,我们专注于访问for-loop中的M元素。回想一下,M被线性化成一个等价的1D数组,其中M的行一个接一个地放置在内存空间中,从0行开始。因此,第1行的开头元素是M[1width],因为我们需要考虑其他行的所有元素。一般来说,第Row行的开头元素是M[RowWidth]。由于一行的所有元素都放置在连续的位置,因此Rowt行的第k个元素位于M[Row*Width+k]。该方法应用于图4.3.

我们现在把注意力转向N。如图4.3所示,第Col列的开头元素是第0行的第Col元素,即N[Col]。访问第Col列中的每个附加元素需要跳过整个行。原因是同一列的下一个元素实际上是下一行的同一元素。因此,第Col列的k"元素是N[k*width+Col]。

执行退出for-loop后,所有线程在Pvalue变量中都有其P元素值。然后,每个线程使用一维等价索引表达式Row*Width+Col来写入其P元素。同样,这种索引模式与colorToGreyscaleConversion内核中使用的索引模式相似。

我们现在用一个小例子来说明矩阵乘法内核的执行。图4.4显示4×4 P,BLOCK_WIDTH=2。小尺寸允许我们将整个示例放入一张图片中。P矩阵现在分为四个tile,每个块计算一个tile。我们通过创建2×2线程数组的块来做到这一点,每个线程计算一个P元素。在示例中,块(0,0)的线程(0,0)计算 P 0 , 0 P_{0,0} P0,0,而块(1,0)的线程(0,0)计算 P 2 , 0 P_{2,0} P2,0在这里插入图片描述
矩阵中的 Row 和 Col 在matrixMulKernel标识了要由线程进行缓存的P元素。行还标识M的行,而Col将N的列标识为线程的输入值。图4.5说明了每个线程块中的乘法操作。对于小矩阵乘法示例,块中的线程(0,0)产生四个点乘积。块(0,0)中线程(1,0)的行和Col变量是00 + 1= 1和00 + 0= 0。它映射到P1.0,并计算M第1行和N第0列的点积。
在这里插入图片描述
我们浏览了图4.3中for-loop的执行。用于块(0,0)中的线程(0,0)。在第0次迭代(K=0)期间,RowWidth+k=04 + 0 = 0和kwidth+Co1=04 + 0= 0。因此,我们正在访问M[0]和N[0],根据图3.3,它们相当于Mo.o和No,o的1D。.请注意,这些确实是M的第0行和N的0列的其他元素。在第一次迭代(k=1)期间,RowWidth+k=04+1=1和kWidth+Col=14+0=4。我们正在访问M[1]和N[4],根据图3.3.,它们相当于M 0,1和N 1,0的1D。这些是M的0行和N的0列的第一个元素。

在第二次迭代(k=2)期间,RowWidth+K=04+2=2和kWidth+Col=8,导致M[2]和N[8]。因此,访问的元素是MMo.2和d_N2.0的1D等价物。最后,在第3次迭代(k=3)中,行宽度+ k=04+ 3和kWidth+ Col= 12,这导致M[3]和N[12],1D等价于M0.3和N3.0。我们现在已经验证了for-loop在M的0行和N的0列之间执行内积。在循环之后,线程写入P[Row*Width+Col],这是P[0],相当于 P0,0.的1D。因此,块(0,0)中的线程(0,0)成功计算了M的0行和N的0列之间的内积,并将结果存入P0.0。

我们将把它作为练习,供读者手动执行并验证块(0,0)或其他块中其他线程的for-loop。

请注意,matrixMulKernel 可以处理每个维度中多达16×65,535个元素的矩阵**。在大于该极限的矩阵要相乘的情况下,可以将P矩阵划分为大小可以由网格覆盖的子矩阵。然后,我们可以使用主机代码迭代启动内核并完成P矩阵。或者,我们可以更改内核代码,以便每个线程计算更多的P元素。**

我们可以通过计算图4.3.中矩阵乘法内核代码的预期性能水平来估计内存访问效率的影响。就执行时间而言,内核的主导部分是执行内部乘积计算的for-loop:
在这里插入图片描述
在这个循环的每次迭代中,都会为一个浮点乘法和一个浮点加法执行两个全局内存访问。一个全局内存访问获取M元素,另一个获取N元素。一个浮点运算将获取的M和N元素相乘,另一个将乘累积到P值中。因此,循环的compute-to-global-memory-access比为1.0。从我们在第3章(可扩展并行执行)的讨论中,这一比例可能会导致模制GPU的峰值执行速度的利用率低于2%。我们需要将现代设备的计算吞吐量的比率至少提高一个数量级,以实现良好的利用率。在下一节中,我们将展示我们可以在CUDA设备中使用特殊内存类型来实现这一目标。

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

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

相关文章

原生IP代理如何帮助跨境电商店铺做谷歌广告投放业务的?

随着全球化的发展,越来越多的电商店铺开始拓展跨境业务,而谷歌广告作为全球最大的广告平台之一,为跨境电商店铺带来了巨大的收益和商机。 然而,由于谷歌广告的地域限制和审查机制,店铺很难直接进行投放业务&#xff0…

Photovoltaic cell storage element IC---AEM13920

0 Preface/Foreword 0.1 Functional Block Diagram(功能框图) 1 register introduction

【极光系列】SpringBoot集成Mybatis

【极光系列】SpringBoot集成Mybatis 一.gitee地址 浅夏的猫 shawsongyue 直接下载可用 https://gitee.com/shawsongyue/aurora.git 二.mysql安装教程 详细参考我的另外一遍博客: https://blog.csdn.net/weixin_40736233/article/details/135582926?spm1001.201…

抖店搬运同行产品截流后,还是不出单?优化主图和链接的方法如下

我是王路飞。 跟品、搬运同行店铺内的爆品上架到自己的店铺,公认是起店最快的方法。 因为有流量的产品,同行已经替你选出来了,你只需要上架去卖就可以了。 但很多新手采用跟品方法的时候,自己店铺还是没什么流量,也…

基于Python实现地标景点识别

目录 前言简介地标景点识别的背景 地标景点识别的原理卷积神经网络(CNN)的基本原理地标景点识别的工作流程 使用Python实现地标景点识别的步骤数据收集数据预处理构建卷积神经网络模型模型训练 参考文献 前言 简介 地标景点识别是一种基于计算机视觉技术…

为什么建筑工程行业要十分重视主数据管理?

业务背景 主数据管理是数字化技术不可或缺的一部分。 建筑行业数字化转型中,跨部门协作是非常重要的。主数据管理能够提供一个统一的数据平台,方便各个部门数据共享和交流,也可以实现人力、物资、设备等各种资源的集中管理和优化配置。 此外…

LeetCode刷题---逆波兰表达式求值

解题思路: 使用栈来解决该问题 首先定义一个栈Stack,接着对tokens数组进行遍历,如果当前元素是非数字字符串的话(运算符),就从栈中取出两个元素根据该运算符进行计算,将计算后的结果添加到栈中。如果当前元素是数字字符…

flink1.14.5使用CDH6.3.2的yarn提交作业

使用CDH6.3.2安装了hadoop集群,但是CDH不支持flink的安装,网上有CDH集成flink的文章,大都比较麻烦;但其实我们只需要把flink的作业提交到yarn集群即可,接下来以CDH yarn为基础,flink on yarn模式的配置步骤…

去不了哈尔滨? 来看这里VR全景线上云体验

如果你无法亲自前往哈尔滨,那么不要失望,因为现在有一种全新的方式让你在家就能领略到哈尔滨的美丽景色。 冰城客户端、哈尔滨新闻网承办的“激情迎亚冬 冰雪暖世界——2024年哈尔滨冰雪乐园” 运用720云VR打造的沉浸式体验产品正式上线,将带…

如何使用Java采集汽车之家车辆配置参数信息

目录 一、引言 二、采集工具选择 三、采集流程设计 1、确定采集目标 2、确定采集URL 3、发送HTTP请求 4、解析HTML页面 5、CSS选择器或jQuery选择器。 6、异常处理和日志记录 四、代码实现示例 五、结果与分析 六、结论 随着互联网的普及和信息技术的不断发展&…

二叉树题目:从前序与后序遍历序列构造二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:从前序与后序遍历序列构造二叉树 出处:889. 从前序与后序遍历序列构造二叉树 难度 7 级 题目描述…

【数据结构】排序之归并排序与计数排序

个人主页 : zxctsclrjjjcph 文章封面来自:艺术家–贤海林 如有转载请先通知 目录 1. 前言2. 归并排序2.1 递归实现2.1.1 分析2.1.2 代码实现 2.2 非递归实现2.2.1 分析2.2.2 代码实现 3. 计数排序3.1 分析3.2 代码实现 4. 附代码4.1 Sort.h4.2 Sort.c4.3…

【Intel校企实践】猫狗大战

作业简介: 问题描述: ​ 在这个问题中,你将面临一个经典的机器学习分类挑战——猫狗大战。你的任务是建立一个分类模型,能够准确地区分图像中是猫还是狗。 预期解决方案: ​ 你的目标是通过训练一个机器学习模型&a…

【深蓝学院】移动机器人运动规划--第1章 运动规划介绍与地图构建--笔记

文章目录 1. Course introduction2. Course Outline2.1 课程概览2.2 课程算法概览2.2.1 基于搜索的前端2.2.2 基于采样的前端2.2.3 满足动力学约束的路径搜索2.2.4 后端轨迹优化 3. 地图表示3.1 Occupancy grid map占用栅格地图3.2 八叉树地图3.3 Voxel hashing(体素…

虾皮开通:如何在虾皮(Shopee)平台上开通店铺详细步骤

在全球电商市场的竞争中,越来越多的卖家选择在虾皮(Shopee)平台上开设店铺。作为东南亚地区最大的电子商务平台之一,虾皮提供了一个便捷的销售渠道,吸引了数百万的买家和卖家。如果您想在虾皮上开设自己的店铺&#xf…

《动手学深度学习》学习笔记 第10章 注意力机制

本系列为《动手学深度学习》学习笔记 书籍链接:动手学深度学习 笔记是从第四章开始,前面三章为基础知识,有需要的可以自己去看看 关于本系列笔记: 书里为了让读者更好的理解,有大篇幅的描述性的文字,内容很…

利用c 原生头文件完成JPEG全流程编码

骄傲一下,经过一个多月的努力,终于完成jpeg的全套编码。经验证此程序可以把摄像头yuv信号转为JPG图片。现在的程序还不完美,只能对长和宽尺寸是16倍数的信号转码。而且转码速度太慢,一帧1280720的图片要2秒多。此程序只能对yuv420…

静态路由高级特性(HCIA)

目录 一、静态路由高级特性 1、路由条目六要素 2、路由分类 3、静态路由配置命令 (1)静态路由中下一跳MA和P2P区别 4、静态路由加路由表条件 5、permanent特性 二、路由冗余和负载 1、控制层面control plane 2、数据层面data plane 路由操控精髓&#xf…

测试用例的设计(超详细总结)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料 1. 测试用例的概念 软件测试人员向被测试系统提供的一组数据的集合,包括 测试环境、测试步骤、…

深入探究Python Collections模块:高效数据结构解决方案

前言 这几天刷leetcode题时,看到题解中有这样一行代码collections.defaultdict(list),不明白是啥意思,平时开发的脚本中未遇到,借着这个机会,学习一下collections模块的用法。 collections 这个模块实现了一些专门化…
最新文章