【发布时间】:2018-06-03 03:16:04
【问题描述】:
我正在努力使用cython 正确并行化函数。基本上,问题是对一些数据进行分类。实际代码有点长,但最后它做了这样的事情:
def bin_var(double[:] dist,
double[:] values,
double[:] bin_def,
double[:] varg, long[:] count):
dbin = (bin_def[1] - bin_def[0]) / bin_def[2]
for n1 in range(values.size):
if (dist[n1] < bin_def[0]) or (dist[n1] >= bin_def[1]):
continue
else:
ni = int((dist - bin_def[0]) / dbin)
count[ni] += 1
varg[ni] += calc_something(values[ni])
# compute the mean
for n1 in range(int(bin_def[2])):
varg[ni] /= count[ni]
这段代码适用于一些简单的并行化(values 和 dist 非常大):需要将第一个 for 循环拆分为不同的进程,每个进程都使用自己的 count 版本和varg 数组。完成后,必须通过在第二个 for 循环之前将 count 和 varg 的不同版本相加来将所有内容组合在一起(短得多)。
也就是说,这两天我试图了解如何在 cython 中有效地实现这一点,我开始怀疑当前版本的语言不可能。请注意,仅将cython.parallel 中的prange 用于第一个循环并不能提供正确的结果,因为(我假设)来自不同线程的ni、count 和varg 同时访问。
cython 并行支持真的那么有限吗?我得到了如此好的单线程加速,我只是希望我能继续......
【问题讨论】:
标签: multithreading multiprocessing cython python-multiprocessing