Ядро 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-устройства.