MATLAB矩阵乘法为什么快,为什么MATLAB在矩阵乘法中如此之快?
reverse_engi..
163
这种问题反复出现,应该比Stackoverflow上的"Matlab使用高度优化的库"或"Matlab使用MKL"一次更清晰地回答.
历史:
矩阵乘法(与矩阵向量,向量 - 向量乘法和许多矩阵分解一起)是线性algrebra中最重要的问题.从早期开始,工程师就一直在用计算机解决这些问题.
我不是历史专家,但显然那时候,每个人都只用简单的循环重写了他的Fortran版本.然后出现了一些标准化,识别出需要解决的大多数线性代数问题的"内核"(基本例程).然后将这些基本操作标准化为:基本线性代数子程序(BLAS).然后,工程师可以在他们的代码中调用这些经过良好测试的标准BLAS例程,使他们的工作变得更加容易.
BLAS:
BLAS从1级(定义标量矢量和矢量矢量运算的第一个版本)演变为2级(矢量矩阵运算)到3级(矩阵矩阵运算),并提供越来越多的"内核",使标准化更多以及更多基本的线性代数运算.最初的Fortran 77实现仍可在Netlib的网站上获得.
为了更好的表现:
因此,多年来(特别是在BLAS 1级和2级版本之间:80年代早期),随着向量操作和缓存层次结构的出现,硬件发生了变化.这些演进使得有可能大大提高BLAS子程序的性能.然后不同的供应商出现了BLAS例程的实现,这些例程越来越高效.
我不知道所有的历史实现(当时我还没出生或是个孩子),但是最着名的两个是在21世纪初出现的:英特尔MKL和GotoBLAS.您的Matlab使用的是英特尔MKL,这是一款非常优秀的优化BLAS,它解释了您所看到的出色性能.
Matrix乘法的技术细节:
那么为什么Matlab(MKL)如此快dgemm(双精度一般矩阵 - 矩阵乘法)呢?简单来说:因为它使用矢量化和良好的数据缓存.更复杂的术语:请参阅Jonathan Moore提供的文章.
基本上,当您在所提供的C++代码中执行乘法运算时,您根本不需要缓存.因为我怀疑你创建了一个指向行数组的指针数组,所以你在内部循环中访问"matice2"的第k列:matice2[m][k]非常慢.实际上,当您访问时matice2[0][k],您必须获得矩阵的数组0的第k个元素.然后在下一次迭代中,您必须访问matice2[1][k],这是另一个数组(数组1)的第k个元素.然后在下一次迭代中你访问另一个数组,依此类推......由于整个矩阵matice2不能适应最高的缓存(它的8*1024*1024字节很大),程序必须从主内存中获取所需的元素,丢失了很多时间.
如果你只是转换了矩阵,那么访问将在连续的内存地址中,你的代码已经运行得更快,因为现在编译器可以同时加载缓存中的整行.试试这个修改过的版本:
timer.start();
float temp = 0;
//transpose matice2
for (int p = 0; p < rozmer; p++)
{
for (int q = 0; q < rozmer; q++)
{
tempmat[p][q] = matice2[q][p];
}
}
for(int j = 0; j < rozmer; j++)
{
for (int k = 0; k < rozmer; k++)
{
temp = 0;
for (int m = 0; m < rozmer; m++)
{
temp = temp + matice1[j][m] * tempmat[k][m];
}
matice3[j][k] = temp;
}
}
timer.stop();
因此,您可以看到缓存局部性如何大大提高代码的性能.现在,真正的dgemm实现将其用于非常广泛的层次:它们对由TLB的大小(转换后备缓冲区,长话短说:可以有效缓存的内容)定义的矩阵的块执行乘法,以便它们流式传输到处理器确切地说它可以处理的数据量.另一方面是矢量化,它们使用处理器的矢量化指令来获得最佳指令吞吐量,而您无法通过跨平台C++代码实现这一点.
最后,人们声称这是因为Strassen或Coppersmith-Winograd算法是错误的,因为上面提到的硬件考虑因素,这两种算法在实践中都不可实现.
我刚刚观看了Scott Meyers的视频,介绍了缓存大小的重要性以及使数据适合缓存行大小的问题,以及在源中没有共享数据但最终在硬件上共享数据的多线程解决方案可能会遇到的问题/ core-thread level:https://youtu.be/WDIkqP4JbkE (2认同)
MATLAB矩阵乘法为什么快,为什么MATLAB在矩阵乘法中如此之快?相关推荐
- 小米快传文件服务器怎么用,手机中的小米快传怎么用?小米快传的详细使用教程...
小米的MIUI系统算得上是国产手机最好用的系统之一,昨天即10月9日新上线的最新功能--小米快传,并不是以前的所谓自带第三方软件,而是系统内部的新功能. miui7开发版更新后,我迫不及待的想看看其功 ...
- matlab 矩阵与向量乘法,性能:Matlab与C矩阵向量乘法
前言 前段时间我问了一个关于Matlab与Python性能的问题(Performance: Matlab vs Python).我很惊讶Matlab比Python更快,特别是在meshgrid中.在讨 ...
- matlab矩阵对某一列求和,将矩阵中的每一列与另一列中的对应行相乘,然后在Matlab中求和...
可以说我有矩阵A = [1 2; 3 4], B = [4 3; 2 1]. 我想将矩阵A ([1; 3], [2; 4])中的每一列乘以矩阵B ([4 3], [2 1])中的相应行,并对得出的矩阵 ...
- matlab将矩阵分解成lu,10行代码实现矩阵的LU分解(matlab)
最近由于数值分析实验课要求,需要通过matlab实现矩阵的LU分解.但是看了很多网友写的程序,基本上都是通过循环嵌套循环来实现矩阵的LU分解.略感琐碎,因此最近两天便一直在思考能否利用矩阵的乘v法,来 ...
- matlab矩阵作分钟平均,提高matlab运行速度和节省空间的心得合集(ZT)
B = aiTemp(A(iXmin:iXMax,iYMin:iYMax,iZMin:iZMax)); 当然了,改进的前提是知道矩阵A的非零元(即值为true的元素)大致的分布,也就是能够求出iXmi ...
- MATLAB 学习笔记(2)MATLAB 矩阵的加减乘除运算
目录 MATLAB矩阵的加.减.乘.除法 MATLAB矩阵的加法 MATLAB矩阵的减法 MATLAB矩阵的除法 MATLAB矩阵的乘法 总结 MATLAB矩阵的加.减.乘.除法 MATLAB矩阵的加 ...
- matlab里的矩阵和opencv里的矩阵的区别,opencv 矩阵相乘, matlab矩阵相乘,以及自己写的矩阵相乘的时间比较...
直接上代码吧 matlab clc close all clear all tic; c = rand(7500,7500)*rand(7500,1);toc; Elapsed time is2.57 ...
- 这才是Matlab的正确打开方式!——Matlab矩阵、绘图、函数计算与数据读取
Matlab基础学习笔记 基础及预设置 矩阵 各种函数 二维制图 三维制图 运算 输入/输出 各种语句 数据读出/写入 这里用的是Matlab2016a版本 基础及预设置 1.设置路径 选择路径,或是 ...
- matlab向量的模_基于MATLAB使用矩阵方法求解一维定态薛定谔方程
摘要:此文介绍了一种使用MATLAB求解一维定态薛定谔方程的方法.利用充分格式进行离散化,得出相应的矩阵方程,用MATLAB求解本征值和本征函数.此方法简单可靠,可以处理各种时间无关的束缚态问题.所用 ...
最新文章
- heartbeat原理介绍
- java读取项目资源文件的方法
- Spring Boot教程(三十四)整合elk(1)
- 根据class名 赋值_匿名内部类 类名规则
- 干货 | Python 标准库之 XML(上)
- xp系统qq安装不上网络连接服务器,winxp系统下QQ远程协助连不上如何解决
- Visual paradigm社区版下载及中文菜单的设置
- Chrome查看cookie
- 黑色全屏个人主页bootstrap4模板
- lnmp改php版本,lnmp安装多版本PHP共存的方法详解
- 无法打开预编译头文件的解决方法及预编译头原理[ZZ] 转
- eclipse tomcat找不到或无法加载
- HTML+CSS+JavaScript实现打字小游戏
- 不得不学的统计学基础知识(二)
- 移动设备数据丢失恢复办法
- 综合布线干线子系统设计原则
- 针对所维修的计算机 维修人员必须,医院各科室电脑管理制度_医院临床科室管理制度...
- PCB 板弯了怎么办?pcb板弯翘原因分析及改善方法
- Work20230330
- 深度学习AI美颜系列---图像自动亮度对比度与调色
热门文章
- Alink漫谈(八) : 二分类评估 AUC、K-S、PRC、Precision、Recall、LiftChart 如何实现
- 如何将磁盘从GPT格式转换成MBR
- java实现打印某一年的月份(以2017年的为准)
- macromedia_Macromedia烟花
- 从0构建AI推荐系统demo(数据处理与入库)
- 支付宝无线商户签约指南
- centos docker部署swoft
- 董藩:北京房价可以涨到每平米80万===如此高论,岂不保存下来,且待25年后再看...
- fwPlayer 支持最新浏览器在线播放AVI和FLV格式的视频
- firefox附加组件开发者指南(三)——XUL简介(下)