Python: решение нескольких линейных систем с использованием потоков - PullRequest
6 голосов
/ 14 марта 2012

Я пытаюсь решить несколько линейных систем, используя python и scipy, используя потоки.Я абсолютный новичок в том, что касается потоков Python.Я приложил код, который очищает то, что я пытаюсь достичь.Этот код работает, но время выполнения фактически увеличивается при увеличении totalThreads.Я предполагаю, что spsolve рассматривается как критический раздел и фактически не запускается одновременно.

У меня следующие вопросы:

  • Является ли spsolve поточно-ориентированным?
  • Если spsolve блокирует, есть ли способ обойти это?
  • Есть ли другой пакет линейных решателей, который я могу использовать, который лучше распараллеливает?
  • Есть ли лучший способ написать этот сегмент кода, который увеличит производительность?

Я искал ответы в Интернете, но безуспешно.Возможно, я просто использую неправильные ключевые слова.Спасибо всем за помощь.

    def Worker(threadnum, totalThreads):
        for i in range(threadnum,N,totalThreads):
           x[:,i] = sparse.linalg.spsolve( A,  b[:,i] )

    threads = []
    for threadnum in range(totalThreads):
        t = threading.Thread(target=Worker, args=(threadnum, totalThreads))
        threads.append(t)
        t.start()

    for threadnum in range(totalThreads): threads[threadnum].join()

1 Ответ

3 голосов
/ 14 марта 2012

Первое, что вы должны понять, это то, что, как ни странно, поточный модуль Python не позволит вам использовать преимущества нескольких ядер.Это связано с тем, что называется Global Interpreter Lock (GIL), который является важной частью стандартной реализации cPython.Для получения дополнительной информации см. Здесь: Что такое глобальная блокировка интерпретатора (GIL)?

Вам следует рассмотреть возможность использования вместо этого модуля многопроцессорной обработки, который обходит GIL путем ускорения нескольких независимых процессов Python.С этим немного сложнее работать, потому что разные процессы имеют разные пространства памяти, поэтому вы не можете просто разделить потокобезопасный объект между всеми процессами и ожидать, что объект будет синхронизирован между всеми процессами.Вот отличное введение в многопроцессорность: http://www.doughellmann.com/PyMOTW/multiprocessing/

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