Как правильно инициализировать 2D-поверхность в PyCUDA? (pycuda._driver.LogicError)

Я пытаюсь инициализировать 2D-поверхность в PyCUDA и заполнить ее значениями из 2D-массива NumPy. Идея, как я понимаю, такова.

  1. открыть drv.ArrayDescriptor,
  2. создайте drv.Array, используя этот дескриптор,
  3. скопировать данные из массива NumPy с помощью drv.Memcpy2D,
  4. сделать set_array для SurfaceReference.

Но все равно у меня pycuda._driver.LogicError на последнем шаге. Минимальный пример того, что я делаю:

import numpy as np
import pycuda.driver as drv
import pycuda.autoinit
from pycuda.compiler import SourceModule

mod = SourceModule("surface<void, cudaSurfaceType2D> fld_srf;")

def numpy2d_to_array(np_array):
    h, w = np_array.shape
    descr = drv.ArrayDescriptor()
    descr.width = w
    descr.height = h
    descr.format = drv.dtype_to_array_format(np_array.dtype)
    descr.num_channels = 1
    descr.flags = 0
    device_array = drv.Array(descr)
    copy = drv.Memcpy2D()
    copy.set_src_host(np_array)
    copy.set_dst_array(device_array)
    copy.width_in_bytes = copy.src_pitch = np_array.strides[0]
    copy.src_height = copy.height = h
    copy(aligned=True)
    return device_array

fld = np.random.random_integers(-30, 30, (1920, 1080)).astype(np.int32)
srf = mod.get_surfref('fld_srf')
srf_arr = numpy2d_to_array(fld.copy())
srf.set_array(srf_arr)

Приведенный выше код выдает следующее исключение:

Traceback (most recent call last):
  File "./testsurface.py", line 30, in <module>
    srf.set_array(srf_arr)
pycuda._driver.LogicError: cuSurfRefSetArray failed: invalid value

Есть идеи, как это сделать правильно? Или хотя бы почему появляется эта ошибка?


person a5kin    schedule 25.03.2015    source источник


Ответы (1)


Это может быть как-то связано с флагами: в случае с 3D вы должны установить descr.flags = drv.array3d_flags.SURFACE_LDST, чтобы разрешить привязку к поверхности в соответствии с это.

Однако я не нахожу 2D-эквивалента для pycuda.

person Wannes Goethals    schedule 12.10.2017