使用 Numba 并行化
Parallelization with 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_seq
与 image_par
不同。这是什么原因?我 运行 在一台有 4 个物理内核和 8 个线程的机器上。
好吧,我自己弄明白了,当2个线程想要同时写入同一个像素image[np.int(i1), np.int(i2)]
时,就会出现问题。这将导致只有一个写入被注册。如果没有出现两次坐标,则不会出现此问题。
我正在尝试使用 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_seq
与 image_par
不同。这是什么原因?我 运行 在一台有 4 个物理内核和 8 个线程的机器上。
好吧,我自己弄明白了,当2个线程想要同时写入同一个像素image[np.int(i1), np.int(i2)]
时,就会出现问题。这将导致只有一个写入被注册。如果没有出现两次坐标,则不会出现此问题。