1. 程式人生 > >從矩陣乘法的不同計算方式來看區域性性原理

從矩陣乘法的不同計算方式來看區域性性原理

今天碰到的關於矩陣乘法不同情況下運算速度的問題,隱約記得是因為快取的問題,後來突然想起來CSAPP那本書上講過這個東西的,就是通過矩陣乘法三重迴圈的不同順序來講的區域性性原理的,所以翻過來又看了一下。

兩個矩陣A,B相乘得到C【為了方便起見,把它們都看成n*n的方陣】經典的做法就是用三重迴圈來實現,但是具體這三重迴圈如何進行排列,就非常的有講究。
假設n是一個非常大的數,也就意味著如果跨行的話,必然不會快取命中,假設只有一個告訴快取,其塊大小為32位元組,也就說一個塊只能存4個double

經典做法ijk和jik

for(i=0;i<n;++i)
    for(j
=0;j<n;++j) { double sum=0; for(k=0;k<n;++k) sum+=a[i][k]*b[k][j]; c[i][j]+=sum; } for(j=0;j<n;++j) for(i=0;i<n;++i) { double sum=0; for(k=0;k<n;++k) sum+=a[i][k]*b[k][j]; c[i][j]+=sum; }

這兩種方法的複雜度分析是一樣的.AB之中必有一個是每次都不命中的,剩下一個每四個不命中一次。

每次迭代A不命中的次數 每次迭代B不命中的次數 每次迭代C不命中的次數 總數
0.25 1 0 1.25
1 0.25 0 1.25

jki和kji版本

for(j=0;j<n;++j)
    for(k=0;k<n;++k)
    {
        double r = b[k][j];
        for(i=0;i<n;++i)
            c[i][j]+=a[i][k]*r;
    }

for(k=0;k<n;++k)
    for(j=0;j<n;++j)
    {
        double r = b[k][j];
        for(i=0
;i<n;++i) c[i][j]+=a[i][k]*r; }

這兩種方法是最差的方法,因為每次c和a兩個都完全不命中

每次迭代A不命中的次數 每次迭代B不命中的次數 每次迭代C不命中的次數 總數
1 0 1 2

最好的方法kij和ikj版,即讓最頻繁變動的層不動

for(k=0;k<n;++k)
    for(i=0;i<n;++i)
    {
        double r = a[i][k];
        for(j=0;j<n;++j)
            c[i][j]+=r*b[k][j];
    }

for(i=0;i<n;++i)
    for(k=0;k<n;++k)
    {
        double r = a[i][k];
        for(j=0;j<n;++j)
            c[i][j]+=r*b[k][j];
    }

這樣最裡面的迴圈那層,每次訪問都保證了空間區域性性

每次迭代A不命中的次數 每次迭代B不命中的次數 每次迭代C不命中的次數 總數
0 0.25 0.25 0.5

所以可以看到,雖然矩陣乘法非常的簡單,但是具體實現起來,其優化所要做到的細節還是非常多的,涉及到訪存的問題還是比較複雜的,尤其是對於區域性性的理解。

相關推薦

矩陣乘法不同計算方式來看區域性性原理

今天碰到的關於矩陣乘法不同情況下運算速度的問題,隱約記得是因為快取的問題,後來突然想起來CSAPP那本書上講過這個東西的,就是通過矩陣乘法三重迴圈的不同順序來講的區域性性原理的,所以翻過來又看了一下。 兩個矩陣A,B相乘得到C【為了方便起見,把它們都看

矩陣乘法來看-O優化和ijk執行順序對程式效能的影響

從矩陣乘法來看-O優化和ijk執行順序對程式效能的影響 根據計算矩陣乘積的c程式,主要想做想做兩件事情: 統計採用不同的優化選項編譯程式所用的時間,感受-O優化帶來的效能提升。 看看矩陣乘法中不同迴圈順序對程式效能的影響: 改變三重迴圈的順序,統

作業系統實驗——序列、多執行緒和執行緒池三種方式計算矩陣乘法

package cn.edu.seu.yujun.OS; /** * * @author Fish * Date:2015/4/7 */ public class WorkThread implements Runnable { private int start;//計算開始位置,以此區分工作執

矩陣乘法來加速遞推式計算

span code 分享 pow quic mage src .com image Codevs1281: 給你6個數,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn 計算遞推式,運用矩陣來進行計算加速 然後註意用類似快速冪的

神經網路高效能運算 卷積計算優化 openblas GEMM 矩陣乘法優化 ncnn mobileNet-ssd shueezeNet-ssd

HighPerformanceComputing 高效能運算(High performance computing, 縮寫HPC) 指通常使用很多處理器(作為單個機器的一部分) 或者某一叢集中組織的幾臺計算機(作為單個計 算資源操作)的計算系統和環境。 有許多型別的HP

淺談斐波那契數列——遞推到矩陣乘法

說在前面 相信大家都已經知道這個中外著名的費波納切數列了吧,關於費波那契數列有很多有趣的性質,但我們這裡不講,在這裡我們只是利用斐波那契數列來引出另一個神奇的東西,矩陣乘法,遞推在這裡是起一個對比與鋪墊的作用,(沒有對比就不知道矩陣乘法有多快)。 斐波那

【華為機試070】矩陣乘法計算量估算

題目描述: 矩陣乘法的運算量與矩陣乘法的順序強相關。 例如:     A是一個50×10的矩陣,B是10×20的矩陣,C是20×5的矩陣   計算A*B*C有兩種順序:((AB)C)或者(A(BC)),前者需要計算15000

TensorFlow不同交叉熵計算方式

import tensorflow as tf #our NN's output logits=tf.constant([[1.0,3.0,2.0],[3.0,2.0,1.0],[1.0,2.0

線性代數教程之一——矩陣乘法計算、理解及程式碼實現

參考了《深度學習》鉅作,以下是矩陣篇的目錄。 1 矩陣的乘法 設矩陣A為m×n矩陣,B為n×p矩陣,則它們的乘法公式為: 相關程式碼實現: # 矩陣滴乘法運算 # 注意:需要傳入np.matrix型別資料 def Matrix_Mul(a,b):

CUDA之矩陣乘法——非方陣計算

說明 A矩陣為M * N,B矩陣為N * M 程式碼 #include "device_functions.h" #include "cuda_runtime.h" #include "device_launch_parameters.h" #incl

三種不同方式計算歐氏距離,速度比較

def int list axis return arr () num ces import timeimport numpy as np#計算單行的歐氏距離def cal_1(vec): dist = np.linalg.norm(vec) sim = (1.

給定一個有向圖,問A點恰好走k步(允許重複經過邊)到達B點的方案數---矩陣乘法

#include <iostream> #include <cstdio> #include <algorithm> #include <cmath>

cublas中執行矩陣乘法運算的函式 首先要注意的是cublas使用的是以列為主的儲存方式,和c/c++中的以行為主的方式是不一樣的。處理方法可參考下面的註釋程式碼

cublas中執行矩陣乘法運算的函式 首先要注意的是cublas使用的是以列為主的儲存方式,和c/c++中的以行為主的方式是不一樣的。處理方法可參考下面的註釋程式碼 cublas中執行矩陣乘法運算的函式 首先要注意的是cublas使用的是以列為主的儲存方式,和c/c+

java 多執行緒平行計算矩陣乘法(星星筆記)

用java編寫兩個n階的方陣A和B的相乘程式,結果存放在方陣C中,其中使用Runnable介面實現矩陣的乘法。 方陣A和B的初始值如下:(同時開兩個執行緒) 輸出:c中所有元素之和、程式的執行時間 具體的程式如下: package com.xing.matrix; /

C++矩陣乘法計算 || GPU && CPU 實現

前言 矩陣乘法運算是機器學習的基礎。比如,卷積神經網路通過矩陣化輸入資料,然後通過矩陣乘法計算獲得結果。而效能對於演算法是至關重要的事情,所以本文主要介紹c++呼叫普通的矩陣乘法庫進行計算,以及通過cuda計算矩陣乘法。C++常用cblas庫加速cpu上的矩陣

遞推式計算矩陣乘法 C++

以斐波那契數列為例,計算斐波那契數列的矩陣方法程式碼如下: (快速冪、矩陣乘法)《挑戰程式設計競賽第二版》P199 #include<iostream> #include<vect

矩陣計算矩陣乘法其一:基礎符號和演算法

矩陣符號 如果用表示所有實數的集合,那麼我們用表示所有的實數矩陣組成的向量空間,即: 其中,大寫字母(如)表示矩陣,帶下標的小寫字母(如)表示矩陣中的元素。除了用表示矩陣中第行第列的元素之外,也可以用和表示。 矩陣操作 矩陣轉置(transposition): 矩陣加法(addition): 標量-矩陣乘

矩陣乘法的平行計算

設兩個矩陣A和B,大小分別為M * N 和 N * P, 如果C = A * B, 則C的大小為M * P。 矩陣演算法的演算法表示,虛擬碼如下: for (i = 0; i < M; ++i){       for (j = 0; j < P; +

華為OJ——矩陣乘法計算量估算

矩陣乘法計算量估算 題目描述 矩陣乘法的運算量與矩陣乘法的順序強相關。例如:     A是一個50×10的矩陣,B是10×20的矩陣,C是20×5的矩陣 計算A*B*C有兩種順序:((AB)C)或者(A(BC)),前者需要計算15000次乘法,後者只需要3500次。 編寫程

【BZOJ2553】[BeiJing2011]禁忌 AC自動機+期望DP+矩陣乘法

現在 using put 重疊 [0 return name 概念 註意 【BZOJ2553】[BeiJing2011]禁忌 Description Magic Land上的人們總是提起那個傳說:他們的祖先John在那個東方島嶼幫助Koishi與其姐姐