Скопируйте данные в gpuarray с двумя разными поведениями [duplicate]

Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.

Пример:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

Ошибка исключения:

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в Program.Main ()

4
задан Framester 1 August 2011 в 16:58
поделиться

2 ответа

Основная причина заключается в том, что numpy transpose создает только представление, которое не влияет на базовое хранилище массива, и именно это хранилище, которое PyCUDA напрямую обращается, когда копия выполняется в память устройства. Решение заключается в использовании метода copy при выполнении транспонирования, который создаст массив с данными в транспонированном порядке в памяти хоста, а затем скопирует его на устройство:

data_gpu = gpuarray.to_gpu(data.T.copy())
6
ответ дан talonmies 24 August 2018 в 04:38
поделиться

В numpy data.T ничего не делает с базовым массивом 1D. Он просто манипулирует шагами для получения транспонирования. Это делает операцию постоянной и постоянной памяти.

Похоже, что pycuda.to_gpu() не соблюдает шаги и просто копирует базовый 1D-массив. Это даст точное поведение, которое вы наблюдаете.

На мой взгляд, в коде нет ничего плохого. Скорее, я считаю это ошибкой в ​​pycuda.

Я googled вокруг и нашел поток, который подробно обсуждает эту проблему .

В качестве обходного пути вы можете попробовать передать numpy.ascontiguousarray(data.T) в gpuarray.to_gpu(). Это, конечно же, создаст вторую копию данных в оперативной памяти хоста.

5
ответ дан NPE 24 August 2018 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: