[英]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.