Графика - одна из тех «досадно параллельных» проблем. Предполагается, что Haskell действительно хорош для параллельной обработки. Итак, мой вопрос:
Как лучше всего задействовать как можно больше ядер ЦП для решения проблемы рендеринга?
Можно ли заставить GPU выполнять задачу вместо этого?
С помощью «проблемы рендеринга». , Я имею в виду такие проблемы, как:
Цвет каждого пикселя является чистой функцией его координат.
Мы начинаем с существующего «входного» изображения, и цвет каждого «выходного» пикселя является чистой функцией соответствующего входного пикселя или, возможно, небольшой окрестности таких пикселей.
Относительно №1: Похоже, это тривиально, но на самом деле это не так. Существует несколько возможных вариантов структуры данных для хранения вычисленных пикселей (что влияет на то, как вы можете получить к ним доступ и насколько легко вы можете выгрузить результат на диск или экран). Есть несколько способов выполнения на нескольких ядрах. И так далее.
Мне кажется, что Data Parallel Haskell был бы идеальным выбором для такого рода вещей. Однако, когда я в последний раз проверял, DPH еще не работает. Так вот что. Даже если предположить, что это сработало, вы, вероятно, создадите параллельный массив для хранения пикселей, а затем вам придется скопировать пикселей, чтобы отобразить их на экране или записать на диск.
Я бы попытался зажечь каждый пиксель, но, вероятно, это слишком мелко. Я мог бы составить список пикселей и использовать одну из стратегий параллельного списка. Или я мог бы сделать его (распакованным?) Неизменяемым массивом и написать ручной код для запуска искр. Или я мог бы использовать явные потоки и изменяемые массивы. Или я мог бы создать группу рабочих потоков, которые будут передавать значения пикселей через канал в главный поток, который помещает результаты в нужное место. Или ...
Таким образом, здесь есть удивительное количество возможностей, и я не уверен, какая из них лучше.
Относительно №2: Очевидно, этот тип проблемы является единственной причиной того, что графические процессоры вообще существуют. Очевидно, что графический процессор идеально подходит для решения подобных проблем. Мой вопрос больше: «Трудно ли это сделать в Haskell?»