mpi和cuda混合程式設計的正確編譯

2021-06-16 11:23:12 字數 1513 閱讀 2348

針對大資料的計算,很多程式通過搭建mpi集群進行加速,並取得了很好的效果。演算法內部的加速,當前的並行化趨勢是利用gpu顯示卡進行演算法加速。針對並行性非常好的演算法,gpu加速效果將遠大於集群帶來的加速效果。所以,如果我們面臨非常多的資料,針對資料的處理演算法有具有很好的內部並行性,則我們可以將mpi和gpu結合,獲得更大的加速比。

將mpi和gpu結合的產物就是gpu集群。它可以為我們帶來非常高的加速比。雖說nvidia的cuda為我們提供了類c語言的程式設計環境,但是cuda還不是c語言,這就為mpi和cuda程式設計的融合帶來了難度。我們通過乙個具體例項來說明mpi和cuda混合程式設計的編譯方法。

下面是要編譯專案的makefile檔案,該專案有三個檔案:mpi.cpp,cpp.cpp和cuda.cu,分別表示這三個檔案是mpi檔案,常規cpp和cuda檔案。mpi檔案通過呼叫cpp檔案和cu檔案來實現相應功能。

all: target

cc = mpic++

nvcc = nvcc

cflags+= -o3

ldflags= -l/usr/local/cuda/lib64 -l/root/nvidia_gpu_computing_sdk/c/lib

ldflags+= -lcutil_x86_64 -lm -lcufft -lcublas

nvccflags= -i /usr/local/cuda/include -i /root/nvidia_gpu_computing_sdk/c/common/inc

#nvccflags+= -arch sm_20

target: mpi.o cpp.o cuda.o

$(cc) $(ldflags) -o $@ $^

%.o : %.cu

$(nvcc) $(nvccflags) $(cflags) -o $@ -c $^

%.o: %.cpp

$(cc) $(nvccflags) $(cflags) -o $@ -c $^

clean:

$(rm) *.o *.s *.i target

在程式設計的過程中,盡量不要用.c編寫程式,而要用.cpp編寫程式。在測試過程中發現,用.c編寫程式會發生undefined reference to 「symbols」錯誤。通過makefile檔案我們可以看出:常規的

cpp檔案不是利用

g++進行編譯,而是

mpic++

進行編譯;

cuda

程式還是利用

nvcc

編譯器進行編譯;鏈結的時候要採用

mpic++

編譯器。mpi在呼叫cuda程式的時候,雖然它沒有顯示呼叫cuda相關的標頭檔案,但是它呼叫的cuda程式包含cuda相關的標頭檔案,所以為了保證在編譯mpi.cpp檔案時不出現找不到標頭檔案的錯誤,我們也需要包含相應cuda標頭檔案的目錄。鏈結過程中,即使是mpic++編譯器,我們也需要包含相應cuda庫的目錄,否則也會報錯。

上述makefile是乙個測試模版,但是根據該模版的規則擴充套件就可以正確編譯mpi和cuda程式。

C 和C 混合程式設計

由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1int ...

c 和Python混合程式設計

1.設定環境 1 在vs的附加包含目錄中新增python的include路徑 2 在vs linker的附加庫目錄中新增python的libs路徑 3 注意,如果安裝的python是64位的,那麼vs工程也要是一直對應的x64活動平台,否則會報 無法解析的外部符號 imp py initialize...

C 和C 混合程式設計

由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1 int...