Существует ли какая-нибудь эквивалентная библиотека thrust ::device_vector для использования в ядре CUDA?

#c #vector #cuda #device #thrust

#c #вектор #cuda #устройство #thrust

Вопрос:

Автоматическое управление памятью thrust::device_vector действительно полезно, единственным недостатком является то, что его невозможно использовать из кода ядра.

Я посмотрел в Интернете и только что нашел векторные библиотеки, такие как thrust, которые обрабатывают память устройства из кода хоста. Существует ли какая-либо векторная библиотека для ядер? Если нет, то плохая ли идея иметь такую библиотеку?

Ответ №1:

Написать такую библиотеку возможно, но это было бы очень неэффективно.

Действительно, thrust::device_vector отличается от thrust::host_vector или std::vector только тем, что он выделяет память на устройстве вместо хоста. Алгоритм изменения размера тот же и выполняется на хосте.

Логика изменения размера довольно проста, но включает выделение / освобождение памяти и копирование данных. В многопоточной настройке вам приходится блокировать весь вектор каждый раз, когда поток изменяет его размер, что может быть довольно длинным из-за копирования.

В случае ядра, которое добавляет элементы к вектору, механизм синхронизации фактически сериализует работу, поскольку одновременно разрешается изменять размер только одного потока. Таким образом, ваш код будет выполняться со скоростью процессора одного устройства, за вычетом (довольно больших) затрат на синхронизацию. Вероятно, это было бы намного медленнее, чем реализация на процессоре.

Ответ №2:

Thrust нельзя использовать в ядре, однако thrust::device_vector можно использовать вплоть до интерфейса с ядром. В этот момент в ядро может быть передан указатель на базовые данные. Например:

 thrust::device_vector<int> my_int_vector;

my_kernel<<<blocks, threads>>>(thrust::raw_pointer_cast(my_int_vector.data());
  

В зависимости от вашей ситуации это все еще может означать, что библиотека Thrust полезна даже при реализации ваших собственных ядер.