создание обычных ядер CUDA для типов векторов тяги

#cuda #thrust

#cuda #тяга

Вопрос:

у меня простой вопрос, если, например, я хотел бы использовать ядро cuda, которое я написал для вектора тяги, должен ли я преобразовать свой device_vector в обычный тип указателя? или есть другой способ?

о, и еще одна вещь, касающаяся конструкции device_vector , если у меня есть указатель, выделенный на графическом процессоре, есть ли быстрый device_vector, который принимает этот указатель, или я должен сначала передать все в CPU и только затем объявить мой device_vector с соответствующими аргументами (переменные, выделенные CPU)?

Спасибо, Игал!

Ответ №1:

я хотел бы использовать ядро cuda, которое я написал для вектора тяги, должен ли я преобразовать свой device_vector в обычный тип указателя?

У вас есть 2 варианта:

  1. Вы можете использовать функторы и общие алгоритмы. Подробности в руководстве (стр. 18-22). Я также могу посоветовать присмотреться к zip_iterator ‘s
  2. Если у вас есть нестандартный алгоритм или у вас уже есть ядро, тогда будет проще преобразовать вектор в raw_pointer (руководство, стр. 11)

если у меня есть указатель, выделенный на графическом процессоре, есть ли быстрый device_vector, который принимает этот указатель

Чтобы использовать стандартные алгоритмы, вы можете перенести указатель на класс device_ptr. Затем вы можете использовать объект, такой же, как device_vector.

 int N = 10;
// raw pointer to device memory
int * raw_ptr;
cudaMalloc((void **) amp;raw_ptr, N * sizeof(int));
// wrap raw pointer with a device_ptr
thrust::device_ptr<int> dev_ptr(raw_ptr); // use device_ptr in thrust algorithms
thrust::fill(dev_ptr, dev_ptr   N, (int) 0); // access device memory through device_ptr
dev_ptr[0] = 1;
// free memory
cudaFree(raw_ptr);
  

Код из руководства, стр. 12.