Прандж Нумбы дает неверный результат - PullRequest
1 голос
/ 12 июня 2019

Обновление списка в цикле prange дает неверные результаты при использовании prange по сравнению с диапазоном.

from numba import jit, prange
import numpy as np
@jit(parallel=True)
def prange_test(A):
    s = [0,0,0,0]
    b = 0.
    for i in prange(A.shape[0]):
        s[i%4] += A[i]
        b += A[i]
    return s,b

def range_test(A):
    s = [0,0,0,0]
    b = 0.
    for i in range(A.shape[0]):
        s[i%4] += A[i]
        b += A[i]
    return s,b

A = np.random.random(100000)

print(prange_test(A))
print(range_test(A))

Сумма b такая же, но частичная сумма в s неверна:

(array([7013.98962611, 6550.90312863, 7232.49698366, 7246.53627734]), 49955.32870429267)
([12444.683249345742, 12432.449908902432, 12596.461028432543, 12481.734517611982], 49955.32870429247)

1 Ответ

1 голос
/ 12 июня 2019

Хотя это немного неясно в документации, вы не можете безопасно накапливаться в массивоподобный объект, когда пишете в одни и те же элементы данных с разных итераций параллельного цикла prange.Этот вопрос github , который я фактически представил ранее в этом году, спрашивает об этой конкретной проблеме.

Тот факт, что этот вопрос был поднят снова, напоминает мне, что я хочу представить PR в документы numba, чтобы прояснить это.

...