设备代码中的CUDA类静态成员的成语
Idiom for CUDA class static member in device code?
所以,我有一个C 14库,我要移植到Cuda 9.我实际上(我认为(对Cuda有很好的了解,但是我没有自CUDA 6。
以来,完成了任何直接工作通常,我在代码中使用很多模板和小类。令我惊讶的是,在CUDA 9中仍然无法拥有static __device__
类成员,但是全球变量很好。有很好的习语或解决方法吗?人们通常会做什么?
编辑:我应该很清楚,我的意思是专门针对模板类。如果课程没有模板,那很简单。
编辑2:这是一些示例代码
在正常的主机侧C 中,我这样做:
template <typename T>
class MyClass {
static T my_static_member;
};
在设备上,这不会编译,那么什么是一个好的等效物?
template <typename T>
class MyClass {
static __device__ T my_static_member;
};
如果您用clang编译cuda,则您的原始代码有效。
您可以使用(模板(全局变量而不是静态变量,也许将它们放在详细的名称空间中:
namespace detail {
namespace MyClass {
template <typename T> __device__ T my_static_member;
} // namespace detail
} // namespace MyClass
template <typename T>
class MyClass {
// ... you use detail::MyClass::my_static_member<T> in the code
};
...但不是这需要将--std=C++14
传递给nvcc
。
进一步的修改 - 基本上是一种样式问题 - 可能会添加一个不静止的静态但固定器:
template <typename T>
class MyClass {
const T& my_static_member() const {
return detail::MyClass::my_static_member<T>;
}
// ... you use my_static_member() in the code
};
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- C++:是否可以使用非静态成员变量模板?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在复杂继承中访问静态成员变量
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- C++构造函数和静态成员
- 为什么传递非静态成员函数会导致编译错误?
- 非静态成员失败的线程调用函数
- 静态成员变量不会由 gettext 转换
- decltype:使用指针访问类的静态成员
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- 设备代码中的CUDA类静态成员的成语