Параллельная обработка графики в Haskell - PullRequest
9 голосов
/ 25 декабря 2011

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

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

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

Под «проблемой рендеринга» я имею в виду такие проблемы:

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

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


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

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

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

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


Относительно # 2: Очевидно, этот тип проблемыэто полная причина , что графические процессоры существуют в первую очередь.Очевидно, что GPU идеально подходит для решения подобных проблем.Мой вопрос больше "трудно ли это сделать из Хаскелла?"

Ответы [ 3 ]

7 голосов
/ 27 декабря 2011

Если вы умеете смешивать языки, то OpenCL очень универсален.Хотя язык OpenCL очень близок к тому, чтобы быть C (так что определенно не Haskell), вы можете написать свой код ядра в более или менее функциональном стиле и рассматривать его как отображение этого ядра по пространственным координатам.Преимущество работы с основной платформой параллельного программирования, такой как OpenCL, заключается в том, что вы можете опираться на растущий объем знаний, накопленный как специалистами HPC, так и графическими специалистами за многие годы во многих областях приложений.Перенаправление между процессором и графическим процессором в большинстве случаев безболезненно, но вам нужно знать о типах данных (например, некоторые графические процессоры не поддерживают двойную точность).OpenCL от Haskell .Он опирается на относительно новые OpenCL привязки (существует несколько привязок OpenCL при взломе, я не могу подтвердить их относительное качество).

5 голосов
/ 25 декабря 2011

Есть необработанные привязки OpenCL , но если вы хотите что-то, что поможет вам запускать высокоуровневый код - сгибы, почтовые индексы, карты и т. Д. - в графическом процессоре сегодня посмотрите на ускорение (бэкэнд CUDA) и GPipe (бэкэнд OpenGL, для работы с графикой; в настоящее время, к сожалению, немного перегнило).

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

2 голосов
/ 25 декабря 2011

Краткий ответ на вопрос 1 при отсутствии более подробной информации:

  1. Напишите свой код как обычно, используя библиотеку обработки векторов или массивов.

  2. Если библиотека еще не сделала этого за вас, вставьте соответствующие вызовы 'par' или комбинаторы на ее основе, чтобы обрабатывать вычисления на нескольких процессорах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...