带Numb的并行化

2024-04-26 06:16:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用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个线程的机器上运行。你知道吗


Tags: 代码imageimportasnpseqovernb
1条回答
网友
1楼 · 发布于 2024-04-26 06:16:20

好吧,我自己想出来的,当两个线程想同时写入同一个像素image[np.int(i1), np.int(i2)]时,问题就出现了。这将导致只注册一次写操作。如果没有坐标出现两次,则不会出现此问题。你知道吗

相关问题 更多 >