Адресация памяти PyCUDA: Смещение памяти? - PullRequest
1 голос
/ 19 апреля 2011

У меня есть большой кусок сгенерированных данных (A [i, j, k]) на устройстве, но мне нужен только один «фрагмент» A [i,:,:], а в обычной CUDA может быть легко достигнуто с некоторой арифметикой указателя.

Можно ли сделать то же самое в пикуде? то есть

cuda.memcpy_dtoh(h_iA,d_A+(i*stride))

Очевидно, что это совершенно неверно, поскольку нет информации о размере (если не выводится из формы dest), но, надеюсь, вы поняли идею?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Класс pyCUDA gpuArray поддерживает нарезку одномерных массивов, но не большие измерения, которые требуют шага (хотя он и наступает). Однако вы можете получить доступ к базовому указателю в многомерном gpuArray от члена gpuarray, который является типом pycuda.driver.DeviceAllocation, и информации о размере от члена gpuArray.dtype.itemsize. Затем вы можете выполнить ту же арифметику указателей, которую вы имели в виду, чтобы получить то, что будут принимать функции memcpy драйвера.

Это не очень питонно, но оно работает (или, по крайней мере, так и было, когда я в прошлом году много занимался взломом pyCUDA + MPI).

0 голосов
/ 19 апреля 2011

Маловероятно, что реализовано в PyCuda.

Я могу подумать о следующих решениях:

  1. Скопировать весь массив A в памяти и сделатьnumpy массив из интересующего среза.
  2. Создайте ядро, которое считывает матрицу и создает желаемый срез.
  3. Переставьте произведенные данные таким образом, чтобы вы могли одновременно прочитать срез из указателяарифметика.
...