Я хочу распараллелить алгоритм Монте-Карло, используя jit
в python. К сожалению, обычный @jit(nopython=True,parallel=True)
не работает, потому что он говорит, что их нечего распараллеливать.
Функция Монте-Карло уже работает с @jit(nopython=True)
и называется metro3DHeiKit(config,steps,J,K,temperature)
и представляет собой алгоритм Метрополиса-Гастингса, который принимает конфигурацию векторов и минимизирует энергию, соответствующую двум значениям J и K.
С помощью следующей функции я генерирую N копий одной и той же случайной конфигурации и хочу, чтобы для каждой температуры он вычислял конфигурацию Монте-Карло параллельно.
import random
import numpy as np
from numba import jit, njit, prange
@jit(nopython=True)
def tampering(conf,Temp,steps,psteps,J,K):
n = len(conf)
nt = len(Temp)
conf_copy = []
for i in range(nt):
conf_copy.append(np.copy(conf))
for p in range(psteps):
deltaE = 0
for i in range(nt):
conf_copy[i] = np.copy(metro3DHeiKit(conf_copy[i],steps,J,K,Temp[i]))
return(conf_copy)
Существенная часть, которую необходимо распараллелить, это:
for p in range(psteps):
deltaE = 0
for i in range(nt):
conf_copy[i] = np.copy(metro3DHeiKit(conf_copy[i],steps,J,K,Temp[i]))
Если необходимо, я могу предоставить также функцию Монте-Карло, но затем я нужно добавить еще пару функций, которые не имеют ничего общего с проблемой.