У меня есть линейный массив 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 и т. Д.).
Любые реализуемые подсказки относительно этого будут очень полезны!