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.
Ответы
Ответ 1
Вероятно, вы найдете ответы на все ваши вопросы относительно NumPy и параллельного программирования на официальной вики.
Кроме того, посмотрите эту страницу рецептов - он содержит пример кода о том, как использовать NumPy с несколькими потоками.
Ответ 2
Смущающе параллельна? Numpy? Похоже, хороший кандидат на PyCUDA или PyOpenCL.
Ответ 3
Достаточно некоторые numpy-процедуры выпускают GIL, поэтому они могут быть эффективно параллельны в потоках (info). Возможно, вам не нужно ничего особенного!
Вы можете использовать этот вопрос, чтобы выяснить, являются ли требуемые подпрограммы одними из тех, которые выпускают GIL. Короче, найдите ALLOW_THREADS
или nogil
в источнике.
(Также обратите внимание, что MKL имеет возможность использовать несколько потоков для подпрограммы, чтобы еще один простой способ получить parallelism, хотя, возможно, и не самый быстрый вид).