Обратите внимание, что я не использовал здесь никакого параллелизма;
Да, ядро работает параллельно - планируется запустить len(x)
рабочих элементов в первом измерении. Как только вы измените его на обработку, используя 1 рабочий элемент, все в порядке:
nested_sum_succeeds(
queue,
(1,),
None,
L,
X_dev.data,
Y_succeeds_dev.data,
)
nested_sum_fails(
queue,
(1,),
None,
L,
X_dev.data,
Y_fails_dev.data,
)
Затем np.allclose(Y_succeeds_dev.get(), Y_fails_dev.get())
вернет True. Вы также можете удалить обнуление Y[k] = 0;
из ядра nested_sum_succeeds
, так как оно не нужно.
Также, если вы хотите запустить это ядро на других устройствах, вам понадобятся некоторые незначительные исправления, потому что не все компиляторы собираются принять, что тип первого аргумента ядра находится в ядре int
и в python указан как np.int64
, что должно соответствовать тому, что находится в ядре, так:
nested_sum_succeeds.set_scalar_arg_dtypes([
np.int32,
None,
None,
])
nested_sum_fails.set_scalar_arg_dtypes([
np.int32,
None,
None,
])
И Еще одна вещь, которая относится к использованию на других устройствах, я бы удалил __read_only
квалификатор доступа, который также не будет компилироваться на всех устройствах.