Адресация памяти PyCUDA: смещение памяти?

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

Можно ли сделать то же самое в pycuda? то есть

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

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


person Bolster    schedule 19.04.2011    source источник


Ответы (2)


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

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

person talonmies    schedule 19.04.2011

Вряд ли это реализовано в PyCuda.

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

  1. Скопируйте весь массив A в память и создайте пустой массив из интересующего фрагмента.
  2. Создайте ядро, которое считывает матрицу и создает нужный срез.
  3. Переупорядочите произведенные данные таким образом, чтобы вы могли читать фрагмент за раз из арифметики указателя.
person fabrizioM    schedule 19.04.2011
comment
Я все равно выбрал вариант 1, но оставил вопрос открытым на несколько часов, чтобы посмотреть, есть ли у кого-нибудь еще волшебное решение, о котором мы не подумали. - person Bolster; 19.04.2011
comment
Да, я тоже так делаю, даже больше недели. Не все могут читать ТАК каждый день :) - person fabrizioM; 19.04.2011