Как заставить потоки пранджа Numba сотрудничать, сохраняя / видя результат в общей переменной? - PullRequest
0 голосов
/ 13 июля 2020

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

from numba import njit, prange
import random


@njit(parallel=True)
def func():
    highest_val = 0
    for i in prange(100):
        for j in range(1000):
            val = random.randint(0, 100000000000)
            if val > highest_val:
                highest_val = val
                print('New highest val: ', highest_val)


func()

Без parallel=True он будет работать и всегда печатать все более и более высокие значения.

Однако, если я переключу parallel до True, то все потоки, запущенные этим вызовом prange, похоже, получают копию начального значения high_val. Все они конкурируют с печатью множества повторяющихся наивысших значений, и значение, установленное одним потоком, не видно другим потокам. найдено предыдущими обсуждениями. Это назначение, похоже, не изменяет переменную highest_val таким образом, чтобы это было видно другим потокам.

Я пытаюсь понять, как это работает.

Я вижу в документы, которые:

Переменные, с которыми работают операторы inplace, являются сокращающими переменными.

Переменные, которые назначены, являются частными для каждого thead

  • Переменная будет принять последовательно последнее значение после l oop. -
  • Это эквивалент предложения OpenMP lastprivate.
  • Переменные, которые только читаются, совместно используются всеми потоками

Как я могу sh это сделать? Я просто не могу этого сделать с помощью prange?

...