在 GIL 之外使用 scipy 例程
Using scipy routines outside of the GIL
这是一个与我想到的特定实现相关的一般性问题,关于在共享内存环境中使用 python 设计用于 GIL 内部的例程是否安全。具体来说,我想做的是在 cython
函数内的大数组上使用 scipy.optimize.curve_fit
。
数据可以表示为一个 2d numpy
数组(例如,浮点数),其中一个轴是适合的,另一个是要并行化的序列化轴。然后我只想释放 GIL 并开始使用 cython.parallel.prange
循环遍历数据(当时的想法是我可以让我所有的核心同时进行拟合)。
我能预见的主要问题是curve_fit
不运行"in place";它 returns 参数的拟合值(以及可选的协方差矩阵),因此必须在某个时候分配该内存。 (当然,我也不知道例程执行的任何中间内存分配。)我担心这将如何在 GIL 之外运行,同时有许多线程同时工作。
我知道答案可能只是 "it should work fine go try it,",但我希望了解需要注意的事项。我也意识到这个问题与其他关于并行化 scipy
/numpy
例程的问题相似,但我认为这个问题的措辞不同,因为它属于 cython
C 环境的范围 python.
感谢任何help/suggestions。
不安全。如果 CPython 可以在没有 GIL 的情况下安全地 运行 那种代码,那么我们首先就不会拥有 GIL。
您可能会对 Parallel Programming in SciPy 上的以下讨论感兴趣。
[我本可以将其仅作为评论发布,但我缺乏必要的声誉。]
这是一个与我想到的特定实现相关的一般性问题,关于在共享内存环境中使用 python 设计用于 GIL 内部的例程是否安全。具体来说,我想做的是在 cython
函数内的大数组上使用 scipy.optimize.curve_fit
。
数据可以表示为一个 2d numpy
数组(例如,浮点数),其中一个轴是适合的,另一个是要并行化的序列化轴。然后我只想释放 GIL 并开始使用 cython.parallel.prange
循环遍历数据(当时的想法是我可以让我所有的核心同时进行拟合)。
我能预见的主要问题是curve_fit
不运行"in place";它 returns 参数的拟合值(以及可选的协方差矩阵),因此必须在某个时候分配该内存。 (当然,我也不知道例程执行的任何中间内存分配。)我担心这将如何在 GIL 之外运行,同时有许多线程同时工作。
我知道答案可能只是 "it should work fine go try it,",但我希望了解需要注意的事项。我也意识到这个问题与其他关于并行化 scipy
/numpy
例程的问题相似,但我认为这个问题的措辞不同,因为它属于 cython
C 环境的范围 python.
感谢任何help/suggestions。
不安全。如果 CPython 可以在没有 GIL 的情况下安全地 运行 那种代码,那么我们首先就不会拥有 GIL。
您可能会对 Parallel Programming in SciPy 上的以下讨论感兴趣。
[我本可以将其仅作为评论发布,但我缺乏必要的声誉。]