偏個題。
說到這個想起之前朋友和我說到他最近在上一個課。
那個課上,教授要求他們寫Cache friendly code。
尤其像矩陣這種很大塊的東西,在運算時,會導致cache根本無法完全裝下需要使用的數據。
此刻,如果程序沒有設計得很有技巧,不斷地刷新cache,會需要浪費大量的時間。
matlab能用python寫嗎、所以,他們教了好幾種方法去計算矩陣,讓整個計算過程中盡量減少cache的重新載入:
以下是引用朋友給我的郵件,作者是@Tian Tan :
先給你說個好玩的。這是我上的一門課的內容,叫high performance computing
這周在超級計算機上做了一個實驗,
實驗內容是想盡辦法優化很小一段代碼,比如矩陣乘法。
先說說cache的特點。
用matlab進行矩陣運算。當訪問內存中一個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
Python MATLAB?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那本書的第六章。
python創建矩陣?但是矩陣乘法有別的寫法。比如
for (i=0; i
for (k=0; k
for (j=0; j
C[i][j] += A[i][k]*B[k][j];
這種寫法交換了k和j的位置,效率應該會比前面那個高些。(
numpy矩陣乘法。術語是loop permutation)
還有的寫法叫loop tiling,
tiling的實質是將大矩陣的乘法變成小的分塊矩陣的乘法。
就用上一個例子吧。
for(it=0; it
for(jt=0; jt
python set函數?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。
python矩陣計算。這樣先算小矩陣的話,cache 就能裝下參與運算的elements, 對速度提升很大。
在實驗中有一道題,
經過優化之后把運行時間從49秒降到13秒了。
矩陣乘法只是最簡單例子,不同的code優化方式各異,
但是基本思想一樣。
另外,正如上面說的。
python和matlab速度。使用針對你自己的CPU的編譯器,編譯器有可能能夠識別到你的功能,做出相應的優化。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态