如何在CUDA中使用静态常量成员
How can I use static const members in CUDA?
我目前正在使用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编译器告诉我它们不适用。此外,在我将任何说明符添加到静态颜色之后,对于颜色的R
、G
和B
组件,我会得到相同的错误。
有人知道我如何使用CUDA中的静态颜色定义吗?
根据文档,CUDA对象模型不支持静态数据成员,因此没有直接的方法来完成您想要做的事情。
正如Robert Crovella在评论中指出的那样,可以使用__constant__
内存声明来实现类似的功能,也可以在使用整个编译时使用命名空间技巧来绕过重复的定义,或者在单独编译中使用带有单个定义的extern
。
[此答案被添加为社区wiki条目,以将此问题从未回答的问题列表中删除]
相关文章:
- 私有类型的静态常量成员
- 分离一个静态常量 std::thread?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- 如何为静态常量模板化专用整数值分配存储
- 使用什么代替"静态常量 TCHAR *"
- C++ 模板中的静态常量初始化顺序
- 如何在编译时解析静态常量 std::string?
- 关于静态常量数据模因的声明和定义的混淆
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 为什么在第二类中使用静态常量会在第一类中给出编译器错误?
- 静态常量与常量局部变量,哪一个性能更好
- 如何在模板类中设置静态常量变量
- public:静态常量字符串声明/初始化问题
- 有没有办法声明一个公共静态常量,该常量将使用 constexpr 在源文件中定义(有什么区别)?
- 对静态常量积分类型的未定义引用
- 全局变量中的静态常量与常量
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 避免在静态常量类上定义但不使用
- 指向静态常量对象的共享指针?