Pycuda 2019.1,如何正确复制gpuarray?

时间:2019-06-19 15:24:37

标签: python numpy gpu pycuda

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的问题似乎表明步幅可以固定,但是我不知道这是否意味着其下的实际数据(原始设备内存)是否已正确配置。

1 个答案:

答案 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完全相等。这种方法可能会带来其他后果,因为我不确定为什么确切的诱导剂还没有这样做,但是我还没有看到对预期行为的任何负面影响。