January 5th, 2010

glider

Accelerator v2

Недавно для меня было интересно узнать, что Акселератор (API MS для юзания высокопроизводительных числодробилок из дотнета), оказывается, ожил. В сравнении с первой инкарнацией, которая тихо умерла года три назад, его переписали на плюсах, привинтили расширяемое гнездо для бакэндов и теперь активно пиарят: GPGPU and x64 Multicore Programming with Accelerator from F#, Accelerator and F# (I.): Introduction and calculating PI, Accelerator and F# (II.): The Game of Life on GPU, Accelerator and F# (III.): Data-parallel programs using F# quotations.

Ниже приведено сравнение одномерных конволверов, записанных при помощи Акселератора и Конфлакса (код написан на квази-f#). Немного комментариев. В первом случае маски конволюшена задаются сдвигами матрицы, во втором случае - для каждого элемента матрицы (задаваемого gid.X и gid.Y) элементы его личной маски находятся смещением индексов. Также в первом случае оператор * перегружен и обозначает умножение скаляра на матрицу, а во втором случае - это обычное умножение флоатов.
// Accelerator v2
let convolveX kernel input =
    let strip = map [0 .. kernel.Length - 1] (fun i -> ParallelArrays.Shift(input, [| 0; -i |]))
    fold map((zip kernel strip) *) +
 
// SIMT-based approach (CUDA/ATI Stream/OpenCL etc)
let convolveX kernel input =
    let strip = map [0 .. kernel.Length - 1] (fun i -> input.[gid.Y, gid.X - i])
    fold map((zip kernel strip) *) +