我有一个线性数组arr
,它是许多较小的子数组的元素的组合。大数组中每个子数组的位置由offsets
数组给出。
例如
如果arr = [1,2,4,3,6,4,8,9,12,3]
和offsets = [0,2,4,9]
,则子数组为[1,2,4]
,[3,6]
和[4,8,9,12,3]
。
现在,给定数组arr
和offsets
,我想对每个子数组执行并行归约。假设我们要查找每个子数组的max()
。因此,在我们的示例情况下,结果将为[4,6,12]
。在这种情况下,重要的约束条件是操作必须严格矢量化,并且不允许在循环中进行显式迭代。例如,在python中,不允许执行以下操作:
import numpy
arr = numpy.array([1,2,4,3,6,4,8,9,12,3])
offsets = numpy.array([0,2,4,9])
max_array = numpy.empty(num_sub_arrays)
for i in range(num_sub_arrays): # Eliminate this loop!
max_array[i] = numpy.max(arr[offsets[i]:offsets[i+1]])
我该如何实现这一目标?另外,请注意,代码应该尽可能通用,因为我计划在多种硬件(CUDA,AVX等)上实现它。
关于它的任何可实施的提示将非常有帮助!