Подтвердить что ты не робот

Numpy и Global Interpreter Lock

Я собираюсь написать некоторый вычислительно-интенсивный код Python, который почти наверняка проведет большую часть своего времени внутри функций линейной алгебры numpy.

Проблема под рукой неловко параллельна. Короче говоря, самым простым способом для меня воспользоваться этим было бы использование нескольких потоков. Главным барьером почти наверняка станет Глобальная блокировка переводчика (GIL).

Чтобы помочь в разработке этого, было бы полезно иметь ментальную модель, для которой можно ожидать, что операции numpy будут выпускать GIL для их продолжительности. С этой целью я был бы признателен за любые эмпирические правила, dos и don'ts, указатели и т.д.

В случае, если это имеет значение, я использую 64-разрядный Python 2.7.1 для Linux, numpy 1.5.1 и scipy 0.9.0rc2, построенный с использованием Intel MKL 10.3.1.

4b9b3361

Ответ 1

Вероятно, вы найдете ответы на все ваши вопросы относительно NumPy и параллельного программирования на официальной вики.

Кроме того, посмотрите эту страницу рецептов - он содержит пример кода о том, как использовать NumPy с несколькими потоками.

Ответ 2

Смущающе параллельна? Numpy? Похоже, хороший кандидат на PyCUDA или PyOpenCL.

Ответ 3

Достаточно некоторые numpy-процедуры выпускают GIL, поэтому они могут быть эффективно параллельны в потоках (info). Возможно, вам не нужно ничего особенного!

Вы можете использовать этот вопрос, чтобы выяснить, являются ли требуемые подпрограммы одними из тех, которые выпускают GIL. Короче, найдите ALLOW_THREADS или nogil в источнике.

(Также обратите внимание, что MKL имеет возможность использовать несколько потоков для подпрограммы, чтобы еще один простой способ получить parallelism, хотя, возможно, и не самый быстрый вид).