设备代码中的CUDA类静态成员的成语



所以,我有一个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
};

最新更新