У меня есть проблема, которая при упрощении:
- имеет цикл, который отбирает новые точки
- оценивает их с помощью сложной/медленной функции
- принимает их, если значение превышает постоянно увеличивающийся порог.
Вот пример кода для иллюстрации:
from numpy.random import uniform
from time import sleep
def userfunction(x):
# do something complicated
# but computation always takes takes roughly the same time
sleep(1) # comment this out if too slow
xnew = uniform() # in reality, a non-trivial function of x
y = -0.5 * xnew**2
return xnew, y
x0, cur = userfunction([])
x = [x0] # a sequence of points
while cur < -2e-16:
# this should be parallelised
# search for a new point higher than a threshold
x1, next = userfunction(x)
if next <= cur:
# throw away (this branch is taken 99% of the time)
pass
else:
cur = next
print cur
x.append(x1) # note that userfunction depends on x
print x
Я хочу распараллелить это (например, в кластере), но проблема в том, что мне нужно остановить других рабочих, когда будет найдена успешная точка, или, по крайней мере, сообщить им о новом x (если им удастся превысить новый порог с более старым x, результат все еще приемлем). Пока ни одна точка не увенчалась успехом, мне нужно, чтобы рабочие повторили.
Я ищу инструменты/фреймворки, которые могут решать проблемы такого типа на любом научном языке программирования (C, C++, Python, Julia и т. д., пожалуйста, не на Fortran).
Можно ли это решить с помощью MPI полуэлегантно? Я не понимаю, как я могу информировать/прерывать/обновлять воркеров с помощью MPI.
Обновление: добавлены комментарии к коду, чтобы сказать, что большинство попыток неуспешны и не влияют на переменную, от которой зависит пользовательская функция.
N*N
связи. Рабочий информирует основной поток о наилучшем найденном значении. Основной поток сообщает об этом событии и значении всем остальным рабочим процессам. Другие рабочие время от времени проверяют это событие, и в зависимости от того, есть ли у них лучшее значение, они либо сообщают об этом основному потоку, либо завершают работу. - person Serge Rogatch   schedule 01.09.2017