【问题标题】:Parallelism in Cython does not workCython 中的并行性不起作用
【发布时间】:2015-11-09 15:54:37
【问题描述】:

我有以下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

我做错了什么来获得多线程?

【问题讨论】:

    标签: python openmp cython


    【解决方案1】:

    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
    

    如果您想了解比 cython 文档中的 this 页面更多的信息,请参阅有关如何使用 cython 并行性的良好基本指南。

    【讨论】:

      猜你喜欢
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多