gpt4 book ai didi

python - Cython 中的并行性不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:48 28 4
gpt4 key购买 nike

我有以下 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,编译器需要在编译和链接时向其传递一个额外的标志,否则代码的并行部分将被忽略。

一些流行的编译器的标志如下:

  • 海湾合作委员会 = -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 的并行性。

关于python - Cython 中的并行性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33613019/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com