mpi4py с процессами и потоками - PullRequest
1 голос
/ 08 апреля 2011

Привет Это довольно специфический вопрос, поэтому я надеюсь, что StackOverflow предназначен для всех языков программирования, а не только для javascript / html

Я пишу мультипрограмму в MPICH2 (популярный интерфейс передачи сообщений).Моя программа написана на Python, поэтому я использую привязки MPI4Py Python.MPI лучше всего подходит для ситуаций, когда нет общей памяти, поэтому он не идеален для многоядерного программирования.Чтобы использовать все 4 ядра моего кластера из 5 узлов, я использую потоки.Однако я заметил, что использование потоков на самом деле замедляет моё моделирование.Моя программа состоит из нескольких десятков тысяч строк кода, поэтому я не могу все это описать, но вот фрагмент кода, который вызывает проблемы

from threading import Thread
...
threadIndeces=[[0,10],[11,20],[21,30],[31,40]] #subset for each thread
for indeces in treadIndeces:
  t=Thread(target=foo,args=(indeces,))
  t.start()

Кроме того, я обязательно присоединюсь к темам позже.Если я запускаю его без потоков и просто вызываю foo со всеми индексами, это примерно в 10-15 раз быстрее.Когда я записываю время многопоточной версии, создание потоков в вызове t=Thread(target=foo,args=(indeces,)) занимает около 0,05 секунды, соединение аналогично занимает 0,05 секунды, но вызовы t.start() занимают колоссальные 0,2 секунды.

start() дорогой звонок?Должен ли я изменить свой подход?Я думал о сохранении пула потоков, а не о создании новых на каждой итерации, но не похоже, что t=Thread(target=foo,args=(indeces,)) является причиной замедления.

Кроме того, если кто-то хочет знать всю сложностьfoo, вот одна из функций, которая вызывается i раз для indeces каждой итерации (недискретное время):

def HD_training_firing_rate(HD_cell):
    """During training, the firing rate is governed by the difference between the 
       current heading direction and the preferred heading direction. This is made
       to resemble a Gaussian distribution
    """
    global fabs
    global exp
    global direction

    #loop over twice due to concurrent CW and CCW HD training
    for c in [0,1]:
        d=direction[c]
        dp=HD_cell.dp  #directional preferance
        s_d=20.0  #standard deviation
        s_i=min(fabs(dp-d),360-fabs(dp-d)) #circular deviation from preferred dir.

        HD_cell.r[c]=exp(-s_i*s_i/(2*s_d*s_d))  #normal distribution

1 Ответ

4 голосов
/ 08 апреля 2011

Если вам нужны потоки, python может оказаться не лучшим вариантом из-за Global Interpreter Lock , которая предотвращает истинный параллелизм. См. Также тревожный разговор Дейва Бизли .

Возможно, вам лучше всего запустить 20 процессов, чтобы ваши 4 ядра и 5 узлов были заняты, и просто использовать MPI для всех коммуникаций.

Python влечет за собой большие накладные расходы - вы, возможно, захотите подумать о C или C ++ (или осмелитесь ли я сказать Fortran?), Если вы действительно привержены совместному подходу потоков / передачи сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...