Привет Это довольно специфический вопрос, поэтому я надеюсь, что 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