从现有 GPU 指针构造 Cupy 数组
Cupy array construction from existing GPU pointer
我想构建 GPU 上已存在的数组的 Cupy GPU 数组视图,我收到了以下内容:
- 指向数组的指针。
- 我知道数据类型和数据大小。
- 我也得到了推介。
如何构建数组视图(最好避免复制)?我尝试了以下方法:
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 分配
- 我们初始化一个空的
cp.empty
- 我们使用
cupy.cuda.runtime.memcpy2D
将二维分配的数据复制到该数组,在那里我们可以设置间距和宽度。我们使用 MemoryKind kind = 3
,这是设备到设备的复制。
这似乎是创建适当 cp.ndarray
而无需转移到主机的最佳方式。
我想构建 GPU 上已存在的数组的 Cupy GPU 数组视图,我收到了以下内容:
- 指向数组的指针。
- 我知道数据类型和数据大小。
- 我也得到了推介。
如何构建数组视图(最好避免复制)?我尝试了以下方法:
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
- 我们初始化一个空的
cp.empty
- 我们使用
cupy.cuda.runtime.memcpy2D
将二维分配的数据复制到该数组,在那里我们可以设置间距和宽度。我们使用MemoryKind kind = 3
,这是设备到设备的复制。
这似乎是创建适当 cp.ndarray
而无需转移到主机的最佳方式。