在我现在正在编写的程序中,我想使用GPU或CPU进行计算(将一个基准与另一个基准进行比较)。为此,我希望有一些通用指针,可以使用device_vector或host_vector的实例进行初始化,如下所示:

ptr = new host_vector<float>();

要么
ptr = new device_vector<float>();

host_vector和device_vector都从detail::vector_base继承,但是我不能使用detail::vector_base的指针,因为vector_base(也意味着device_vector和host_vector)是一个模板类,其中template具有两个参数-模板包含的类型和分配器它用。两种 vector 都使用不同的分配器,这又意味着两个不同的指针。

有什么方法可以定义ptr,以便可以像在示例中一样使用它吗?

最佳答案

最后,我结合了@Michael Haidl和@Robert Crovella的建议(以及代理@talonmies的建议),创建了一个类(称为“UnifiedVector”),该类基于非类型参数枚举(ComputeMethod: :GPU,ComputeMethod::CPU)。

在一个专门化中,UnifiedVector继承host_vector,而在另一个device_vector中。然后,我使用相同的枚举对使用UnifiedVector的类进行模板化,因此可以像这样使用它:

template<ComputeMethod C>
class SomeClass
{
  private:
      UnifiedVector<something,C> data;
}

不知道这种方法有多优雅或“正确”,但是我想它就足够了,因为它达到了使 vector “透明”到类使用的目的(因为不必显式地对待一种) vector 以不同的方式显示,或为两种不同的可能的 vector 类型保留两个指针)。

关于c++ - C++ CUDA推力 vector 多态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27567804/

10-09 15:39