Cython 中的并行性不起作用
Parallelism in Cython does not work
我有以下 Cython
代码:
from cython import parallel
from libc.stdio cimport printf
def test_func():
cdef int thread_id = -1
with nogil, parallel.parallel(num_threads=10):
thread_id = parallel.threadid()
printf("Thread ID: %d\n", thread_id)
但是,它总是只启动一个线程,即输出总是只有
Thread ID: 0
获取多线程我做错了什么?
Cython 使用 OpenMP 因为它的多线程功能。
要启用 OpenMP,编译器需要在编译和链接时向其传递一个额外的标志,否则代码的并行部分将被忽略。
一些流行的编译器的标志如下:
- GCC = -fopenmp
- MSVC = /openmp
- icc = -openmp
假设您已将函数保存在文件 test.pyx
中,如果您使用的是 GCC,则以下 setup.py
应该有效。
from distutils.core import setup, Extension
from Cython.Build import cythonize
extensions = [Extension(
"test",
sources=["test.pyx"],
extra_compile_args=["-fopenmp"],
extra_link_args=["-fopenmp"]
)]
setup(
ext_modules = cythonize(extensions)
)
一旦像这样编译,代码应该在 运行:
时生成 10 个线程
In [1]: import test
In [2]: test.test_func()
Thread ID: 9
Thread ID: 1
Thread ID: 6
Thread ID: 7
Thread ID: 3
Thread ID: 8
Thread ID: 5
Thread ID: 4
Thread ID: 0
Thread ID: 2
如果你想要比 this 更多的信息,cython 文档中的页面有一个关于如何使用 cython 并行性的很好的基本指南。
我有以下 Cython
代码:
from cython import parallel
from libc.stdio cimport printf
def test_func():
cdef int thread_id = -1
with nogil, parallel.parallel(num_threads=10):
thread_id = parallel.threadid()
printf("Thread ID: %d\n", thread_id)
但是,它总是只启动一个线程,即输出总是只有
Thread ID: 0
获取多线程我做错了什么?
Cython 使用 OpenMP 因为它的多线程功能。
要启用 OpenMP,编译器需要在编译和链接时向其传递一个额外的标志,否则代码的并行部分将被忽略。
一些流行的编译器的标志如下:
- GCC = -fopenmp
- MSVC = /openmp
- icc = -openmp
假设您已将函数保存在文件 test.pyx
中,如果您使用的是 GCC,则以下 setup.py
应该有效。
from distutils.core import setup, Extension
from Cython.Build import cythonize
extensions = [Extension(
"test",
sources=["test.pyx"],
extra_compile_args=["-fopenmp"],
extra_link_args=["-fopenmp"]
)]
setup(
ext_modules = cythonize(extensions)
)
一旦像这样编译,代码应该在 运行:
时生成 10 个线程In [1]: import test
In [2]: test.test_func()
Thread ID: 9
Thread ID: 1
Thread ID: 6
Thread ID: 7
Thread ID: 3
Thread ID: 8
Thread ID: 5
Thread ID: 4
Thread ID: 0
Thread ID: 2
如果你想要比 this 更多的信息,cython 文档中的页面有一个关于如何使用 cython 并行性的很好的基本指南。