[英]how to use a cuda class header file in both cpp and cuda modules
我正在嘗試在我的設備中創建顏色 object。 這是我所擁有的簡化版本:
在Color.hpp 中:
class Color {
public:
Color(){}
float r, g, b;
// other functions
}
在test.cu 中:
__global__ void runCuda(){
Color c = Color();
}
int main() {
runCuda<<<1,1>>>()
}
這給了我一個錯誤說
不允許從全局function 調用主機function
所以這很好。 我只需要在 Color(){} function 前面添加 __host__ 和 __device__。
但后來我收到以下錯誤:
主機沒有命名類型
所以據我所知,這是因為我沒有用 nvcc 編譯它。 問題是我正在使用 CMake 來構建我的項目。 我不太確定它是如何做到的,但它似乎是用 c++ 編譯器編譯 .cpp 文件,用 nvcc 編譯器編譯 .cu 文件。
但是在我的設備中,我想創建顏色 object。有沒有辦法在我的 CMakefile 或代碼中解決這個問題? 或者我是否需要為所有現有課程創建一個 cuda 版本?
這樣的事情應該起作用:
#ifdef __CUDACC__
#define CUDA_HOSTDEV __host__ __device__
#else
#define CUDA_HOSTDEV
#endif
class Color {
public:
CUDA_HOSTDEV Color(){}
float r, g, b;
// other functions
};
當您的hpp文件包含在.cu文件中時,將定義__CUDACC__
宏 。 當它包含在.cpp文件(nvcc移交給主機編譯器)中時,將不會定義宏。
您也可以嘗試以下操作。
#ifndef __host__
#define __host__
#endif
#ifndef __device__
#define __device__
#endif
使用這種方法,您不需要修改代碼。 我不確定這是否符合猶太潔食標准,但它似乎適用於我的項目。 在包含 CUDA 標頭之后,您可能應該包含這些定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.