c – 设备代码中CUDA类静态成员的成语?
作者:互联网
所以,我有一个C 14库,我正在移植到CUDA 9.我实际上(我认为)对CUDA非常了解,但是自从CUDA 6以来我没有做过任何直接的工作.
通常,我在代码中使用了很多模板和小类.令我感到惊讶的是,在CUDA 9中仍然没有静态的__device__类成员,但是全局变量很好.这有一个很好的习语或解决方法吗?人们通常做什么?
编辑:我应该清楚,我的意思是专门针对模板化课程.如果这个类没有模板化,那就非常简单了.
编辑2:这是一些示例代码
在正常的主机端C我这样做:
template <typename T>
class MyClass {
static T my_static_member;
};
在设备上,这将无法编译,那么什么是一个很好的等价物?
template <typename T>
class MyClass {
static __device__ T my_static_member;
};
解决方法:
您可以使用(模板化的)全局变量而不是静态成员,也可以将它们放在详细命名空间中:
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,c11,cuda,gpu-programming,static-members 来源: https://codeday.me/bug/20190828/1748288.html