Как я могу запустить параллель Монте-Карло, используя jit в Python? - PullRequest
0 голосов
/ 27 мая 2020

Я хочу распараллелить алгоритм Монте-Карло, используя 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]))

Если необходимо, я могу предоставить также функцию Монте-Карло, но затем я нужно добавить еще пару функций, которые не имеют ничего общего с проблемой.

...