2017-08-27 153 views
0

我想我的C++只項目CUDA代碼在GPU上運行的轉換。cuda - nvcc如何編譯__host__代碼?

我是新來的CUDA編程,我不知道如何處理這種情況下做的:

如果我有一個非常複雜的類定義,現在我想一個類實例傳遞給設備並執行它的一些成員函數在設備上,然後我應該重寫我的整個.cpp文件。我是否只需要將設備上運行的這些功能轉換爲__host__ __device__或者是否應該重寫所有功能?

我認爲沒有功能類型限定爲__host__nvcc治療功能。它如何編譯主機代碼?它是否完全按照g++進行編譯?

回答

1

如果我有一個非常複雜的類定義,現在我想將 類實例傳遞給設備,並執行一些的設備上它的成員函數 ,我則應該重寫我的整個.cpp文件。難道我只 需要打開設備運行這些功能__host__ __device__或 我應該重寫所有的功能?

這完全取決於你的代碼。 CUDA支持C++語言功能的有限子集(完整文檔here),並且幾乎不支持C++標準庫。所以沒有一般​​的答案,但如果你想在GPU上調用它,很可能你將不得不重寫至少一些你的類成員函數代碼。

我認爲nvcc把沒有函數類型限定符的函數視爲__host__。它如何編譯主機代碼?它是否像g ++一樣編譯它們?

首先要明白的是,NVCC不是一個編譯器,它是一個編譯器驅動程序。沒有.cu文件擴展名的文件中的純C++代碼默認情況下直接通過一組預定義的編譯器選項直接傳遞給主編譯器,而不需要修改。一個.CU擴展文件內

主機代碼由CUDA C++前端解析以尋找CUDA語法,然後傳遞到主機編譯器。這個過程可能會在極其複雜的模板定義和流血的語言功能上失敗。 nvcc還自動包含CUDA頭文件,這些頭文件可能會與您自己的代碼的內容發生衝突。但是,最終你的主機代碼會到達主機C++編譯器,儘管是通過不同的路線。