当前位置:  开发笔记 > 编程语言 > 正文

Cython中的并行性不起作用

如何解决《Cython中的并行性不起作用》经验,为你挑选了1个好方法。

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

我在做多线程时做错了什么?



1> Simon Gibbon..:

Cython使用OpenMP来实现多线程功能.

要启用OpenMP,编译器将需要在编译和链接时传递一个额外的标志,否则将忽略代码的并行部分.

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

GCC = -fopenmp

MSVC =/openmp

icc = -openmp

假设您已将函数保存在文件中test.pyx,setup.py则在使用GCC时,以下内容应该有效.

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文档中获得比这个页面更多的信息,那么有一个很好的基本指南,介绍如何使用cython进行并行化.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有