cuda與Eigen不相容的解決方案

2021-07-08 10:47:18 字數 1227 閱讀 5446

cuda提供強大的矩陣計算庫cublas,但cublas沒法進行特徵值、逆矩陣等高階的運算,要解決這個問題,要麼自己寫演算法(太難),要麼呼叫線性代數運算庫,而線性代數運算庫中eigen是最簡便易用的乙個。

當我想把這兩個庫放在一起編譯的時候,出現了嚴重問題:用vs編譯無法通過!!!

用google查了一下,似乎不少人都遇到過這個問題,對於linux系統,這個問題是可以解決的,gcc4.7 以上是可以解決這個問題的(參看需翻牆)

但對於windows的vs,這個問題暫時無解。

後來看有人提出乙個解決思路,就是把host部分的**和device部分的**分開編譯。原因是:eigen庫的語法過於複雜,以至於cuda的編譯器無法解析。分開編譯的話,兩部分**使用不同的編譯器,就解決了這個問題,然後封裝一些介面,解決兩個部分相互呼叫的問題。但文中只是提供了乙個思路,沒有講具體實現方法。(參看

我馬上學習了編譯多個原始檔的知識,進行嘗試,終於解決cuda與eigen不相容的問題。

我的解決思路是這樣的:

把程式的主體部分(包括eigen)都放在.cpp下。

把cuda需要用到的**放在.cu下。

在vs中,project->add new item ,將上面那個.cpp檔案新增進去

在.cpp檔案和.cu中都宣告乙個命名空間 cuda_functions,將介面函式的宣告放進去,然後這些函式在.cu檔案中實現,例如:

namespace cuda_functions;

#include

#include "cublas_v2.h"

#include "cuda_functions.h"

void cuda_functions::malloc(void ** p,size_t s);

void cuda_functions::free(void * p);

#include

#include

using namespace eigen;

using namespace std;

#include "cuda_functions.h"

void main(){

float * p;

cuda_functions::malloc((void **)& p,sizeof(float)*10000);

cuda_functions::free((void *) p);

while(1);

上面這段**實現在.cpp檔案中,開闢和釋放視訊記憶體空間。

eigen3 與 cuda10 0相容問題

環境 ubuntu16.04 cuda10.0 eigen3.3.7 pcl1.8.1 編譯過程中一直受下面問題困擾,usr include eigen3 eigen src core arch cuda half.h 212 error more than one instance of over...

yum與python不相容

主要是rhel 5.1 自帶的python版本是2.4。yum所需要的版本是2.4 於是的於是就有了下面給python公升級的過程 centos 5.5 中實驗成功,其他發行版本linux可作參考 wget 解壓tar jxvf python 2.6.5.tar.bz2 編譯安裝 cd python...

不相容的量度

在做相關性分析的過程中提示,不相容的量度 具體提示資訊 error in cor tp53 expr,ratio cells,method pearson 不相容的量度 主要是維度上有問題,在做相關性分析的時候要保持兩個矩陣或者資料框的行數一致,這是前提,在比較之前檢查一下,行列數目顛倒時,利用轉置...