Numba的并行化

时间:2018-07-19 09:55:50

标签: python parallel-processing numba

我正在尝试使一些代码使用Numba并行运行,但是结果取决于是否并行执行代码。我不确定我的问题是否无法按照我想要的方式并行化,或者我是否犯了错误。这是代码:

import numba as nb
import numpy as np


@nb.njit()
def add_to_img(image, i1, i2):
    image[np.int(i1), np.int(i2)] += 1


def iterate_over_indices(image, indices1, indices2):
    for i in nb.prange(len(indices1)): 
        add_to_img(image, indices1[i], indices2[i])


iterate_seq = nb.njit(iterate_over_indices)
iterate_par = nb.njit(iterate_over_indices, parallel=True)


for _ in range(5):
    image_seq = np.zeros((3, 3))
    image_par = np.zeros_like(image_seq)
    ind1 = np.random.uniform(0, image_seq.shape[0], size=1000)
    ind2 = np.random.uniform(0, image_seq.shape[1], size=1000)
    iterate_seq(image_seq, ind1, ind2)
    iterate_par(image_par, ind1, ind2)
    print(np.array_equal(image_seq, image_par))

在大多数情况下,image_seqimage_par不同。这是什么原因呢?我在具有4个物理核心和8个线程的计算机上运行。

1 个答案:

答案 0 :(得分:0)

好吧,我自己弄清楚了,当2个线程想要同时写入同一像素image[np.int(i1), np.int(i2)]时,就会出现问题。这将导致仅写入一次写入。如果没有两次出现坐标,则不会发生此问题。