Python Pycuda 2019.1,如何正确复制gpuarray?
Pycuda有一个长期存在的缺陷,在复制ie时,它似乎无法保持秩序或步调:Python Pycuda 2019.1,如何正确复制gpuarray?,python,numpy,gpu,pycuda,Python,Numpy,Gpu,Pycuda,Pycuda有一个长期存在的缺陷,在复制ie时,它似乎无法保持秩序或步调: import numpy as np import pycuda.autoinit from pycuda import gpuarray np_array = np.array([[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]], order="F") gpu_array = gpuarray.to_gpu(np_array) gpu_array_copy = gpu
import numpy as np
import pycuda.autoinit
from pycuda import gpuarray
np_array = np.array([[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]], order="F")
gpu_array = gpuarray.to_gpu(np_array)
gpu_array_copy = gpu_array.copy()
# fails, order isn't the same. ravel also shows difference in order
assert(np.array_equal(gpu_array_copy.get(), np_array))
我想知道怎么解释这个?底层内存实际上是相同的吗?我怎样才能确保我的副本实际上是用pycuda复制的
像这样的问题似乎表明可以修复跨步,但我不知道这是否意味着下面的实际数据(原始设备内存)实际上配置正确 目前,这是我提出的解决方案(我仍然愿意接受更好的答案) 我至少已经确定,在复制过程中,下面的内存是完全相同的。我所做的一件事是试图保留步幅和旗帜,无论出于何种原因,它们都不会被复制 下面是我编写的处理此问题的函数:
def gpuarray_copy(array: gpuarray.GPUArray):
array_copy = array.copy()
array_copy.strides = array.strides
array_copy.flags.f_contiguous = array.flags.f_contiguous
array_copy.flags.c_contiguous = array.flags.c_contiguous
array_copy.flags.forc = array.flags.forc
这至少解决了主机副本不相等的问题,AFAIK现在应该使两个gpuarray完全相等。这种方法可能会产生其他后果,因为我不知道为什么诱导剂还没有这样做,但我还没有看到任何与预期行为相关的负面影响