Запуск параллельных потоков Python, вызывающих внешнюю программу MPI, переданную с использованием PBS - PullRequest
0 голосов
/ 15 ноября 2011

Я довольно плохо знаком с Python и не уверен, что является лучшим способом реализации многопоточного / многопроцессорного кода в распределенном кластере.

Я пытаюсь написать скрипт-обертку, используя Python, который вызываетвнешняя MPI-программа, работающая в большом кластере с использованием системы очередей PBS.(Очень) упрощенная версия типа сценария, над которым я работал, приведена ниже, где код перемещается в определенный каталог, запускает внешнюю программу MPI и проверяет результаты, чтобы увидеть, были ли какие-либо большие изменения.

#!/local/python-2.7.1/bin/python2.7

import os
import subprocess as sp
import coordinate_functions as coord_funcs

os.chdir('/usr/work/cmurray/SeachTest/')
print os.getcwd()

# Gets nodefile and num procs (NP)
cat_np = sp.Popen('cat $PBS_NODEFILE | wc -l', shell = True, stdout=sp.PIPE)
NP = int(cat_np.communicate()[0])
sp.call('cat $PBS_NODEFILE > nodefile', shell = True)

def run_mpi(np, nodefile):
        mpi_cmd = 'mpirun -machinefile %s -np %d mpipg > calc.out' % (nodefile, np)
        sp.call(vasp_cmd, shell = True)


def search_loop(calc_dir, t_total, nodefile, num_procs):

    os.chdir(calc_dir)
    no_events = True
    while no_events or t < t_total:
        run_mpi(mynodefile, NP)
        num_events = coord_funcs.change_test('OUTFILE', 'INFILE', 0.01)
        if num_events > 0:
            event = True
        else:
            t += 1

search_loop('/usr/work/cmurray/SeachTest/calc_1/', 10, mynodefile, NP)

Затем он отправляется в очередь, используя:

qsub -l nodes=4 -N SeachTest ./SearchTest

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

Подойдет ли модуль threading для этой цели или лучше подойдет модуль multiprocessing?Возможно, мне понадобится передать простые сообщения, такие как логическое значение event в приведенном выше примере, между потоками / процессами.

Кроме того, как мне убедиться, что скрипт python не использует процессоры, которые я назначилMPI работает?

1 Ответ

0 голосов
/ 15 ноября 2011

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

Подойдет ли модуль потоков для этой цели или лучше выбрать многопроцессорный модуль? Возможно, мне понадобится передать простые сообщения, такие как событие boolean в приведенном выше примере, между потоками / процессами.

Сначала я бы попробовал использовать многопоточность для программы с интенсивным вводом-выводом, предполагая, что пропускной способности достаточно для параллелизации ввода-вывода.

Кроме того, как мне убедиться, что скрипт python не использует процессоры, которые я назначил для MPI, запускается?

Если вы не используете многопроцессорность, сценарий будет использовать только один процессор из-за Global Interpreter Lock .

...