Здравствуйте! Нужны ваши рекомендации по такому вопросу.
Необходимо параллельно произвести сложные вычисления на GPU, не выходя за рамки следующих требований:
1. вычисления должны производиться параллельно;
2. будет один большой кусок данных в видеопамяти, которые должен быть доступен в каждом из параллельно выполняющихся потоков на GPU, не дублируясь при этом в памяти;
3. каждый параллельно выполняющийся поток должен иметь возможность записать результаты своих вычислений в видеопамять;
4. должна быть возможность дождаться окончания выполнения всех параллельно выполняющихся потоков на GPU;
5. должна быть доступна одна из следующих возможностей (в порядке убывания приоритета):
5.1. возможность сохранять результаты вычислений сразу в OpenGL текстуру;
5.2. возможность создать OpenGL текстуру из результатов вычислений, находящихся в видеопамяти;
5.3. возможность перегнать результаты вычислений из видеопамяти в оперативную память;
6. независимость от платформы (Windows, Linux) и от производителя оборудования (NVIDIA, ATI), т.е. должно работать, результат работы должен быть одинаковым и, желательно, с наименьшими расхождениями в скорости.
Какие технологии вы порекомендуете использовать?
Можно ли обойтись только OpenGL и GLSL?
Какие подводные камни вы видите?
Что уже отпадает:
- CUDA (по 6 пункту требований: работает только на NVIDIA)
- OpenCL (по 6 пункту требований: судя по отзывам, на ATI работает заметно медленней, чем на NVIDIA, и вообще работает заметно медленней, чем при использовании CUDA или GLSL)
Если я где-то ошибаюсь или что-то не понимаю, пожалуйста, поправьте.
ialexbr
Не ясен характер вычислений. А то может тебе надо только пиксель закрасить по какой-то формуле :)
Blew_zc
Да мне нужно закрашивать пиксели в текстуре, но по очень трудоемкой формуле. Было бы идеально, если бы каждый пиксель обрабатывался параллельно от остальных, для увеличения скорости вычислений. Все это нужно, чтобы добиться фотореалистичности в реальном времени.
ialexbr
> Да мне нужно закрашивать пиксели в текстуре, но по очень трудоемкой формуле.
> Было бы идеально, если бы каждый пиксель обрабатывался параллельно от
> остальных, для увеличения скорости вычислений.
Так и есть.
ialexbr
> Все это нужно, чтобы добиться фотореалистичности в реальном времени.
А вот это зависит от специфических алгоритмов, заточенных под GPU. Ибо у GPU куча нюансов по работе с памятью, синхронизацией, etc...
Например, у GPU нет стека. Трассировку путем рекурсивного обхода дерева влоб не сделаешь :)
ialexbr
Пиксельный шейдер удовлетворяет всем требованиям.
ialexbr
> - OpenCL (по 5 пункту требований: судя по отзывам, на ATI работает заметно
> медленней, чем на NVIDIA, и вообще работает заметно медленней, чем при
> использовании CUDA или GLSL)
Чушь. Бери OpenCL, он отличный.
ialexbr
> 6. независимость от платформы (Windows, Linux) и от производителя оборудования (NVIDIA, ATI), т.е. должно работать, результат работы должен быть одинаковым и, желательно, с наименьшими расхождениями в скорости.
Благодаря этому пункту других вариантов нет, кроме OpenCL.
> Что уже отпадает:
> - CUDA (по 5 пункту требований: работает только на NVIDIA)
> - OpenCL (по 5 пункту требований: судя по отзывам, на ATI работает заметно медленней, чем на NVIDIA, и вообще работает заметно медленней, чем при использовании CUDA или GLSL)
Про CUDA понятно, он отпадает по п.6
Про OpenCL непонятно почему отпала п. 5. Что CUDA, что OpenCL умеют работать непосредственно с ресурсами DX и OGL.
> 5.2. возможность создать OpenGL текстуру из результатов вычислений, находящихся в видеопамяти;
А вы можете из GLSL или HLSL создавать текстуры? Если можете научите, пож, а иначе этот пункт равносилен п.5.1.
А так по теме:
Конечно все зависит от характера вычислений.
Но если OpenCL работает медленно GLSL, значит вы не научились работать с OpenCL.
> Да мне нужно закрашивать пиксели в текстуре, но по очень трудоемкой формуле. Было бы идеально, если бы каждый пиксель обрабатывался параллельно от остальных, для увеличения скорости вычислений.
Для этого OpenCL и CUDA создавались.
> если бы каждый пиксель обрабатывался параллельно от остальных
Да. Это можно реализовать на OpenCL или CUDA.
> Все это нужно, чтобы добиться фотореалистичности в реальном времени.
Это уже зависит от
> очень трудоемкой формуле
-Eugene-
> Пиксельный шейдер удовлетворяет всем требованиям.
+1, если формула не слишком сложная (т.е. ее в принципе можно на нем реализовать).
ialexbr
> - OpenCL (по 5 пункту требований: судя по отзывам, на ATI работает заметно медленней, чем на NVIDIA
Вообще-то бред. В некоторых задачах он рвет Ncidia на CUDA. AMD очень серьезно взялись за OpenCL.
А как на пиксельном шейдере реализовать, например, поиск наибольшего числа в текстуре? Или поиск какого-либо конкретного числа? (желательно не за log(width) проходов)
newillusion
> поиск наибольшего числа в текстуре? Или поиск какого-либо конкретного числа?
> (желательно не за log(width) проходов)
Вот так:
> за log(width) проходов
Я AABB так считаю для ландшафта. Намного шустрее аналогичного на процессоре.
newillusion
Есть еще вершинный шейдер! Можно нарисовать N^2 точек, каждая будет сравнивать соответствующую точку текстуры с заданным числом и выводить результат или делать discard. А для поиска максимума можно сначала BLENDом вывести, а потом как на прошлом шаге.
Про производительность не знаю, у меня все работало, но сравнить не с чем, может и тормознуто.
newillusion
> А как на пиксельном шейдере реализовать, например, поиск наибольшего числа в
> текстуре? Или поиск какого-либо конкретного числа? (желательно не за log(width)
> проходов)
А чем подход будет принципиально отличаться от OpenCL/DirectCompute/CUDA? Архитектура та же, поэтому те же ограничения.
ialexbr
> судя по отзывам, на ATI работает заметно медленней, чем на NVIDIA, и вообще
> работает заметно медленней, чем при использовании CUDA или GLSL
Может потому что на ATI вообще всё медленнее, такой вариант не рассматривался? :-7
ialexbr
Если OpenCL устроит boost.compute посмотрите
Тема в архиве.