繁体   English   中英

Cython并行读取文件并绕过GIL

[英]Cython reading in files in parallel and bypassing GIL

试图弄清楚如何使用Cython绕过GIL并并行加载文件以执行IO绑定任务。 现在,我有以下Cython代码尝试加载文件n0.npy,n1.py ... n100.npy

def foo_parallel():
    cdef int i

    for i in prange(100, nogil=True, num_threads=8):
        with gil:
            np.load('n'+str(i)+'.npy')

    return []

def foo_serial():
    cdef int i

    for i in range(100):
        np.load('n'+str(i)+'.npy')

    return []

我没有注意到明显的提速-有人对此有任何经验吗?

编辑:我得到900毫秒并行与1.3秒串行。 给定8个线程,预计会有更多的加速

如评论所述,您不能将NumPy与gil一起使用,并期望它能够并行化。 您需要执行C或C ++级别的文件操作。 有关潜在的解决方案,请参见此处的这篇文章http://www.code-corner.de/?p=183

即适应您的问题: file_io.pyx我将其张贴在这里,但无法弄清楚我的牢房。 在其中的cdef语句的末尾添加nogil ,并从您的prange循环中的cpdef foo_parallel定义的函数中调用该函数。 使用read_file而不是慢的文件,并将其更改为cdef 这样做后请发布基准测试,因为我很好奇,也没有休假用的电脑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM