2017-02-09 17 views
2

Это своего рода общий вопрос, связанный с конкретной реализацией, которую я имею в виду, о том, можно ли использовать подпрограммы python, предназначенные для использования внутри GIL в среде общей памяти. В частности, я хотел бы использовать scipy.optimize.curve_fit на большом массиве внутри функции cython.Использование scipy подпрограмм вне GIL

Данные могут быть выражены в виде массива 2d numpy (скажем, поплавков) с осью, которая должна соответствовать друг другу, а другая - сериализованной осью, которая должна быть распараллелена. Тогда я просто хотел бы выпустить GIL и начать цикл с данными с cython.parallel.prange (идея в том, что я могу иметь все мои ядра, работающие на установку сразу).

Основная проблема, которую я могу предвидеть, заключается в том, что curve_fit не работает «на месте»; он возвращает значения соответствия параметров (и, возможно, их ковариационную матрицу) и поэтому должен выделять эту память в какой-то момент. (Конечно, я также не имею ни малейшего представления о промежуточном распределении памяти, которое выполняет подпрограмма.) Я беспокоюсь о том, как это будет действовать за пределами GIL, при этом многие потоки будут работать одновременно.

Я понимаю, что ответ может быть просто «он должен отлично работать, попробуйте», но я надеюсь получить некоторое представление о том, что нужно искать. Я также понимаю, что этот вопрос аналогичен другим вопросам о параллелизации подпрограмм scipy/numpy, но я думаю, что этот текст сформулирован по-другому в том, что относится к области cython среды C для python.

Спасибо за любую помощь/предложения.

+2

Некоторых скомпилирован '' numpy' и scipy' кода имеет кодовые блоки, отмеченные 'не gil' макроса. Я бы предложил изучить код 'curve_fit'. Это может быть сочетание питона и скомпилированного кода, возможно, даже вызов внешней библиотеки. – hpaulj

+0

Чтобы добавить к комментарию @ hpaulj: если scipy-код вообще выпустит GIL, вы получите некоторую выгоду от параллельного цикла без необходимости выпускать GIL самостоятельно. _However_, если он возвращает объекты Python, будьте осторожны, так как получается, что Cython не делает их поточно-локальными. – DavidW

+0

Еще один комментарий: 'curve_fit' скорее всего потратит большую часть своего времени на вызов функции, предоставляемой пользователем (что потребует GIL), поэтому выгоды, вероятно, будут небольшими – DavidW

ответ

3

Небезопасно. Если CPython мог безопасно запускать такой код без GIL, у нас не было бы GIL в первую очередь.

2

Вы можете найти следующее сообщение, которое представляет интерес, на странице Parallel Programming in SciPy.

[Я бы отправил это, как только комментарий, но мне не хватает необходимую репутацию.]