Суммирование значений в массиве 1d NumPy внутри ядра, скомпилированного cuda, приводит к ошибке, но разве c говорит, что он поддерживается? - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь суммировать значения массива внутри CUDA-компилируемой функции Numba.

У меня есть простой тестовый код, например:

import numpy as np
from numba import cuda

values = np.zeros(100, dtype=np.float64)
values.fill(1)


@cuda.jit
def try_to_sum(arr):
    print(arr.sum())


d_values = cuda.to_device(values)
cuda.synchronize()

try_to_sum[1, 1](d_values)

The do c говорит, что это поддерживаемая функция:

Но она не работает с:

Failed in nopython mode pipeline (step: nopython frontend)
Use of unsupported NumPy function 'numpy.nditer' or unsupported use of the function.

File "../../anaconda3/envs/GpuVM/lib/python3.8/site-packages/numba/np/arraymath.py", line 167:
    def array_sum_impl(arr):
        <source elided>
        c = zero
        for v in np.nditer(arr):
        ^

During: typing of get attribute at /home/stark/anaconda3/envs/GpuVM/lib/python3.8/site-packages/numba/np/arraymath.py (167)

File "../../anaconda3/envs/GpuVM/lib/python3.8/site-packages/numba/np/arraymath.py", line 167:
    def array_sum_impl(arr):
        <source elided>
        c = zero
        for v in np.nditer(arr):
        ^

During: lowering "$8call_method.3 = call $6load_method.2(func=$6load_method.2, args=[], kws=(), vararg=None)" at /home/stark/Work/mmr-evolution-gpu/xtests.py (10)

Я также пробовал использовать np.cumsum(arr), но не получилось:

numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Use of unsupported NumPy function 'numpy.cumsum' or unsupported use of the function.

File "xtests.py", line 10:
def try_to_sum(arr):
    np.cumsum(arr)
    ^

Как я могу сделать простую сумму 1d-массива, содержащего значения float64 внутри ядра CUDA?

Спасибо!

1 Ответ

0 голосов
/ 02 августа 2020

Ааа, я смотрел документацию по процессору ... в разделе CUDA указано, что функции массива не поддерживаются. Так что это не поддерживается. Мне нужно будет сохранить сумму в скалярной переменной вместе с массивом, чтобы sh дела выполнялись быстро.

Я оставлю это здесь на случай, если это поможет кому-то другому.

...