Я пишу приложение, и в итоге получается хорошо распараллеливаемая часть:
two dimensional float initialData and result arrays
for each cell (a, b) in result array:
for each cell (i, j) in initialData:
result(a, b) += someComputation(initialData(i, j), a, b, i, j, some global data...);
Еще немного об алгоритме:
- Я хотел бы, чтобы итерации первого цикла выполнялись одновременно (возможно, есть лучший подход?)
- Исходные данные доступны только для чтения
- someComputation довольно прост, он включает в себя умножение, сложение, вычисление косинуса, поэтому его можно выполнить с помощью графического процессора, однако ему нужны индексы элементов, над которыми он работает в данный момент.
- Массивы не превышают ~ 4000 в любом измерении.
Свойства библиотеки:
- Программа будет написана на C# (с WPF), поэтому было бы неплохо, если бы она (уже) имела простые в использовании привязки .NET.
- Если графический процессор не найден, алгоритм должен выполняться на процессоре.
- Программа будет только для Windows, и поддержка Windows XP крайне предпочтительна.
- Алгоритм можно переписать на OpenCL, однако я считаю, что он не так широко поддерживается, как пиксельные шейдеры. Но, если нет альтернатив, OpenCL вполне подойдет. (AFAIK CUDA работает только на графических процессорах nVidia, а OpenCL распространяется как на графические процессоры nVidia, так и на графические процессоры AMD)
Я попытался посмотреть библиотеку Microsoft Accelerator, но не нашел способа передать индексы массива. Любая помощь будет оценена и извините меня за мой английский.