Пытаюсь освоить OpenCL, и всё больше мне кажется, что это сферическая технология в вакууме. Например, я нашел алгоритмы reduce и scan для ассоциативных функций. Мне же хочется посчитать такой массив (по сути, простейший low-pass фильтр):
b_{0} = a_{0}
b_{n} = \alpha b_{n-1} + (1-\alpha) a_{n}
Найденный мной алгоритм scan делает из массива (a0, a1, a2, a3, ...) массив (i, a0, a0+a1, a0+a1+a2, ...) где + — ассоциативная функция от 2-х аргументов, i+x = x
Только вот функция f(x,y) = a*x + (1-a)*y нифига не ассоциативная. И что, нет совершенно никакого способа посчитать массив b на GPU?
Low-pass фильтр взял совершенно наобум, но потребность считать что-то, что зависит от предыдущего шага вполне естественна. Например, решение дифуров методом Эйлера (Рунге-Кутта, да кого угодно) тоже предполагает такие вычисления