首页 > 解决方案 > Pycuda 2019.1,如何正确复制一个gpuarray?

问题描述

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 中复制的?

这样的问题似乎表明可以修复跨步,但我不知道这是否意味着下面的实际数据(原始设备内存)实际上配置正确。

标签: pythonnumpygpupycuda

解决方案


目前,这是我提出的解决方案(我仍然愿意接受更好的答案)。

我至少确定了复制期间下面的内存是完全相同的。我所做的一件事是尝试保留步幅和标志,无论出于何种原因,它们都不会被复制。

这是我编写的处理此问题的函数:

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 现在应该使两个 gpuarrays 完全相等。这种方法可能会产生其他后果,因为我不确定为什么诱导剂还没有这样做,但我还没有看到对预期行为的任何负面影响。


推荐阅读