Pycuda 2019.1, как правильно скопировать gpuarray? - PullRequest
1 голос
/ 19 июня 2019

У 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 голосов
/ 21 июня 2019

На данный момент, это решение, которое я придумал (я все еще готов принять лучшие ответы).

Я, по крайней мере, определил, что память под копией точно такая же. Одна вещь, которую я сделал, - это попытка сохранить и шаг, и флаги, которые по какой-либо причине не копируются.

Вот функция, которую я написал, которая обрабатывает это:

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 точно равными. У этого метода могут быть и другие последствия, поскольку я не уверен, почему именно индуктор этого не делает, но я пока не видел каких-либо негативных последствий в отношении ожидаемого поведения.

...