三、具體的例子--矩陣乘法
總結可能的方案
在處理矩陣運算上,各種語言都有了自己的處理辦法,例如:python中的numpy庫以及c++中的eigen庫等。本文主要思考在c++語言中,如何採用gpu加速計算,進一步提高矩陣計算效率。
eigen本身是乙個線性代數庫,在處理矩陣運算上非常有優勢,類似於python中的numpy。不同的是,eigen是基於c++模板的。
// 基本包括所需要的所有函式
#include
matrix<
double,3
,3> a;
// 表示a是乙個三行三列的double矩陣
a <<1,
2,3,
4,5,
6,7,
8,9;
vectorxd vec1(3
);// 動態double列向量
vec2 <<1,
2,3;
rowvectorxd vec2(4
);// 動態double行向量
vec2 <<1,
4,9,
16;
cout<< a.
rows()
;// 行數:3
cout<< a.
cols()
;// 列數:3
cout<
3);// 第4個元素,按列儲存:5
cout<
1,2)
;// 第2行第3列的元素:6
#include
#include
#include
using
namespace std;
using
namespace eigen;
intmain()
執行結果:
根據eigen和gpu平行計算的時間,可以看出差距還是存在的(也有可能是我沒有理解到eigen的精髓,**寫的不對),但比起普通的矩陣乘法明顯快了幾倍。如果資料量較小的話,二者所需要的時間則會更加接近,因此改進的必要性需要考慮。同時,由於eigen庫中方法是封裝起來的,使用者只能夠呼叫,改進的難度較大。
由於eigen的計算效率確實比gpu低,如果一定要使用gpu加速的話。我認為可行的方法是放棄eigen,將需要用到的操作自行實現,封裝為乙個個的kernel函式,只需要在使用的時候配置執行緒即可。但也有一些問題需要解決:
跨檔案訪問的問題:通常上傳到伺服器的是乙個.cu檔案,如何上傳整個專案需要下功夫。
將需要的方法封裝為kernel函式:難點。
放棄eigen的優越性:eigen作為乙個強大的庫,自有其優越的地方,完全放棄是否可取?
以上僅作為乙個eigen初學者的個人理解,如有錯誤,敬請指出。
js中的for迴圈 效率提公升
1 常用寫法 for var i 0 iconsole.log arr i 每次都需要讀取一次arr.length,進行判斷 2 陣列的長度先快取起來 for var i 0,len arr.length iconsole.log arr i 變數定義完整,不用再從陣列中取回長度,直接讓計算機判斷i...
C 中關於效率的討論(一)
date 218 04 26 by wjb 接觸c 將近一年了,自己一直在用心學習,但是總感覺自己的知識儲備太少了,心裡沒有關於架構的觀念,效率也不考慮,功能只要實現了感覺就完成任務了。而效率是開發的關鍵,我總在抱怨語言限制,認真想象還是自己技術不到家,接下來和大家討論一些關於效率的問題。今天首先說...
線性算術的C 模板庫 Eigen
eigen 是乙個線性算術的c 模板庫,包括 vectors,matrices,以及相關演算法。功能強大 快速 優雅以及支援多平台。eigen中的矩陣型別一般都是用類似matri x來表示,可以根據該名字來判斷其資料型別,比如說 d 代表double並不是用來表示整數的,f 代表float i 代表...