偏个题。

说到这个想起之前朋友和我说到他最近在上一个课。

那个课上,教授要求他们写Cache friendly code。

尤其像矩阵这种很大块的东西,在运算时,会导致cache根本无法完全装下需要使用的数据。

此刻,如果程序没有设计得很有技巧,不断地刷新cache,会需要浪费大量的时间。

所以,他们教了好几种方法去计算矩阵,让整个计算过程中尽量减少cache的重新载入:

以下是引用朋友给我的邮件,作者是@Tian Tan :

先给你说个好玩的。这是我上的一门课的内容,叫high performance computing

这周在超级计算机上做了一个实验,

实验内容是想尽办法优化很小一段代码,比如矩阵乘法。

先说说cache的特点。

当访问内存中一个element的时候,

cpu会把那个element放到cache里面,

同时还会把它临近的elements放进cache。

衡量CPU快慢的一个标准是MFLOPS, 全称为millions of floating point operations per second. 实验的宗旨是写cache friendly code. 直接上例子吧。

A, B, C都是浮点数矩阵

for (i=0; i

for (j=0; j

for (k=0; k

C[i][j] += A[i][k]*B[k][j];

这是个很简单的矩阵乘法算法。但是这么写效率是不高的,

原因在于当N很大的时候,比如2048, 4096,会产生cache conflict。要解释这个术语比较麻烦,

想知道的话去看computer system: a programmer's perspective那本书的第六章。

但是矩阵乘法有别的写法。比如

for (i=0; i

for (k=0; k

for (j=0; j

C[i][j] += A[i][k]*B[k][j];

这种写法交换了k和j的位置,效率应该会比前面那个高些。(

术语是loop permutation)

还有的写法叫loop tiling,

tiling的实质是将大矩阵的乘法变成小的分块矩阵的乘法。

就用上一个例子吧。

for(it=0; it

for(jt=0; jt

for(kt=0; kt

for(i=it; i

for(j=jt; j

for(k=kt; k

C[i][j] += A[i][k]*B[k][j];

其中的T叫tiling size,能整除N。

这样先算小矩阵的话,cache 就能装下参与运算的elements, 对速度提升很大。

在实验中有一道题,

经过优化之后把运行时间从49秒降到13秒了。

矩阵乘法只是最简单例子,不同的code优化方式各异,

但是基本思想一样。

另外,正如上面说的。

使用针对你自己的CPU的编译器,编译器有可能能够识别到你的功能,做出相应的优化。

python和matlab矩阵运算效率_如何写出比 MATLAB 更快的矩阵运算程序?相关推荐

  1. python注销一段代码_请写出一段Python代码实现删除一个list里面的重复元素?

    方法1:使用set函数 s=set(list),然后再list(s) 方法2:append 1 defdelList(L):2 L1 =[]3 for i inL:4 if i not inL1:5 ...

  2. python代码怎么写出色_如何写出更具有Python风格的代码,五分钟教会你!

    我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...

  3. python怎么写出来的_如何写出优雅又地道的Python代码?【转载】

    在Python社区文化的浇灌下,演化出了一种独特的代码风格,去指导如何正确地使用Python,这就是常说的pythonic.一般说地道(idiomatic)的python代码,就是指这份代码很pyth ...

  4. python如何写代码_如何写出优雅的Python代码?

    有时候你会看到很Cool的Python代码,你惊讶于它的简洁,它的优雅,你不由自主地赞叹:竟然还能这样写.其实,这些优雅的代码都要归功于Python的特性,只要你能掌握这些Pythonic的技巧,你一 ...

  5. python中如何调用函数_我写了一个函数,如何在python中调用

    匿名用户 1级 2015-03-06 回答 Python的特色简单 Python是一种代表简单主义思想的语言.阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Pyth ...

  6. matlab模拟三体运动_如何写出三体的MATLAB程序-理论分析篇

    如何写出三体的MATLAB程序-理论分析篇 写在前面 之所以写这个程序,是因为某天晚上无聊,室友正在学习MATLAB,于是提议写一个三体运动的物理模拟程序来练练手.就此,我也写一份该程序来为室友做一个 ...

  7. matlab模拟三体运动_如何写出三体的MATLAB程序-代码篇

    如何写出三体的MATLAB程序-代码篇 写在前面 在上文当中我们已经对三个物体之间的受力进行了分析,也说明了在时间 下的加速度.速度和位移的计算方式. 本篇中将根据上一篇的公式来写出对应的代码,并且详 ...

  8. Python拾珍:用这些功能写出更简洁、更可读或更高效的代码

    本章我会带领大家回顾那些遗漏的地方.Python提供了不少并不是完全必需的功能(不用它们也能写出好代码),但有时候,使用这些功能可以写出更简洁.更可读或者更高效的代码,甚至有时候三者兼得. 19.1 ...

  9. 几十万的词如何用每页500词分页展示_如何写出一份优秀的应届生简历?

    可以确定的是,一份好的简历应当是HR喜欢和认可的简历,因为决定你的简历通过与不通过的是HR. 那么,什么样的简历才是HR喜欢和认可的呢? 一.简历内容符合岗位要求 首先,我们需要知道的是,公司招聘人才 ...

  10. matlab 图案 柱状图_值得收藏 | 如何用matlab做出酷炫的图像

    1.基础知识 1.1 二维图形绘制 plot函数是Matlab绘制二维图形的常用函数,该函数将数组中的数据点绘连起来构成一条连续的曲线. plot(x,y,'PropertyName',Propert ...

最新文章

  1. 面试官问我什么是扩展自适应机制
  2. 打印swift 变量的类型
  3. springboot-devtools idea或eclipse 热加载
  4. vue computed 中操作DOM和给对象添加属性遇到的问题
  5. 用实体类来做数据绑定(不用数据表数据字段的绑定方法)
  6. 计算机分盘介质受写入保护,“介质受写入保护”的解决(适用于U盘或移动硬盘)...
  7. ubuntu 16:使用系统自带的中文输入法
  8. 2012蓝桥杯C++本科 取球游戏
  9. Zookeeper重要概念
  10. 机器学习中类别变量的编码方法总结
  11. 【Unity Shader】学习顶点/片元着色器
  12. 特征工程与自动特征工程
  13. 物联网之STM32开发四(中断系统)
  14. 从零开始前端学习[14]:选择器的优先级
  15. 靴子落地,火山引擎官宣进军云市场
  16. 【历史上的今天】2 月 16 日:世界上第一个 BBS 诞生;中国计算机教育开端;IBM 机器人赢得智能竞赛
  17. 关于Linux系统学习心得总结(基础篇)
  18. carthage文件与配置
  19. windows应用程序-音乐播放器【一】
  20. Deep Leaning (深度学习)学习笔记二

热门文章

  1. MFC中的问题记录 2012-2-20
  2. 在moss上自己总结了点小经验。。高手可以飘过
  3. BZOJ4241历史研究题解
  4. 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
  5. PE详解之IMAGE_NT_HEADERS结构定义即各个属性的作用(PE详解02)
  6. Win7配置SVN详细步骤(服务器和客户端)
  7. 《WF编程》系列之15 - 顺序工作流与SequenceActivity 3 顺序工作流
  8. AURIX Development Studio 使用指北(不定时更新)
  9. WWW2022 | 知识提示的预训练微调
  10. 什么是迁移学习 (Transfer Learning)?这个领域历史发展前景如何?【文末彩蛋】...