Pycuda有一个长期存在的错误,在复制时它似乎没有保留顺序或大步前进,即:
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中复制?
类似this的问题似乎表明步幅可以固定,但是我不知道这是否意味着其下的实际数据(原始设备内存)是否已正确配置。
答案 0 :(得分:0)
目前,这是我想出的解决方案(我仍然愿意接受更好的答案)。
我至少确定在复制过程中其下方的内存完全相同。我所做的一件事是尝试保留跨步和标志,无论出于何种原因都不会被复制。
这是我编写的用于处理此问题的函数:
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完全相等。这种方法可能会带来其他后果,因为我不确定为什么确切的诱导剂还没有这样做,但是我还没有看到对预期行为的任何负面影响。