Параллельная обработка графики в Haskell

Графика - одна из тех «досадно параллельных» проблем. Предполагается, что Haskell действительно хорош для параллельной обработки. Итак, мой вопрос:

  1. Как лучше всего задействовать как можно больше ядер ЦП для решения проблемы рендеринга?

  2. Можно ли заставить GPU выполнять задачу вместо этого?

С помощью «проблемы рендеринга». , Я имею в виду такие проблемы, как:

  • Цвет каждого пикселя является чистой функцией его координат.

  • Мы начинаем с существующего «входного» изображения, и цвет каждого «выходного» пикселя является чистой функцией соответствующего входного пикселя или, возможно, небольшой окрестности таких пикселей.


Относительно №1: Похоже, это тривиально, но на самом деле это не так. Существует несколько возможных вариантов структуры данных для хранения вычисленных пикселей (что влияет на то, как вы можете получить к ним доступ и насколько легко вы можете выгрузить результат на диск или экран). Есть несколько способов выполнения на нескольких ядрах. И так далее.

Мне кажется, что Data Parallel Haskell был бы идеальным выбором для такого рода вещей. Однако, когда я в последний раз проверял, DPH еще не работает. Так вот что. Даже если предположить, что это сработало, вы, вероятно, создадите параллельный массив для хранения пикселей, а затем вам придется скопировать пикселей, чтобы отобразить их на экране или записать на диск.

Я бы попытался зажечь каждый пиксель, но, вероятно, это слишком мелко. Я мог бы составить список пикселей и использовать одну из стратегий параллельного списка. Или я мог бы сделать его (распакованным?) Неизменяемым массивом и написать ручной код для запуска искр. Или я мог бы использовать явные потоки и изменяемые массивы. Или я мог бы создать группу рабочих потоков, которые будут передавать значения пикселей через канал в главный поток, который помещает результаты в нужное место. Или ...

Таким образом, здесь есть удивительное количество возможностей, и я не уверен, какая из них лучше.


Относительно №2: Очевидно, этот тип проблемы является единственной причиной того, что графические процессоры вообще существуют. Очевидно, что графический процессор идеально подходит для решения подобных проблем. Мой вопрос больше: «Трудно ли это сделать в Haskell?»

9
задан MathematicalOrchid 25 December 2011 в 17:30
поделиться