пятница, 26 апреля 2019 г.

Профессиональная или игровая видео карта Nvidia лучше в многопоточных расчетах ? GPU или CPU ?

          Часто краем уха слышу разговоры про производительность той или иной видеокарты в различных тестах и приложениях. Частенько тесты скатываются к измерению частоты кадров в секунду. Но сегодняшний тест мы проведем в более интересном ракурсе.
          Многие слышали (тем более от меня) что например в такой программе как ANSYS есть возможность включений функции параллельных вычислений за счет GPU.
         GPU - это графическое ядро вашего компьютера, корпорация Nvidia предоставила пользователям для своей линейки продукции технологию параллельных вычислений CUDA. Но при этом, когда-то давно, решили ограничить ее использование среди профессиональных видеокарт и пользовательских. Таким образом для обычных пользовательских игровых видео карт был заблокирован доступ технологии CUDA в не рамок определения цвета пикселя вашего монитора. И корпорация ANSYS не стала сопротивляться решению Nvidia и так же не стала вмешиваться в данную проблему, и по сей день технология CUDA в программе ANSYS поддерживается только профессиональными картами.


          Параллельные вычисления показывают высокую производительность в основном в функциях линейной алгебры - сложение, вычитание, разность, произведение. Но даже увеличение производительности в таких простых операциях предоставляет огромный потенциал для ученых, инженеров и исследователей в различных областях где в углу стола находится математика.
         Принцип многопоточности очень прост, программист резервирует объем занимаемой памяти некого объема в оперативной памяти, например 36 байт (что соответствует 9 целым числам) и отправляет данный объем на видео устройство где происходит деление пропорционально количеству ядер , например на три ядра, на 1 ядро придет 0,3,6; на 2 ядро придет 1,4,7 и на 3 ядро придет 2,5,8. То есть процесс распараллелиться на три потока. Это невозможно сделать на всех net языках , только на управляемом С/С++.
          Для примера в ANSYS (и иных ПО) технология CUDA используется при перемножении матриц, умножении матрицы на число, умножение строк и столбцов на число и т. д.
          В сегодняшнем тесте будут участвовать две видеокарты одного ценового диапазона:
- Nvidia Quadro M4000
- Nvidia GeForce 1080ti
          Давайте посмотрим на данных представителей мира Hi-tech:

Nvidia GeForce 1080ti


Nvidia Quadro M4000


          Тестировать будем на задаче линейной алгебры на языке C++, так как разработчики предоставляют доступ к видео карте за счет CUDA Toolkit именно на С/С++, которую можно спокойно скачать по ссылке.
          Что бы отправить вашу карту в мир иной, достаточно иметь права администратора в вашей ОС. Любые действия могут привести к фатальному факапу. Это предупреждение на всякий случай будущим последователям.
         В качестве эксперимента возьмем 400 000 000 чисел в 3 массивах. Каждое целое число представляет собой 4 байта информации, таким образом планка памяти представляет собой 1,6 Гбайт на выходе из видеокарты, на входе мы резервируем 1.6*3=4.8 Гбайт в оперативной памяти.
         Но для интереса в тест добавим CPU двух версий:
1. Intel Xeon(R) W-2133   3.6 Ghz
2. Intel(R) Core i7-4930   3.4 Ghz
          В CPU параллельные вычисления вестись не будут , только одно ядро.
Итак берем 400 000 000 аргументов  функции "std::transform"-данная функция изменяет аргументы одного массива данных размерностью 400 000 000 в другой массив. Все результаты измеряем в миллисекундах и как среднее значение из 5 подходов:

Intel Xeon(R) W-2133 (вся программа):   4670 мсек   
                                                                     4191 мсек
                                                                     4221 мсек     среднее значение = 4316 мсек
                                                                     4245 мсек
                                                                     4253 мсек

Intel(R) Core i7-4930 (вся программа):    2430 мсек   
                                                                     2467 мсек
                                                                     2455 мсек     среднее значение = 2461 мсек
                                                                     2491 мсек
                                                                     2462 мсек

Nvidia Quadro M4000 (вся программа):  2468 мсек
                                                                    2462 мсек
                                                                    2512 мсек     среднее значение = 2466 мсек
                                                                    2461 мсек
                                                                    2430 мсек

Nvidia GeForce 1080ti (вся программа):  2196 мсек   
                                                                     2148 мсек
                                                                     2166 мсек     среднее значение = 2164 мсек
                                                                     2145 мсек
                                                                     2165 мсек

Intel Xeon(R) W-2133 (std::transform):      584 мсек
                                                                     581 мсек
                                                                     373 мсек     среднее значение = 472 мсек
                                                                     433 мсек
                                                                     392 мсек

Intel(R) Core i7-4930 (std::transform):       317 мсек
                                                                     309 мсек
                                                                     307 мсек     среднее значение = 314 мсек
                                                                     309 мсек
                                                                     331 мсек

Nvidia Quadro M4000 (std::transform):    23 мсек
                                                                    23 мсек
                                                                    23 мсек     среднее значение = 23 мсек
                                                                    23 мсек
                                                                    23 мсек                   


Nvidia GeForce 1080ti (std::transform):     12 мсек   
                                                                     12 мсек
                                                                     12 мсек     среднее значение = 12 мсек
                                                                     12 мсек
                                                                     12 мсек


          Если касаться различий Quadro M4000 и GeForce 1080ti по в функции "std::transform",то разница составила почти в два раза и все потому что ядер CUDA в последней так же в два раза больше.
          Если касаться многопточности на GPU, то разница с CPU составила на примере Xeon(R) W-2133 почти 40 раз !!! Теперь представьте что вам нужно совершить 50 000 таких действий, сколько вы времени можете сэкономить или на сколько ускорить процесс !?. Именно поэтому все эксперименты такого характера в 90% случаев приводят к диссертации в той или иной сфере. 
          И это не предел мечтаний, в скором будущем к моему проекту Phobos добавится возможность использования не только GPU многопоточной обработки, но и cuDNN. Но и свою основную деятельность я не оставил без внимания - многопоточной обработки больших инженерных данных в конструировании.
         P.S. В качестве интереса тестировал 12 000 000 000 аргументов функции, что порядка 48 Гбайт оперативной памяти, результаты не изменились в меньшую сторону , только увеличился отрыв между CPU и GPU в сторону конечно же GPU. В ближайшем будущем будет интересное видео по параллельным вычислениям

Комментариев нет:

Отправить комментарий

Поиск по этому блогу