如何在PyCUDA中正确初始化2D曲面? (pycuda._driver.LogicError)

时间:2015-03-25 01:14:48

标签: python numpy cuda pycuda

我试图在PyCUDA中初始化2D表面并用NumPy 2D数组中的值填充它。我认为这个想法是

  1. 打开drv.ArrayDescriptor
  2. 使用此描述符
  3. 创建drv.Array
  4. 使用drv.Memcpy2D
  5. 复制NumPy数组中的数据
  6. set_array执行SurfaceReference
  7. 但我仍然在最后一步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
    

    任何想法如何正确地做到这一点?或者至少为什么出现这个错误?

1 个答案:

答案 0 :(得分:1)

它可能与标志有关:在3D情况下,你必须设置  descr.flags = drv.array3d_flags.SURFACE_LDST 允许根据表面结合到表面 this

虽然我找不到pycuda的2D等价物。