python - 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 中复制的?
像这样的问题似乎表明可以修复跨步,但我不知道这是否意味着下面的实际数据(原始设备内存)实际上配置正确。
解决方案
目前,这是我提出的解决方案(我仍然愿意接受更好的答案)。
我至少确定了复制期间下面的内存是完全相同的。我所做的一件事是尝试保留步幅和标志,无论出于何种原因,它们都不会被复制。
这是我编写的处理此问题的函数:
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 完全相等。这种方法可能会产生其他后果,因为我不确定为什么诱导剂还没有这样做,但我还没有看到对预期行为的任何负面影响。
推荐阅读
- hyperledger-fabric - 多个对等节点,但只有一个开发对等节点
- r - R 取数据集中重复行的平均值,当其中一些列文本时
- javascript - 部分视图中的按钮在首次加载时将页面作为底部
- python - 如何将文件从 Mayan EDMS 发送到外部 api?
- excel - 将 Excel 范围复制到嵌入的 Word 文档跳过“”(空单元格)
- php - 如何在更新主题时添加 functions.php 功能并保留它?
- javascript - 有没有办法阻止 Web Audio API decodeAudioData 方法内存泄漏?
- swift - 嵌套或 ObserveSingleEvent 时,Swift 子级返回 Null,未嵌套时返回正常
- python - 向量化 2 参数 .loc 更新的最快方法是什么?
- xamarin.forms - Xamarin 表单删除 Web 缓存/Javascript 存储