Как использовать mpi4py для итерации списка объектов, размер которых больше, чем количество процессоров

Я пытаюсь распараллелить 4 000 000 вычислений на 32 узлах (по 16 ядер в каждом). Возможно ли, что я закончу эти вычисления за одно задание, используя модуль mpi4py в Python, если позволяет ограничение времени?

Например, если один процессор закончит вычисление, он перейдет к следующему незавершенному вычислению (у меня уже есть небольшая функция для определения того, выполнено это вычисление или нет).

Спасибо за помощь!


person Skywrath    schedule 10.08.2017    source источник
comment
Привет ! Вы ищете пример master/slave в Python/mpi4py? См., например, gist.github.com/mgmarino/2773137.   -  person francis    schedule 11.08.2017


Ответы (1)


Вот мое собственное решение:

    from mpi4py import MPI
    def scatter_jobs():
        comm = MPI.COMM_WORLD
        rank = comm.Get_rank()
        size = comm.Get_size()
        data = [i for i in range(4000000)]
        for i in range(rank,len(data),size):
            # Do something with data[i]
person Skywrath    schedule 12.08.2017
comment
если время Do something не зависит от индекса i, то это будет работать нормально. в противном случае у вас может быть некоторый дисбаланс (например, некоторые задачи завершатся раньше, чем другие), и общая эффективность параллельного выполнения упадет. если вы находитесь в последнем случае, вы бы предпочли архитектуру ведущий/подчиненный, как описано в предыдущем комментарии. - person Gilles Gouaillardet; 13.08.2017
comment
@GillesGouaillardet Я новичок в параллельных вычислениях и не думал об этом ... В моем случае каждый процессор повторяет свой собственный, но один и тот же список, и да, он использует индекс i. Снизит ли это параллельную эффективность? Я думал процессоры независимы друг от друга. - person Skywrath; 14.08.2017
comment
Если я правильно понимаю ваше решение, каждая задача MPI обрабатывает примерно одинаковое количество итераций. Таким образом, если все итерации занимают одинаковое количество времени независимо от индекса i, то все задачи MPI будут выполняться примерно одновременно, и это идеально с точки зрения параллельной эффективности. Если нет, то некоторые задачи будут занимать больше времени, чем другие, и затраченное время будет примерно равно времени самой медленной задачи MPI (например, другие задачи будут просто ждать самой медленной задачи), и это будет плохо для параллельной эффективности. - person Gilles Gouaillardet; 14.08.2017
comment
@GillesGouaillardet Да, между этими итерациями нет существенной разницы во времени, так что пока я в безопасности :) Но спасибо за объяснение, мне нужно изучить архитектуру ведущий / подчиненный. - person Skywrath; 14.08.2017