当 运行 循环使用 prange from numba 对其进行并行化时,元素是否以相同的顺序附加?
When running a loop using prange from numba to parallelize it, are elements appended in the same order?
我正在使用 numba prange 来尝试并行化以下函数:
@njit(parallel=True)
def contrast_16bit(video):
n = video.shape[0]
#New max value
high = 65535
video16 = []
for i in prange(n):
data = video[i,:,:]
#Old max and min
vmin = np.min(data)
vmax = np.max(data)
#Scale factor
scale = high/(vmax-vmin)
#Scale data
data = data - vmin
data = scale * data
#Append data
video16.append(data)
我的问题是,当循环使用 prange 时,当每个数据附加到 video16 列表时,它是否保持与原始数组中相同的顺序?
因此首先附加视频中的第一个数组,依此类推。
谢谢!
至于你问的字面问题 - 不知道,老实说,如果不深入研究实现就很难知道,所以老实说,我害怕依赖这个并行操作的顺序。
但是,您可以通过分配一个数组来回避整个问题:video16 = np.empty(n, dtype=float)
,然后在最后一步设置 video16[i] = data
!这样更安全也更容易理解。
使用 prange
时,您应该始终期待随机评估顺序。这可以很容易地检查:
@nb.njit(parallel=True)
def order():
for value in nb.prange(5):
print(value)
此外,如果您关心效率,请避免在事先知道最终大小的情况下使用不断增长的数据结构,因此请遵循@Perfi 的建议,预先分配数组并将每个循环结果插入其已知位置。
我正在使用 numba prange 来尝试并行化以下函数:
@njit(parallel=True)
def contrast_16bit(video):
n = video.shape[0]
#New max value
high = 65535
video16 = []
for i in prange(n):
data = video[i,:,:]
#Old max and min
vmin = np.min(data)
vmax = np.max(data)
#Scale factor
scale = high/(vmax-vmin)
#Scale data
data = data - vmin
data = scale * data
#Append data
video16.append(data)
我的问题是,当循环使用 prange 时,当每个数据附加到 video16 列表时,它是否保持与原始数组中相同的顺序?
因此首先附加视频中的第一个数组,依此类推。
谢谢!
至于你问的字面问题 - 不知道,老实说,如果不深入研究实现就很难知道,所以老实说,我害怕依赖这个并行操作的顺序。
但是,您可以通过分配一个数组来回避整个问题:video16 = np.empty(n, dtype=float)
,然后在最后一步设置 video16[i] = data
!这样更安全也更容易理解。
使用 prange
时,您应该始终期待随机评估顺序。这可以很容易地检查:
@nb.njit(parallel=True)
def order():
for value in nb.prange(5):
print(value)
此外,如果您关心效率,请避免在事先知道最终大小的情况下使用不断增长的数据结构,因此请遵循@Perfi 的建议,预先分配数组并将每个循环结果插入其已知位置。