Часто краем уха слышу разговоры про производительность той или иной видеокарты в различных тестах и приложениях. Частенько тесты скатываются к измерению частоты кадров в секунду. Но сегодняшний тест мы проведем в более интересном ракурсе.
Многие слышали (тем более от меня) что например в такой программе как 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. В ближайшем будущем будет интересное видео по параллельным вычислениям
Многие слышали (тем более от меня) что например в такой программе как 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. В ближайшем будущем будет интересное видео по параллельным вычислениям
Комментариев нет:
Отправить комментарий