superPrac2 (mpi openmp, mpi cuda) (1186065), страница 2
Текст из файла (страница 2)
Независимое вычисление каждой ячейки в матрице (хорошо параллелится между нитями)2. Подсчёт суммы (или максимума) в массиве. Для этого реализовано ядро с логарифмическойсложностью, основанное на том, что нити итерационно складывают (находят максимум) значенийпо степеням двойки.63. Копирование вертикального столбца данных из матрицы (необходимо для формирования буфераданных для дальнейшей MPI пересылки)Буфера данных, для MPI приёма-передачи выделяются с использованием MemoryMapping (т.е.
безмеханизма виртуальных функций). Это сделано для того, чтобы видеокарта могла записывать (считывать)туда данные, формируя массив для отправки (приёма) сообщений по MPI. Это позволяет записывать(считывать) их не используя ресурс центрального процессора (это сделает за нас контроллер через PCIшину (т.к. asyncEngine=2)).Явного копирования этих буферов в память графической карты не производится, так как доступ к ним назапись/чтение не является многократным.Так как некоторые ядра обрабатывают отдельно границы области, а не всю область целиком, то они могутне заполнять все мультипроцессоры, поэтому для ускорения используются потоки.Количество пересылок памяти мало по сравнению с вычислительными затратами, поэтому в первуюочередь необходимо стараться заполнить весь ресурс видеокарты (все мультипроцессоры)вычислительными ядрами (т.е.
по возможности их нужно вешать на разные потоки выполнения).Рассчёт размера грида и размера блоков:1. Размер блока = 512, по 2-м причинам:a. На один мультипроцессор влазит ровно 3 блокаb. Блок максимального размера в 1024 нитей требует регистров в данной реализции больше,чем доступно на видеокарте.2. Я рассматриваю вычисление значения в каждой точке сетки - как отдельное вычисление,предназначенное для одного из ядер мультипроцессора. Однако количество мультипоцессоров=14, а максимальное количество нитей в 1-м мультипроцессоре =1536, таким образом я могуодновременно запустить максимум 21504 нити, которые будут соответственно обрабатыватьстолько же узлов сетки. Однако, если я одной видеокартой область, например, 2000x2000, то уменя узлов сетки будет 4 миллиона, что больше, чем 21504, и поэтому я делю одно число на другоеи тем самым вычисляю, сколько узлов сетки приходится на 1 нить, чтобы количество нитей послеэтого уложилось в 21504.Этим вычислением занимается класс GridDistribute.При этом при выполнении в данном случае соседние нити будут брать подряд идущие данные, чтодолжно благотворно влиять на запросы к памяти, т.к.
они будут распределены к разным банкампамяти.76. Результаты тестирования на суперкомпьютерахПрограммное средство (вместе с benchmark результатами) может быть найдено по адресу:[https://github.com/phonexicum/DHP-PE-RA-FDM](Реализация программы для CUDA находится в ветке «mpi-cuda»)Через двоеточие в таблице указаны минуты и секунды.При запуске mpi процессов для тестирования CUDA-программы, планировщику задач ломоносовауказывалось, чтобы он размещал по 2 процесса на 1-м узле, т.к.
на каждом узле ломоносова находится 2видеокарты.Вычисления для более, чем 16 GPU карт невозможно провести, используя быстродвижущуюся очередьgputest, поэтому производительность исследовалась для количества видеокарт не более, чем 16, чтовполне приемлемо, так как программа выполняется слишком быстро.Вычисление для 1-го mpi процесса проводилось той же программой, что и вычисление для p процессов.Отдельная последовательная реализации отсутствует.Результаты вычислений программы, основанной на каждой из технологий успешно проверялись накорректность.Компиляция на BlueGene/P производилась компилятором IBM для версии с openmp, и компилятором g++для версии без openmp.6.1.Численные результатыBlueGene/P (mpi) (c оптимизациями компилятора «-O3»)число процессоров разбиение сетки время решения (мс)11000x1000877509 мс = 14:3721000x1000439510 мс = 7:191281000x10007330 мс = 0:72561000x10003884 мс = 0:35121000x10002100 мс = 0:2ускорение1 раз2.00 раза119.71 раз225.93 раза417.86 разачисло итераций141614161416141614167090953 мс = 118:103547949 мс = 59:757079 мс = 0:5728838 мс = 0:2814626 мс = 0:141 раз2.00 раз124.23 раза245.89 раза484.82 раза--2828282828282828ускорение1 раз2.32 раза124 разa243 разa464 разaчисло итераций14161416141614161416----1 раз1.99 раза----28282828121282565122000x20002000x20002000x20002000x20002000x2000BlueGene/P (mpi) (без оптимизаций компилятора «-O3»)число процессоров разбиение сетки время решения (мс)11000x10003015294 мс = 50:1521000x10001297439 мс = 21:371281000x100024258 мс = 0:242561000x100012416 мс = 0:125121000x10006495 мс = 0:6121282562000x20002000x20002000x20002000x2000превышен лимит 2-х часовпревышен лимит 2-х часов190366 мс = 3:1095653 мс = 1:3585122000x200048431 мс = 0:483.93 раза2828BlueGene/P (mpi + openmp (режим openmp использовался с 3-мя нитями на 4-х ядерном процессоре))(с оптимизациями компилятора «-O3»)число процессоров разбиение сетки время решения (мс)ускорениечисло итераций1-omp (x3)1000x1000204639 мс = 3:241 раз14162-omp (x3)1000x1000103466 мс = 1:431.98 раза1416128-omp (x3)1000x10002784 мс = 0:273.51 раза1416256-omp (x3)1000x10001988 мс = 0:1102.94 раза 1416512-omp (x3)1000x10001602 мс = 0:1127.74 раза 14161-omp (x3)2-omp (x3)128-omp (x3)256-omp (x3)512-omp (x3)2000x20002000x20002000x20002000x20002000x20001691049 мс = 28:11847575 мс = 14:715670 мс = 0:158821 мс = 0:85541 мс = 0:51 раз2 раза107.92 раза191.71 раза305.19 раз28282828282828282828BlueGene/P (mpi + openmp (режим openmp использовался с 3-мя нитями на 4-х ядерном процессоре))(без оптимизаций компилятора «-O3»)число процессоров разбиение сетки время решения (мс)ускорениечисло итераций1-omp1000x1000262765 мс = 4:221 раз14162-omp1000x1000132624 мс = 2:121.98 раза1416128-omp1000x10004880 мс = 0:453.85 раза1416256-omp1000x10003029 мс = 0:386.75 раза1416512-omp1000x10002100 мс = 0:2125.13 раз14161 раз2.00 раза67.46 раза126.20 раз221.41 раз28282828282828282828Lomonosov (без оптимизаций компилятора «-O3»)число процессоров разбиение сетки время решения (мс)11000x1000309562 мс = 5:981000x100039096 мс = 0:39161000x100019487 мс = 0:19321000x10009797 мс = 0:9641000x10005027 мс = 0:51281000x10002667 мс = 0:2ускорение1 раз7.92 раза15.89 раза31.60 раз61.58 разa116.07 разaчисло итераций1416141614161416141614162470405 мс = 41:10311965 мс = 5:11156656 мс = 2:3678854 мс = 1:1839334 мс = 0:3919924 мс = 0:191 раз7.92 раза15.77 раза31.33 раза62.81 раза124.00 раза282828282828282828282828ускорение1 раз1.57 раза1.44 раза1.33 разачисло итераций14161416141614161-omp2-omp128-omp256-omp512-omp181632641282000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002137275 мс = 35:371070854 мс = 17:5031682 мс = 0:3116936 мс = 0:169653 мс = 0:9Lomonosov, CUDA (без оптимизаций компилятора «-O3»)число процессоров разбиение сетки время решения (мс)11000x10007721 мс = 0:781000x10004920 мс = 0:4161000x10005368 мс = 0:5321000x10005806 мс = 0:591816322000x20002000x20002000x20002000x200056059 мс = 0:5613778 мс = 0:1312316 мс = 0:1211799 мс = 0:11Lomonosov, CUDA (c оптимизациями компилятора «-O3»)число процессоров разбиение сетки время решения (мс)11000x10006161 мс = 0:621000x10003496 мс = 0:331000x10002575 мс = 0:241000x10002116 мс = 0:251000x10001837 мс = 0:161000x10001774 мс = 0:171000x10001603 мс = 0:181000x10001605 мс = 0:11 раз4.07 раза4.55 раза4.75 раза2828282828282828ускорение1 раз1.76 раза2.39 раза2.91 раза3.35 раза3.47 раза3.8434 раза3.8386 разачисло итераций14161416141614161416141614161416123456789101112131415162000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x20002000x200047668 мс = 0:4724922 мс = 0:2417368 мс = 0:1713156 мс = 0:1310884 мс = 0:109287 мс = 0:98193 мс = 0:87135 мс = 0:76653 мс = 0:66195 мс = 0:65749 мс = 0:55393 мс = 0:55131 мс = 0:55112 мс = 0:54904 мс = 0:44495 мс = 0:41 раз1.91 раза2.74 раза3.62 раза4.38 раза5.13 раза5.82 раза6.68 раза7.16 раз7.69 раз8.29 раз8.84 раза9.29 раз9.32 раза9.72 раза10.60 раз28282828282828282828282828282828282828282828282828282828282828281234567815165000x50005000x50005000x50005000x50005000x50005000x50005000x50005000x50005000x50005000x5000780712 мс = 13:0405896 мс = 6:45274721 мс = 4:34197794 мс = 3:17164090 мс = 2:44131887 мс = 2:11117093 мс = 1:5798859 мс = 1:3853185 мс = 0:5350254 мс = 0:501 раз1.92 раза2.84 раза3.94 раза4.76 раза5.92 раза6.67 раз7.90 раз14.68 раз15.54 раза70477047704770477047704770477047704770476.2.Выводы из численных результатовЭффективность на BlueGene в случае отключённых оптимизаций компилятора – мала и падает буквальнов 2 раза, хоть и линейна, это проявляется только для данного суперкомпьютера и только при отключённыхоптимизациях g++.
Причина такого поведения не ясна и скорее всего как-то завязана на архитектуруданного суперкомпьютера и компилятора.10Эффективность (ускорение) показывает, что OpenMP даёт больший прирост производительности, нежелииспользование дополнительных процессоров. Это вполне ожидаемо, т.к. нити openmp используютразделяемую память и им не приходится обмениваться данными через MPI вызовы.Эффективность для технологии CUDA при малом размере задачи растёт крайне нелинейно, это связанос тем, что при увеличении количества вычислительных узлов, количество пересылок возрастает, в товремя как количество вычислений на каждый узел – падает, это приводит к падению эффективности, таккак существенная часть времени уходит на пересылки данных.Данный эффект может наблюдаться для совершенно любых задач, однако для высокопроизводительнойcuda и исследуемого размера задачи оно достигается уже на малом количестве узлов (так – оптимальнаяэффективность достигается для сетки 1000x1000 на 7-ми узлах)11График зависимости времени выполнения (в мс) от количества процессов для выполнения на разныхархитектурах, разных матриц, с разными технологиями, при отключённых оптимизациях компилятора(без флага «-O3»)Объединённый рисунок:Визуализация 4-х самых быстрых составов (аппаратура - размер матрицы – использованная технология):Стоит отметить, что BlueGene/P отличается крайне высокой стабильностью времени вычисления(выяснено практическим путём).127.














