Я пытаюсь инициализировать 2D-поверхность в PyCUDA и заполнить ее значениями из 2D-массива NumPy. Идея, как я понимаю, такова.
- открыть
drv.ArrayDescriptor
, - создайте
drv.Array
, используя этот дескриптор, - скопировать данные из массива NumPy с помощью
drv.Memcpy2D
, - сделать
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
Есть идеи, как это сделать правильно? Или хотя бы почему появляется эта ошибка?