Python Pycuda 2019.1,如何正确复制gpuarray?

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

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_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完全相等。这种方法可能会产生其他后果,因为我不知道为什么诱导剂还没有这样做,但我还没有看到任何与预期行为相关的负面影响