簡體   English   中英

如何在 cpp 和 cuda 模塊中使用 cuda class header 文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM