最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 利用硬件加速矩陣乘法的實現(xiàn)

 更新時間:2021年01月20日 08:58:40   作者:英雄哪里出來  
這篇文章主要介紹了C++ 利用硬件加速矩陣乘法的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、矩陣乘法定義

矩陣 A x × y 和 矩陣 B u × v 相乘的前提條件是 y = = u ,并且相乘后得到的矩陣為 C x × v(即 A 的行和 B 的列構(gòu)成了矩陣 C的行列);

 二、矩陣類封裝

我們用 C++ 封裝了一個 n × m 的矩陣類,用二維數(shù)組來存儲數(shù)據(jù),定義如下:

#define MAXN 1000
#define LL __int64

class Matrix {
private:
	int n, m;
	LL** pkData;
public:
	Matrix() : n(0), m(0) {
		pkData = NULL;
	}
	void Alloc() {
		pkData = new LL *[MAXN];            // 1)
		for (int i = 0; i < MAXN; ++i) {
			pkData[i] = new LL[MAXN];
		}
	}
	void Dealloc() {
		if (pkData) {
			for (int i = 0; i < MAXN; ++i) {      // 2)
				delete [] pkData[i];
			}
			delete[] pkData;
			pkData = NULL;
		}
	}
};

1) p k D a t a 可以認(rèn)為是一個二維數(shù)組( p k D a t a [ i ] [ j ]就是矩陣第 i 行,第 j 列的數(shù)據(jù)),之所以這里用了二維指針,是因為當(dāng) MAXN 很大時,棧上分配不了這么多空間,容易導(dǎo)致棧溢出,所以通過 new 把空間分配在了堆上;2)釋放空間的時候,首先釋放低維空間,再釋放高維空間;

三、矩陣乘法實現(xiàn)

1、ijk式

最簡單的矩陣乘法實現(xiàn)如下:

class Matrix {
	...
public:
	void Multiply_ijk(const Matrix& other, Matrix& ret) {
		// assert(m == other.n);
		ret.Reset(n, other.m);
		int i, j, k;
		for (i = 0; i < n; i++) {
			for (j = 0; j < other.m; j++) {
				for (k = 0; k < m; k++) {
					ret.pkData[i][j] += pkData[i][k] * other.pkData[k][j];
				}
			}
		}
	}
};

這種方法被稱為ijk 式,對矩陣乘法 A × B = C ,枚舉 A 的每一行,再枚舉 B的每一列,分別對應(yīng)相乘后放入矩陣 C的對應(yīng)位置中,如下圖所示;

在這里插入圖片描述 

2、 ikj 式

對上述算法進(jìn)行一些改進(jìn),交換兩個內(nèi)層循環(huán)的位置,得到如下算法:

class Matrix {
	...
public:
	void Multiply_ikj(const Matrix& other, Matrix& ret) {
		// assert(m == other.n);
		ret.Reset(n, other.m);
		int i, j, k;
		for (i = 0; i < n; i++) {
			for (k = 0; k < m; k++) {
				LL v = pkData[i][k];
				for (j = 0; j < other.m; j++) {
					ret.pkData[i][j] += v * other.pkData[k][j];
				}
			}
		}
	}
};

這種方法被稱為 ikj 式,對矩陣乘法 A × B = C A \times B = C A×B=C,行優(yōu)先枚舉 A A A 的每一個格子,再枚舉 B B B 的每一行,分別對應(yīng)相乘后放入矩陣 C C C 的對應(yīng)位置中,每次相乘得到的 C C C 都是部分積,如下圖所示,用綠色的深淺來表示這個值是否已經(jīng)完整求得;

在這里插入圖片描述 

3、kij 式

對上述算法再進(jìn)行一些改進(jìn),交換兩個外層循環(huán)的位置,得到如下算法:

class Matrix {
	...
public:
	void Multiply_kij(const Matrix& other, Matrix& ret) {
		// assert(m == other.n);
		ret.Reset(n, other.m);
		int i, j, k;
		for (k = 0; k < m; k++) {
			for (i = 0; i < n; i++) {
				LL v = pkData[i][k];
				for (j = 0; j < other.m; j++) {
					ret.pkData[i][j] += v * other.pkData[k][j];
				}
			}
		}
	}
};

這種方法被稱為 k i j kij kij 式,對矩陣乘法 A × B = C A \times B = C A×B=C,列優(yōu)先枚舉 A A A 的每一個格子,再枚舉 B B B 的每一行,分別對應(yīng)相乘后放入矩陣 C C C 的對應(yīng)位置中,每次相乘得到的 C C C 都是部分積,如下圖所示,用綠色的深淺來表示這個值是否已經(jīng)完整求得;

在這里插入圖片描述 

四、時間測試

矩陣階數(shù) i j k ijkijk i k j ikjikj k i j kijkij
200 47 ms 31 ms 16 ms
500 781 ms 438 ms 453 ms
1000 8657 ms 3687 ms 3688 ms
2000 69547 ms 28000 ms 29672 ms

由于矩陣乘法本身的時間復(fù)雜度是 O(N3) 的,所以數(shù)據(jù)量越大,越能看出實際效果;

五、原理分析

原因是因為 CPU 訪問內(nèi)存的速度比 CPU 計算速度慢得多,為了解決速度不匹配的問題,在 CPU 與 內(nèi)存 之間加了高速緩存cache。高速緩存 cache 的存在大大提高了 CPU 訪問數(shù)據(jù)的速度。但是當(dāng)內(nèi)存訪問不連續(xù)的時候,就會導(dǎo)致 cache 命中率降低,所以為了加速,就要盡可能使內(nèi)存訪問連續(xù),即不要跳來跳去。矩陣

六、最后結(jié)論

運行速度: ikj ≈ kij > ijk

模板地址:矩陣乘法模板

到此這篇關(guān)于C++ 利用硬件加速矩陣乘法的實現(xiàn)的文章就介紹到這了,更多相關(guān)C++ 矩陣乘法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)自定義撤銷重做功能的示例代碼

    C++實現(xiàn)自定義撤銷重做功能的示例代碼

    在使用c++做界面開發(fā)的時候,尤其是實現(xiàn)白板功能時需要自己實現(xiàn)一套撤銷重做功能.如果是qt則有QUndoable對象,可以直接拿來用。但是如果是使用gdi繪圖,則可能需要自己實現(xiàn)了。本文就來用C++實現(xiàn)自定義撤銷重做功能,需要的可以參考一下
    2022-12-12
  • C語言用Easyx繪制圍棋和象棋的棋盤

    C語言用Easyx繪制圍棋和象棋的棋盤

    這篇文章主要為大家詳細(xì)介紹了C語言用Easyx繪制圍棋和象棋的棋盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言用封裝方法實現(xiàn)飛機(jī)大戰(zhàn)游戲

    C語言用封裝方法實現(xiàn)飛機(jī)大戰(zhàn)游戲

    這篇文章主要為大家詳細(xì)介紹了C語言用封裝方法實現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言實現(xiàn)考勤管理系統(tǒng)

    C語言實現(xiàn)考勤管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)考勤管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 深入理解Qt 智能指針

    深入理解Qt 智能指針

    智能指針是一種特殊的指針,可以自行管理和釋放資源,防止內(nèi)存泄漏和懸掛指針,本文主要介紹了深入理解Qt 智能指針,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • VSCode配置C/C++并添加非工作區(qū)頭文件的方法

    VSCode配置C/C++并添加非工作區(qū)頭文件的方法

    這篇文章主要介紹了VSCode配置C/C++并添加非工作區(qū)頭文件的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C++ 的 format 和 vformat 函數(shù)示例詳解

    C++ 的 format 和 vformat 函數(shù)示例詳解

    傳統(tǒng)C庫的printf系列函數(shù)存在安全問題,而C++推薦的基于流格式化輸入輸出雖然解決了安全性問題,但在易用性方面仍顯不足,C++11引入了新的C風(fēng)格字符串格式化函數(shù),但類型安全問題依舊存在,下面通過本文介紹C++ 的 format 和 vformat 函數(shù)示例,感興趣的朋友一起看看吧
    2025-02-02
  • 一文總結(jié)C++中的異常

    一文總結(jié)C++中的異常

    異常是一種處理錯誤的方式,當(dāng)一個函數(shù)發(fā)現(xiàn)自己無法處理的錯誤時就可以拋出異常,讓函數(shù)的直接或間接調(diào)用者處理這個錯誤,本文給大家總結(jié)了C++中的異常,需要的朋友可以參考下
    2023-10-10
  • C++中cout輸出中文信息亂碼問題及解決

    C++中cout輸出中文信息亂碼問題及解決

    這篇文章主要介紹了C++中cout輸出中文信息亂碼問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言和C++的6點區(qū)別

    C語言和C++的6點區(qū)別

    在本篇文章里我們給大家整理了關(guān)于C語言和C++的6點區(qū)別,需要的朋友們可以學(xué)習(xí)參考下。
    2019-02-02

最新評論

木里| 阿克| 凤山县| 虎林市| 宁波市| 汤原县| 临西县| 威宁| 太白县| 越西县| 景德镇市| 简阳市| 浑源县| 中牟县| 息烽县| 无极县| 凤台县| 青阳县| 合江县| 崇州市| 旺苍县| 安龙县| 水富县| 大埔县| 安丘市| 兴仁县| 肥城市| 庐江县| 松阳县| 临海市| 中超| 辉南县| 台东县| 新晃| 绥江县| 阳新县| 太原市| 祁连县| 防城港市| 安福县| 平遥县|