【问题标题】:how to use a cuda class header file in both cpp and cuda modules如何在 cpp 和 cuda 模块中使用 cuda 类头文件
【发布时间】:2015-08-15 06:46:37
【问题描述】:

我正在尝试在我的设备中创建 Color 对象。这是我所拥有的简化版本:

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>>>()
}

这给了我一个错误提示

不允许从 global 函数调用 host 函数

所以这很好。我只需要在 Color(){} 函数前面添加 __host__ 和 __device__ 。

然后我收到以下错误:

主机没有命名类型

所以据我了解,这是因为我没有使用 nvcc 编译它。问题是我正在使用 CMake 来构建我的项目。我不太确定它是如何做到的,但它似乎是用 c++ 编译器编译 .cpp 文件,用 nvcc 编译器编译 .cu 文件。

但在我的设备中,我想创建 Color 对象。有没有办法在我的 CMakefiles 或我的代码中解决这个问题?还是我需要为我现有的所有类创建一个 cuda 版本?

【问题讨论】:

    标签: c++ cuda


    【解决方案1】:

    这样的事情应该可以工作:

    #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__ macro。当它包含在 .cpp 文件中(nvcc 将其交给主机编译器)时,将不会定义宏。

    【讨论】:

    • 我只是复制了你所拥有的,c++ 编译器按预期工作,但 nvcc 编译器给了我同样的错误。
    • 我想是的。 (构造函数是 Color 类中的一个函数。)试试看。
    • hmm 对于构造函数,它似乎工作正常,但对于某些函数,我收到错误消息“未解析的外部函数 function_name”
    • 我尝试了一个简单的 getter 函数。这对我来说似乎工作得很好。您可能需要提供一个示例。我建议提出一个新问题。您可能只是被类使用而不是__host__ __device__ 使用所特有的任何东西绊倒。
    • 如果我尝试在 .cpp 文件中定义 Color() ,我得到一个构建错误,如果我们真的想在 .cpp 文件中实现一个函数该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2023-04-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多