C++ CUDA 推力矢量多态性

C++ CUDA Thrust vector polymorphism

本文关键字:多态性 CUDA C++      更新时间:2023-10-16

在我现在正在编写的程序中,我想使用 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(是一个模板类,其中模板有两个参数 - 它包含的类型和它使用的分配器。这两种向量都使用不同的分配器,这反过来意味着两个不同的指针。

有什么方法可以定义 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;
}

不确定这种方法有多优雅或"正确",但我想这就足够了,因为它实现了使向量对使用它的类"透明"的目标(因为它不必以不同的方式明确处理一种向量或为两种不同的可能向量类型保留两个指针(。