Вставьте device_malloc и device_new

Каковы преимущества использования Thrust device_malloc вместо обычного cudaMalloc и что делает device_new?

Что касается device_malloc, кажется, единственная причина его использования заключается в том, что он немного чище.

В документации device_new говорится:

«device_new реализует оператор размещения new для типов, находящихся в памяти устройства. device_new вызывает нулевой конструктор T для массива объектов в памяти устройства. Эта функция не выделяет память».

Чего я не понимаю...


person SpaceMonkey    schedule 18.04.2013    source источник


Ответы (2)


device_malloc возвращает правильный тип объекта, если вы планируете использовать Thrust для других целей. Обычно нет причин использовать cudaMalloc, если вы используете Thrust. Инкапсуляция вызовов CUDA делает его проще и обычно чище. То же самое касается контейнеров C++ и STL по сравнению с массивами в стиле C и malloc.

Для device_new вы должны прочитать следующую строку документации:

 template<typename T>
 device_ptr<T> thrust::device_new (device_ptr< void > p, const size_t n = 1) 

p: device_ptr для области памяти устройства, в которой можно создать одну или несколько T.

В принципе, эту функцию можно использовать, если память уже выделена. Будет вызван только конструктор по умолчанию, и он вернет device_pointer, приведенный к типу T.

С другой стороны, следующий метод выделяет память и возвращает device_ptr<T>:

template<typename T >
device_ptr<T> thrust::device_new (const size_t n = 1)
person BenC    schedule 18.04.2013
comment
Ура, интересно, почему никто не указал, что я могу использовать тягу device_new, когда я отправил вопрос о копировании объект в память устройства ! Я понимаю, что мне все равно придется копировать поля внутри вручную, но первый шаг (копирование самого объекта) лучше сделать с помощью тяги.. - person SpaceMonkey; 18.04.2013
comment
Ну не все пользуются Thrust. Для простых вещей он вам не нужен, но он делает ваш код более понятным и читабельным для разработчиков, не использующих CUDA. Однако полезно знать, как работать без Thrust, иначе вы можете потеряться, когда начнете отлаживать свой код. - person BenC; 18.04.2013

Итак, я думаю, что нашел одно хорошее применение для device_new

По сути, это лучший способ инициализировать объект и скопировать его на устройство, удерживая указатель на него на хосте.

поэтому вместо того, чтобы делать:

Particle *dev_p;
cudaMalloc((void**)&(dev_p), sizeof(Particle));
cudaMemcpy(dev_p, &p, sizeof(Particle), cudaMemcpyHostToDevice);

test2<<<1,1>>>(dev_p);

Я могу просто сделать:

thrust::device_ptr<Particle> p = thrust::device_new<Particle>(1);
test2<<<1,1>>>(thrust::raw_pointer_cast(p));
person SpaceMonkey    schedule 18.04.2013