2011-11-22 64 views
1

我有一些.cpp文件實現了平滑粒子流體動力學,這是一個用於建模流體流動的粒子方法。編寫一個CUDA內核來替換一個等效的CPU專用函數

這些粒子技術中最耗時的組件之一是在每個時間步的模擬中找到每個粒子的最近鄰居(K-最近鄰居或範圍搜索)。

現在我只是想加快使用GPU和CUDA的鄰居搜索例程,取代我的當前基於CPU的鄰居搜索例程。只有鄰居搜索纔會在GPU上運行,而其餘的模擬在CPU上進行。

我的問題是,我應該如何編譯整個代碼?更具體地說,假設我在文件nsearch.cu中寫入鄰居搜索內核函數。

那麼應該怎麼重命名我以前所有的.cpp文件作爲.cu文件並重新編譯整套使用nvcc(連同nsearch.cu)?至少對於簡單的例子,nvcc 不能編譯CUDA代碼,擴展名爲.cpp,即nvcc foo.cu編譯,但nvcc hello.cpp沒有編譯。

總之,這個CUDA插件的結構應該如何,我應該如何編譯它?

我使用Ubuntu Linux操作系統的10.10,CUDA 4.0,NVIDIA GTX 570(計算能力2.0)和GCC編譯器我的工作

回答

2

你需要編寫nsearch.cu文件,並編譯「nvcc -c -o nsearch.o」然後將nsearch.o鏈接到主應用程序。必須有一個nsearch.h文件,用於輸出實際內核的包裝。

in nsearch.h : 
void kern(); 

in nsearch.cu: 
void __global__ kern__() { 
} 
void kern() { 
    kern__<<<...>>>(); 
} 
0

這是你的問題更廣泛的響應,因爲我經歷過一個非常類似的思維過程,你 - 在移動我的流體力學代碼GPU,同時把其他所有的CPU。儘管我認爲這是您應該開始的地方,但我也認爲您應該開始計劃將所有其他代碼也移到GPU上。我發現,雖然GPU非常擅長進行模擬所需的矩陣分解,但GPU和CPU內存之間的內存邊界非常緩慢,以至於GPU仿真時間的80-90%被花費在cudaMemcpyDeviceToHost/cudaMemcpyHostToDevice。