如何在CUDA中使用静态常量成员

How can I use static const members in CUDA?

本文关键字:静态 常量 成员 CUDA      更新时间:2023-10-16

我目前正在使用CUDA将我的光线跟踪器移植到GPU,为了让我的脚湿润,我正在修改示例CUDA 6.5项目(添加一个整数数组),以使用自定义的Color结构而不是整数。然而,每当我编译代码时,我都会遇到各种错误。

我有用__host____device__属性声明的类的所有成员函数,并且我有.cu文件中的所有定义代码。在我的颜色结构中,我有一个Darken方法,它将给定的颜色插值为给定的黑色。我还有一个Darken函数使用的黑色的静态定义。

例如,这里有一个结构的精简版本:

// **********************
//       .hpp file
// **********************
struct Color
{
    float R;
    float G;
    float B;
    __host__ __device__ static Color Darken(const Color& c, float amount);
    static Color Black;
};
// **********************
//        .cu file
// **********************
const Color Color::Black( 1.0f, 1.0f, 1.0f );
Color Color::Darken(const Color& c, float amount)
{
    return Color( Math::Lerp( c.R, Black.R, amount ),
                  Math::Lerp( c.G, Black.G, amount ),
                  Math::Lerp( c.B, Black.B, amount )  );
}

然而,每当我去编译代码时,我都会收到以下错误:

error : identifier "rex::Color::Black" is undefined in device code

我已经尝试将__device____host____global__和这些说明符的各种组合添加到颜色中,但CUDA编译器告诉我它们不适用。此外,在我将任何说明符添加到静态颜色之后,对于颜色的RGB组件,我会得到相同的错误。

有人知道我如何使用CUDA中的静态颜色定义吗?

根据文档,CUDA对象模型不支持静态数据成员,因此没有直接的方法来完成您想要做的事情。

正如Robert Crovella在评论中指出的那样,可以使用__constant__内存声明来实现类似的功能,也可以在使用整个编译时使用命名空间技巧来绕过重复的定义,或者在单独编译中使用带有单个定义的extern

[此答案被添加为社区wiki条目,以将此问题从未回答的问题列表中删除]