Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.
Пример:
string value = null;
if (value.Length == 0) // <-- Causes exception
{
Console.WriteLine(value); // <-- Never reached
}
Ошибка исключения:
Необработанное исключение:
System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта. в Program.Main ()
blockquote>
Основная причина заключается в том, что numpy transpose создает только представление, которое не влияет на базовое хранилище массива, и именно это хранилище, которое PyCUDA напрямую обращается, когда копия выполняется в память устройства. Решение заключается в использовании метода copy
при выполнении транспонирования, который создаст массив с данными в транспонированном порядке в памяти хоста, а затем скопирует его на устройство:
data_gpu = gpuarray.to_gpu(data.T.copy())
В numpy data.T
ничего не делает с базовым массивом 1D. Он просто манипулирует шагами для получения транспонирования. Это делает операцию постоянной и постоянной памяти.
Похоже, что pycuda.to_gpu()
не соблюдает шаги и просто копирует базовый 1D-массив. Это даст точное поведение, которое вы наблюдаете.
На мой взгляд, в коде нет ничего плохого. Скорее, я считаю это ошибкой в pycuda
.
Я googled вокруг и нашел поток, который подробно обсуждает эту проблему .
В качестве обходного пути вы можете попробовать передать numpy.ascontiguousarray(data.T)
в gpuarray.to_gpu()
. Это, конечно же, создаст вторую копию данных в оперативной памяти хоста.