Сравнение OpenCL с CUDA, GLSL и OpenMP

На хабре уже рассказали о том, что такое OpenCL и для чего он нужен, но этот стандарт сравнительно новый, поэтому интересно как соотносится производительность программ на нём с другими решениями. В этом топике приведено сравнение OpenCL с CUDA и Шейдерами для GPU, а также с OpenMP для CPU. Тестирование проводилось на задаче N-тел. Она хорошо ложится на параллельную архитектуру, сложность задачи растёт как O(N2), где N — число тел. В качестве тестовой была выбрана задача симуляции эволюции системы частиц.

На скриншотах (они кликабельны) видна задача N точечных зарядов в статическом магнитном поле. По вычислительной сложности она ничем не отличается от классической задачи N тел (разве что картинки не такие красивые).

Во время проведения замеров вывод на экран был отключен, а FPS означает число итераций в секунду (каждая итерация — это следующий шаг в эволюции системы). Код на GLSL и CUDA для этой задачи был уже написан сотрудниками ННГУ.

CUDA обгоняет OpenCL приблизительно на 13%. При этом, если оценивать теоретически возможную производительность для этой задачи для данной архитектуры, реализация на CUDA достигает её. (В работе A Performance Comparison of CUDA and OpenCL говорится о том, что производительность ядра OpenCL проигрывает CUDA от 13% до 63% ) Несмотря на то, что тесты проводились на карточке серии Quadro, понятно, что обычный GeForce 8800 GTS или GeForce 250 GTS дадут схожие результаты (все три карточки основаны на чипе G92). OpenCL проигрывает шейдерам на карточках от AMD так как вычислительный блоки на них имеют архитектуру VLIW, на которую (после оптимизации) могут хорошо лечь многие шейдерные программы, но компилятор для кода OpenCL (который является частью драйвера) плохо справляется с оптимизацией.

Также этот весьма скромный результат может быть вызван тем, что карточки от AMD не поддерживают локальную память на физическом уровне, а отображают область локальной памяти на глобальную. Код с использованием OpenMP был скомпилирован при помощи компиляторов от Intel и Microsoft.

Компания Intel не выпустила своих драйверов для запуска кода OpenCL на центральном процессоре, поэтому был использован ATI Stream SDK. Код на OpenMP, скомпилированный при помощи MS VC++ имеет практически идентичную производительность с OpenCL. Это ещё при том, что Intel не выпустил своего драйвера для интерпретации OpenCL, и используется драйвер от AMD. Компилятор от Intel поступил не совсем «честно» он полностью развернул основной цикл программы, повторив его где-то 8k раз (число частиц было задано константой в коде) и получив семикратный прирост производительности также благодаря использованию SSE инструкций.

Но победителей, конечно, не судят.

Что характерно, на моём стареньком AMD Athlon 3800+ код тоже запустился, но таких выдающихся результатов, как на Intel, конечно, ждать не приходится. На данный момент не до конца доработаны драйверы и случаются такие ситуации, когда что-то есть в стандарте, а использовать в реальном коде нельзя.

(Например поддержка текстур в программах на OpenCL появилась у карточек ATI только с серии HD5xxx).

Драйверы генерируют не оптимальный код для данной конкретной платформы, в этом плане производителям есть куда развиваться. Писать на OpenCL почти то же самое, что писать на CUDA Driver API. Вроде бы больше возможностей, но не всегда удобно.

Появляется нечто вроде хвоста строк в 300, который обязательно тянется за любой вашей программой. Это плата за то, что ваш код может быть запущен практически на любом устройстве, предназначенном для параллельных вычислений.

Уже сейчас программы на OpenCL показывают достойную производительность по сравнению с конкурентами и могут успешно использоваться для параллельных вычислений общего назначения.

А для настоящего джедая, согласитесь, 300 строк кода не помеха, тем более их можно вынести в отдельную библиотеку.

Писали код, проводили замеры и интерпретировали результаты также аспирант ННГУ ВМК Боголепов Денис и студент НГТУ ИРИТ Захаров Максим. Спасибо им.

Комментарии запрещены.

Поиск