#cuda #thrust
#cuda #тяга
Вопрос:
у меня простой вопрос, если, например, я хотел бы использовать ядро cuda, которое я написал для вектора тяги, должен ли я преобразовать свой device_vector в обычный тип указателя? или есть другой способ?
о, и еще одна вещь, касающаяся конструкции device_vector , если у меня есть указатель, выделенный на графическом процессоре, есть ли быстрый device_vector, который принимает этот указатель, или я должен сначала передать все в CPU и только затем объявить мой device_vector с соответствующими аргументами (переменные, выделенные CPU)?
Спасибо, Игал!
Ответ №1:
я хотел бы использовать ядро cuda, которое я написал для вектора тяги, должен ли я преобразовать свой device_vector в обычный тип указателя?
У вас есть 2 варианта:
- Вы можете использовать функторы и общие алгоритмы. Подробности в руководстве (стр. 18-22). Я также могу посоветовать присмотреться к
zip_iterator
‘s - Если у вас есть нестандартный алгоритм или у вас уже есть ядро, тогда будет проще преобразовать вектор в
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.