關於C 中Eigen庫效率提公升的思考

2021-10-16 17:54:43 字數 1563 閱讀 7575

三、具體的例子--矩陣乘法

總結可能的方案

在處理矩陣運算上,各種語言都有了自己的處理辦法,例如: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 代表...