Ядро PyOpenCL не применяется ко всему массиву

Я хотел получить демонстрацию Elementwise, которая поставляется с PyOpenCL, и решил попробовать это:

from __future__ import absolute_import
from __future__ import print_function
import pyopencl as cl
import pyopencl.array as cl_array
import numpy
from pyopencl.elementwise import ElementwiseKernel

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

n = 6

a_gpu = cl.array.to_device(queue,
numpy.arange(1, n, dtype=int))

update_a = ElementwiseKernel(ctx,
"int *a",
"a[i] = 2*a[i]",
"update_a")

print(a_gpu.get())
update_a(a_gpu)
print(a_gpu.get())

Который я ожидал распечатать

[1 2 3 4 5]
[2 4 6 8 10]

но я вместо этого получаю

[1 2 3 4 5]
[2 4 6 4 5] .

Кроме того, когда я пытаюсь сохранить значение "i" в массиве, чтобы увидеть, что происходит, я получаю некоторые действительно странные значения. Они повсюду, а некоторые даже отрицательны.

Я пытался понять это некоторое время, но не могу. Может кто-нибудь объяснить, почему это происходит? Благодарю.

Информация, связанная с данной: PyOpenCL версия: 2018.2.1, версия Python: 3.6.5, ОС: macOS 10.14.1

1 ответ

Решение

Ваша ошибка заключается в неопределенности при вводе массива numpy, что привело к непоследовательным шагам по элементам массива на стороне ЦП и устройства CL.

Определение dtype=int является неоднозначным, и предполагает 8-байтовый np.int64 или же long элементы. Соответствующий тип на стороне устройства CL должен быть long *a_in за np.int64,

Если вы хотите придерживаться 4-байтовых целых чисел, укажите dtype=np.int32 на стороне процессора и int *a_in на стороне CL-устройства.

Вывод: всегда указывайте свои типы массивов с ясностью, например, dtype=np.int64 , И проверьте на точное соответствие со стороны CL-устройства.

Другие вопросы по тегам