从现有 GPU 指针构造 Cupy 数组

Cupy array construction from existing GPU pointer

我想构建 GPU 上已存在的数组的 Cupy GPU 数组视图,我收到了以下内容:

  1. 指向数组的指针。
  2. 我知道数据类型和数据大小。
  3. 我也得到了推介。

如何构建数组视图(最好避免复制)?我尝试了以下方法:

import cupy as cp
import numpy as np 

shape = (w, h, c, b) # example
s = np.product(shape)*4 # this is 1D 

mem = cp.cuda.UnownedMemory(ptr=image_batch_ptr,
                            owner=None,
                            size=s)
memptr = cp.cuda.MemoryPointer(mem, 0)
d = cp.ndarray(shape=shape,
               dtype=np.float32,
               memptr=memptr)

但这似乎没有产生正确的对齐方式。具体来说,我在将音高整合到图片中时遇到了问题——这可能吗?

我找到了解决方法。使用 cupy 这确实是可能的,但需要首先将(在设备上)2D 分配移动到 copy.cuda.runtime.memcpy2D

的 1D 分配
  1. 我们初始化一个空的cp.empty
  2. 我们使用cupy.cuda.runtime.memcpy2D将二维分配的数据复制到该数组,在那里我们可以设置间距和宽度。我们使用 MemoryKind kind = 3,这是设备到设备的复制。

这似乎是创建适当 cp.ndarray 而无需转移到主机的最佳方式。