У меня есть такой тестовый код:
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?