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

    image
    На хабре уже рассказали о том, что такое OpenCL и для чего он нужен, но этот стандарт сравнительно новый, поэтому интересно как соотносится производительность программ на нём с другими решениями.

    В этом топике приведено сравнение OpenCL с CUDA и шейдерами для GPU, а также с OpenMP для CPU.

    Тестирование проводилось на задаче N-тел. Она хорошо ложится на параллельную архитектуру, сложность задачи растёт как O(N2), где N — число тел.

    Задача


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

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


    Результаты


    GPU


    Код на GLSL и CUDA для этой задачи был уже написан сотрудниками ННГУ.

    NVidia Quadro FX5600


    Версия драйвера 197.45
    image

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

    Radeon HD4890


    ATI Stream SDK версия 2.01
    image

    OpenCL проигрывает шейдерам на карточках от AMD так как вычислительный блоки на них имеют архитектуру VLIW, на которую (после оптимизации) могут хорошо лечь многие шейдерные программы, но компилятор для кода OpenCL (который является частью драйвера) плохо справляется с оптимизацией.
    Также этот весьма скромный результат может быть вызван тем, что карточки от AMD не поддерживают локальную память на физическом уровне, а отображают область локальной памяти на глобальную.

    CPU


    Код с использованием OpenMP был скомпилирован при помощи компиляторов от Intel и Microsoft.
    Компания Intel не выпустила своих драйверов для запуска кода OpenCL на центральном процессоре, поэтому был использован ATI Stream SDK.

    Intel Core2Duo E8200


    ATI Stream SDK версия 2.01
    image


    Код на OpenMP, скомпилированный при помощи MS VC++ имеет практически идентичную производительность с OpenCL.
    Это ещё при том, что Intel не выпустил своего драйвера для интерпретации OpenCL, и используется драйвер от AMD.

    Компилятор от Intel поступил не совсем «честно» он полностью развернул основной цикл программы, повторив его где-то 8k раз (число частиц было задано константой в коде) и получив семикратный прирост производительности также благодаря использованию SSE инструкций. Но победителей, конечно, не судят.

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

    Заключение


    • На данный момент не до конца доработаны драйверы и случаются такие ситуации, когда что-то есть в стандарте, а использовать в реальном коде нельзя. (Например поддержка текстур в программах на OpenCL появилась у карточек ATI только с серии HD5xxx).
    • Драйверы генерируют не оптимальный код для данной конкретной платформы, в этом плане производителям есть куда развиваться.
    • Писать на OpenCL почти то же самое, что писать на CUDA Driver API.
    • Вроде бы больше возможностей, но не всегда удобно. Появляется нечто вроде хвоста строк в 300, который обязательно тянется за любой вашей программой. Это плата за то, что ваш код может быть запущен практически на любом устройстве, предназначенном для параллельных вычислений.
    • Уже сейчас программы на OpenCL показывают достойную производительность по сравнению с конкурентами и могут успешно использоваться для параллельных вычислений общего назначения. А для настоящего джедая, согласитесь, 300 строк кода не помеха, тем более их можно вынести в отдельную библиотеку.


    Спасибы


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

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 43

      0
      glsl на ати уделывает куду… жаль, до этого момента был полноценным привержецем НВидии =( теперь буду начинать задумываться…
        +4
        Помоему видеокарты разного класса, хотя и одного поколения.
          +2
          даже не одного поколения
          автор немного ошибся, насчет G92 у FX5600 — там все-таки G80
          а G92 у 8800 GTS 512mb и 250 GTS
          и если уж сравнивать HD4890, то только с gtx280
          +1
          Что-то я не увидел что уделывает.
          В какой таблице?
            +1
            Смотрите 1-ю и 2-ю таблицы.
            Все предельно наглядно.
              –1
              Хмм, или я таблицу не вижу или чем меньше Fps и Gflops тем лучше?
              На таблицах fps и gflops у Cuda больше чем у Glsl не так ли?
                +3
                Ок, смотрим.

                1-я таблица, NVIDIA, 2048 частиц, CUDA:
                FPS: 1398
                GFLOPS: 117.27

                2-я таблица, ATI, 2048 частиц, GLSL:
                FPS: 3109
                GFLOPS: 260.71

                В 2.22 раза ATI GLSL быстрее NVIDIA CUDA и в 3.43 раза быстрее NVIDIA GLSL.

                Конечно видеокарты разные, но поколение одно.
                Отрыв ATI просто поражает.
                  0
                  поколения немного разные, RV790 как раз примерно раза в 2 быстрее G92
                  но если протестить GT200, то результаты будут примерно равны с RV790
            –2
            Видеокарты были выпущены с интервалом в год или больше. Пусть прогонят на GTX 480 — вот это будет интереснее. А, и кстати, 4890 — двухчиповая.
              0
              Нифига. 4890 это вторая ревизия 4870.

              А вообще выбор видеокарт очень странный — было бы интересно сравнить не слона с китом, а одно поколение и одну нишу. То есть HD 5870 и GTX 480.
                0
                Вы абсолютно правы. Но сравниваются не две разные видеокарты, а технологии внутри одной архитектуры.

                К несчастью, флагманских моделей на руках не было.
                +2
                Учи матчасть, 4870х2 — двухчиповая, 4890 это работа над ошибка 70ой серии.
                  0
                  5890 двухчиповая ^_^
                  Это я к тому, что те кто не следят могут перепутать.
                0
                Дело в том, что у этих карточек разная архитектура.

                На карточках AMD стоят суперскалярные процессоры, а на Nvidia — скалярные.

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

                Скромное мнение: оба класса карточек весьма хороши в своём.
                  0
                  +2
                  Перенесите в публичный блог, на главную уйдет, материал хороший.
                    0
                    А вы пробовали запускать написанный OpenCL код на гибридной системе (то есть не выбирая конкретный девайс)?
                      0
                      Вы хотели сказать, «переложить выбор устройства на усмотрение API» или «запустить одну программу на CPU и GPU одновременно»?

                      Суть гетерогеных вычислений — во втором.
                      Вызов API функций без указания устройства приведёт к первому.
                        0
                        Хмм… я предполагал, что при достаточном количестве задач на исполнение они начнут распределяться между устройствами, или я не прав?
                        В любом случае я имел ввиду именно «запустить одну программу на CPU и GPU одновременно».
                          0
                          Программист сам должен определять какая задача на каком устройстве будет исполнена.
                          Можно одну и ту же задачу на разных данных запустить.
                          Можно разные.
                          Но всё-равно это придётся сделать руками.
                      0
                      Я если честно не понял для чего эти сравнения. OpenCL это надстройка над решениями разных прозводителей, чтобы проще было портировать код. Постепенно потерю производительности будут снижать.
                        +4
                        В целом верно, но не совсем.

                        Если для NVidia — OpenCL это действительно надстройка над CUDA, то для продуктов AMD это единственный способ программировать видеокарту для решения задач общего назначения (подразумеваем, что шейдеры заточены под графику и их мы использовать не будем, хотя и можем).

                        И не совсем ясно над каким решением OpenCL является надстройкой для центральных процессоров.
                          0
                          ATI Brook мертв?
                            0
                            Brook+ больше не поставляется с ATI Stream SDK, от него отказались в сторону развития открытого стандарта OpenCL.
                        0
                        А можно как-нибудь получить скомпилированные EXE-шники? Погонять в домашних условиях.
                          0
                          На винте остались только тесты для CPU, чтобы их погонять придётся поставить ATI Stream SDK.
                          Вот тест для 512 частиц, с рендерингом.

                          rghost.ru/2114631

                          0
                          Несмотря на то, что тесты проводились на карточке серии Quadro, понятно, что обычный GeForce 8800 GTS или GeForce 250 GTS дадут схожие результаты (все три карточки основаны на чипе G92).

                          Вроде как Quadro FX5600 основана на G80, как и 8800 GTS, а вот 256 GTS действительно на G92.
                            0
                            Первой моделью на основе полноценного чипа G92, со всеми включенными потоковыми процессорами, была GeForce 8800 GTS 512MB, выпущенная в конце 2007 года


                            Источник ixbt и википедия.

                            Про Quadro вы оказались правы, недоглядел, исправлюсь.

                              0
                              До 8800gts 512mb которая основана на g92, были две карты 8800gts 320mb и 8800gts 640mb основанные на g80.
                            –1
                            Карта Radeon HD4890 всех порвала. Я ничего не напутал?
                              0
                              На шейдерах. Тем более сравнивать разные таблицы в общем случае мы не имеем права.
                              Только значения внутри одной таблицы.

                              И с OpenCL на AMD всё несколько плачевно, хотя это, предположительно, ненадолго.
                                +1
                                порвала на тесте GLSL-версии реализации.
                                видимо потому что на HD4890 шейдерных процессоров в 6,25 раз больше чем на FX5600.
                                (хотя порвала-то не в 6,25 раз)
                                +3
                                Очень полезная статья, хотя зря тестировались конкуренты разных поколений.

                                Выложите исходники на GitHub, кто-нибудь оттестирует на одном и том же поколении.
                                  0
                                  используйте С++ wrapper(cl.hpp) для вызовов OpenCL функций на хосте, на порядок удобнее и меньше писанины. Можно найти на сайте хроноса.
                                    0
                                    А с DirectCompute не сравнивали?
                                      0
                                      Как ни прискорбно, но нет.
                                      Согласен, было бы интересно.
                                      0
                                      Насколько я помню на ATI картах официальная поддержка OpenCL начинается с HD 5xxx
                                      Так что лучше было брать 5-ю линейку данных видеокарт.

                                        0
                                        официальная поддержка OpenCL начинается с HD 5xxx

                                        На страничке ATI Stream SDK в графе Supported Cards карты 4xxx серии стоят с пометкой Beta Support.

                                        Карты пятитысячной серии на руках пока нет.
                                          0
                                          Симпатично выглядит! Демкой exe'шной не поделитесь?
                                            0
                                            Про VLIW — странное утверждение. Какая ему разница, считается скалярное произведение в шейдере или же в OpenCL программе? И вообще, не плохо бы было показать исходники, а то когда о тестировании пишется с некими циферками, хотелось бы понимать, а к чему именно эти циферки относятся. Может, там вообще всё можно ещё в 10 раз быстрее сделать?
                                              0
                                              Как бы, github и bitbucket существуют, проблем с выкладыванием не должно быть.
                                            • UFO just landed and posted this here
                                                0
                                                Очень полезная статья, спасибо. Хотелось бы видеть новые сравнения.

                                                Only users with full accounts can post comments. Log in, please.