2014-12-19 2 views
2

В программе, которую я пишу прямо сейчас, я хочу использовать либо GPU, либо CPU для вычисления (для сравнения одного с другим). Для того, чтобы сделать это, я хотел бы иметь какой-то универсальный указатель, который я мог бы инициализировать с экземпляром device_vector или host_vector, как это:C++ CUDA Полиморфизм вектора тяги

ptr = new host_vector<float>(); 

или

ptr = new device_vector<float>(); 

Оба host_vector и device_vector наследоваться от деталей :: vector_base но я не могу использовать указатель detail :: vector_base, потому что vector_base (что означает device_vector и host_vector тоже) является классом шаблона, где шаблон имеет два аргумента - тип, который он содержит, и используемый им распределитель. Оба типа векторов используют разные распределители, что, в свою очередь, означает два разных указателя.

Есть ли способ определить ptr, чтобы я мог использовать его, как в моих примерах?

+5

Не можете ли вы создать шаблонный код и просто создать отдельные экземпляры для host_vector и device_vector? Почему нужны указатели? – talonmies

+0

Ответ здесь, скорее всего, будет делать то же самое, что и Thrust, т. Е. Использовать полиморфизм времени компиляции. – IdeaHat

+0

@talonmies Две причины: 1) Я хочу вернуться к коду CPU, если у GPU нет требуемой функциональности 2) Я хотел бы дать пользователю выбор вычислительного устройства из GUI – user2521472

ответ

1

Я закончил тем, что объединил предложения @Michael Haidl и @Robert Crovella's (и proxy @talonmies) для создания класса (называемого «UnifiedVector»), который имеет две специализации, основанные на параметре non-type enum (ComputeMethod :: GPU, ComputeMethod :: CPU).

В одной специализации UnifiedVector наследует host_vector и в другом device_vector. Тогда я шаблон классы, которые используют UnifiedVector с использованием того же перечисления, так что я могу использовать его так:

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

Не знаю, как элегантные или «правильный» такой подход, но я предполагаю, что это будет достаточно, так как он добивается своим цель сделать вектор «прозрачным» для класса, который использует его (так как в нем нет необходимости явно обращаться с одним видом вектора по-другому или иметь два указателя для двух разных возможных типов векторов).

Смежные вопросы