Pycuda 2019.1,如何正确复制gpuarray?

2024-04-19 17:27:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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))

我想知道怎么解释这个?潜在的记忆实际上是一样的吗?我怎样才能确保我的拷贝真的,好吧,用皮库达拷贝?你知道吗

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


Tags: importpycudanumpygpuasnporder秩序
1条回答
网友
1楼 · 发布于 2024-04-19 17:27:52

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

我至少已经确定了在复制过程中下面的内存是完全相同的。我所做的一件事是尽量保留步幅和旗帜,不管出于什么原因,它们都不会被复制过来。你知道吗

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

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

相关问题 更多 >