Отчет по тестированию кластера HP BladeSystem c7000 Руководитель: Малышкин В.Э. Исполнители: Маркова В.П. Киреев С.Е. Городничев М.А. Перепелкин В.А. Щукин Г. А. Содержание отчета 1. Введение 2. Особенности аппаратного и программного обеспечения кластера 2.1. Архитектура кластера 2.2. Нумерация ядер и распределение кэшей в узле кластера hpc7000 3. Пакет для тестирования многоядерных систем 4. Тестирование характеристик кластера hpc7000 с помощью тестового пакета. 4.1. Сравнение параллельных реализаций задач с помощью различных средств параллельного программирования 4.2. Исследование сочетаний процессов и потоков в реализации MPI+OpenMP 4.2.1. Распределение процессов и потоков по ядрам узла 4.2.2. Сравнение производительности кластеров hpc7000 и ibm1350 на реализации MPI+OpenMP 4.3. Сравнение реализаций коллективных операций в MPI 4.3.1. Сравнение реализаций операции MPI_Allreduce 4.3.2. Сравнение реализаций операции MPI_Allgather 5. Выводы 1. Введение Целью тестирования кластера HP BladeSystem c7000 (ниже hpc7000) является выявление особенностей программного и аппаратного обеспечения и их влияние на время выполнения программ численного моделирования. 2. Особенности аппаратного и программного обеспечения кластера 2.1. Архитектура кластера Кластер hpc7000 (рис.1) объединяет 8 двухпроцессорных узлов с общей памятью. Узел (рис.2) содержит два процессора Intel Xeon 5355 по четыре ядра каждый. Ядра в процессоре попарно динамически разделяют кэш 2-го уровня. Два ядра, в зависимости от взаимного расположения, могут обмениваться информацией либо через кэш 2 уровня, либо через шину FSB. Все 8 ядер для чтения/записи данных в ОЗУ, а так же для синхронизации одних и тех же данных в разных кэшах используют двойную независимую шину. Управляющий узел Управляющая сеть Ethernet Вычислительные узлы Коммутатор InfiniBand Рис. 1. Схема кластера hpc7000 Вычислительные узлы соединены высокоскоростным коммутатором InfiniBand. Управляющая сеть Ethernet используется для постановки задач в очередь и управления кластером. Некоторые характеристики кластера hpc7000 приведены в табл. 1. Процессор 1 Ядро1 Ядро2 Общий кэш L2 Процессор 2 Ядро3 Ядро4 Общий кэш L2 Ядро1 Ядро2 Общий кэш L2 Шина FSB Ядро3 Ядро4 Общий кэш L2 Шина FSB Двойная независимая шина Оперативная память Северный мост Интерфейс InfiniBand Рис. 2. Схема вычислительного узла кластера hpc7000 Таблица 1 Характеристика Название кластера Количество вычислительных узлов в кластере Количество процессоров в узле Количество ядер в процессоре Итого ядер в кластере Техпроцесс Процессор Тактовая частота процессора Пиковая производительность процессора Пиковая производительность кластера Частота шины Пропускная способность шины Кэш первого уровня Кэш второго уровня ОЗУ Пропускная способность памяти Значение hpc7000 8 2 4 64 65 нм Intel Xeon 5355 2.66 ГГц 42.56 ГФлопс 680.96 ГФлопс 1.33 ГГц 160 Мб/с 2×32 Кб на ядро 2 по 2 Мб на 4 ядра 16 Гб 10.66 Мб/с На кластере hpc7000 установлено следующее программное обеспечение. 1. Операционная система RedHat Linux (RHEL 5u1), 2. Компиляторы Intel 10.1.015, Intel MKL 10.0.3.020, Intel MPI 3.1.038, Intel Trace Analyzer & Collector 7.1.029, 3. Система пакетной обработки Grid Engine 6.1u4. В некоторых тестах производится сравнение кластера hpc7000 с кластером IBM System Cluster 1350 (далее ibm1350). Он имеет аналогичную архитектуру, но построен на менее производительных процессорах Intel Xeon 5320 1.86 GHz. 2.2. Нумерация ядер и распределение кэшей в узле кластера hpc7000 С помощью команды cpuinfo можно получить следующую информацию о процессорах кластера (рис.2): 1. Нумерация ядер в узле кластера: Номера ядер на первом процессоре (package 0): 0, 2, 4, 6. Номера ядер на втором процессоре (package 1): 1, 3, 5, 7. 2. Распределение кэшей между ядрами в узле кластера: Кэши 1-го уровня (32 Кб) отдельные для каждого ядра. Кэши 2-го уровня (4 Мб) разделяют пары ядер 0 и 4, 1 и 5, 2 и 6, 3 и 7. Рис.3. Нумерация ядер и распределение кэшей в узле кластера Приведенная нумерация и распределение кэшей (рис.3) одинакова для всех узлов кластера. 3. Пакет для тестирования многоядерных систем Настоящий пакет разработан для оценки производительности современных кластеров на элементах задач численного моделирования. Пакет включает следующий набор задач: умножение матрицы на вектор, умножение матрицы на матрицу, решение СЛАУ методом простой итерации, решение СЛАУ методом сопряженных градиентов, решение двумерного уравнения Пуассона методом Якоби. Все матрицы, используемые в задачах, хранятся в плотном формате. Задачи реализованы с помощью различных средств параллельного программирования. На данный момент для всех задач существуют следующие реализации: 1. MPI, 2. OpenMP, 3. MPI+OpenMP, 4. POSIX Threads, 5. Intel TBB. Некоторые задачи (умножение матрицы на вектор, решение СЛАУ, умножение матрицы на матрицу) имеют две реализации в MPI и MPI+OpenMP: 1. В первой реализации (MPI(1)) данные (матрица и вектор) распределены между процессами. 2. Во второй реализации (MPI(2)) матрица распределена между процессами, а вектор (матрица) дублируется во всех процессах. Все задачи пакета имеют две реализации в TBB: 1. В первой реализации (TBB(1)) данные разбиваются на фиксированного размера. 2. Во второй реализации (TBB(2)) данные разбиваются на автоматически с использованием средства TBB auto_partitioner(). блоки блоки В дополнение к задачам был создан набор управляющих скриптов для автоматизации процесса компиляции, запуска задач пакета и сбора результатов. Для использования пакета на конкретной вычислительной машине требуется задание только нескольких параметров, таких как используемые компиляторы и опции компиляции. Возможно указание того, какие группы тестов должны быть запущены и сколько запусков теста следует произвести. 4. Тестирование характеристик кластера hpc7000 с помощью тестового пакета. С помощью разработанного тестового пакета было проведено тестирование характеристик производительности кластера hpc7000, а также их сравнение с характеристиками кластера ibm1350. Для всех тестов использовался тип данных double. 4.1. Сравнение параллельных реализаций задач с помощью различных средств параллельного программирования Результирующее время выполнения теста определялось как среднее время исполнения теста за 10 прогонов. В задачах решения СЛАУ методом сопряженных градиентов и простых итераций, а также в задаче решения уравнения Пуассона выполнялось 1000 итераций метода. Размер задач: 1600×1600. Умножение матрицы на матрицу Умножение матрицы на матрицу 35 35 1 30 8 20 2 4 25 8 20 16 64 5 5 0 0 (2 ) MPI(2) TB B TB B MPI(1) PT O pe nM M M (1 ) 10 hr ea ds 32 10 P 15 PI (2 ) 15 Время, с 4 PI (1 ) Время, с 25 1 30 2 Параллельная реализация Параллельная реализация Метод сопряженных градиентов Метод сопряженных градиентов 7 7 1 6 8 4 3 Время, с 4 5 Время, с 1 6 2 4 5 8 16 4 32 3 2 2 1 1 0 2 64 0 MPI(1) MPI(2) OpenMP PThreads TBB(1) TBB(2) MPI(1) Параллельная реализация MPI(2) Параллельная реализация Метод простой итерации Метод простой итерации 7 7 1 6 8 4 3 Время, с 4 5 Время, с 1 6 2 4 5 8 16 4 32 3 2 2 1 1 0 2 64 0 MPI(1) MPI(2) OpenMP PThreads TBB(1) Параллельная реализация TBB(2) MPI(1) MPI(2) Параллельная реализация Решение уравнения Пуассона Решение уравнения Пуассона 50 50 1 45 40 30 25 Время, с Время, с 8 2 40 4 35 1 45 2 4 35 8 30 16 25 32 20 20 64 15 15 10 10 5 5 0 0 MPI OpenMP PThreads TBB(1) Параллельная реализация TBB(2) MPI Параллельная реализация В пределах одного узла ускорение наблюдается до 4 процессов/потоков. При числе процессов/потоков более 4 время перестает уменьшаться, вероятно, вследствие ограниченной пропускной способности памяти. Только в задаче умножения матриц время продолжает уменьшаться и до 8 процессов/потоков. Отличие этой задачи в том, что в ней производится непоследовательный обход памяти. Это приводит к улучшению показателя масштабируемости, однако в целом непоследовательный обход медленнее последовательного. Среди реализаций в пределах узла наилучшее время получилось в зависимости от задачи у MPI или OpenMP. TBB в большинстве случаев показывает самые плохие результаты. В MPI-реализациях при выходе за пределы одного узла наблюдается резкое уменьшение времени счета, т.к. снижается ограничение на пропускную способность памяти. 4.2. Исследование сочетаний процессов и потоков в реализации MPI+OpenMP 4.2.1. Распределение процессов и потоков по ядрам узла Для гибридных программ, использующих MPI+OpenMP, в библиотеке Intel MPI существуют специальные опции, позволяющие управлять распределением процессов и потоков по логическим процессорам (ядрам) на узлах кластера. Для управления распределением MPI процессов и порожденных ими OpenMP потоков в программах MPI+OpenMP используется переменная окружения I_MPI_PIN_DOMAIN, которая определяет разбиение множества логических процессоров узла на непересекающиеся подмножества (домены). Потоки процесса, запущенного на узле, могут мигрировать только в пределах домена, на который назначен процесс. Ниже перечислены возможные значения переменной I_MPI_PIN_DOMAIN. core – каждое ядро многоядерной системы определяется как отдельный домен; sock – каждый процессорный сокет определяется как отдельный домен; node – весь узел (все логические процессоры на нем) определяется как отдельный домен; cache1, cache2, cache3, cache – логические процессоры, разделяющие кэш соответствующего уровня, определяются как отдельный домен (cache – выбирается наибольший домен из всех остальных); omp – на основе значения переменной окружения OMP_NUM_THREADS выбирается наиболее подходящий домен из core, sock, node и cache; если переменная OMP_NUM_THREADS не определена, выбирается домен node. Переменная I_MPI_PIN_DOMAIN не определена по умолчанию. Документация по Intel MPI говорит, что при запуске программ MPI+OpenMP без определения переменной I_MPI_PIN_DOMAIN домены не определены. Но тесты показывают, что в этом случае доменом является каждое ядро, поэтому при увеличении числа потоков на процесс ускорения происходить не будет. Значит, при использовании сочетания MPI+OpenMP эту переменную необходимо определить подходящим образом. В следующих тестах задействовано 8 ядер одного узла. Показана зависимость времени работы теста от соотношения процессов и потоков в узле, а также от значения параметра I_MPI_PIN_DOMAIN. В пределах одного домена потоки могут мигрировать с одного ядра на другое. Размер задачи: 1600×1600. Метод сопряженных градиентов MPI(1)+OpenMP 2,5 node omp cache sock Метод сопряженных градиентов MPI(2)+OpenMP 2,5 2 Время, с Время, с 2 node omp cache sock 1,5 1 0,5 1,5 1 0,5 0 0 8, 1 4, 2 2, 4 Число процессов, потоков 1, 8 8, 1 4, 2 2, 4 Число процессов, потоков 1, 8 node omp cache sock Метод простой итерации MPI(1)+OpenMP 2,5 2,5 2 Время, с 2 Время, с node omp cache sock Метод простой итерации MPI(2)+OpenMP 1,5 1 0,5 1,5 1 0,5 0 0 8, 1 4, 2 2, 4 1, 8 8, 1 Число процессов, потоков 4, 2 2, 4 1, 8 Число процессов, потоков С полной загрузкой ядер узла при переходе от процессов к потокам время счета уменьшается. Различные значения параметра I_MPI_PIN_DOMAIN дают небольшую разницу времени выполнения, которая в общем случае зависит от задачи. В приведенных тестах в большинстве случаев лучшие результаты показывали параметры node и omp. В следующих тестах задействовано 4 ядра одного узла. Размер задачи: 1600×1600. Метод сопряженных градиентов MPI(1)+OpenMP Метод сопряженных градиентов MPI(2)+OpenMP 5 node 4,5 node 4 omp 4 omp 3,5 3 cache sock Время, с Время, с 5 4,5 2,5 2 1,5 3,5 3 cache sock 2,5 2 1,5 1 1 0,5 0,5 0 0 4, 1 2, 2 Число процессов, потоков 1, 4 4, 1 2, 2 Число процессов, потоков 1, 4 Метод простой итерации MPI(1)+OpenMP Метод простой итерации MPI(2)+OpenMP 5 4,5 node 4,5 node 4 omp 4 omp 3,5 3 cache sock Время, с Время, с 5 2,5 2 1,5 3,5 3 cache sock 2,5 2 1,5 1 1 0,5 0,5 0 0 4, 1 2, 2 1, 4 4, 1 Число процессов, потоков 2, 2 1, 4 Число процессов, потоков При неполной загрузке узла наименьшее время счета получается, когда задействуется вся кэш-память процессоров, т.е. каждый поток работает со своей кэш-памятью 2 уровня. Если потоки делят общую кэш-память, то часть кэш-памяти узла не используется, что приводит к сильному замедлению. Следовательно, для задач с похожими свойствами автоматический выбор распределения потоков при параметре omp не самый лучший. 4.2.2. Сравнение производительности кластеров hpc7000 и ibm1350 на реализации MPI+OpenMP В следующих тестах используется один узел кластера (8 ядер). Показано время работы теста на узлах кластеров hpc7000 и ibm1350 при различных соотношениях числа процессов и потоков. Параметру I_MPI_PIN_DOMAIN задано значение node. Размер задачи: 2000×2000. Умножение матрицы на матрицу MPI(1)+OpenMP Умножение матрицы на матрицу MPI(2)+OpenMP hpc7000 ibm1350 14 ibm1350 18 16 12 14 Время, с 10 Время, с hpc7000 8 6 4 12 10 8 6 4 2 2 0 0 8, 1 4, 2 2, 4 Число процессов, потоков 1, 8 8, 1 4, 2 2, 4 Число процессов, потоков 1, 8 Метод сопряженных градиентов MPI(2)+OpenMP hpc7000 ibm1350 8 8 7 7 6 6 5 5 Время, с Время, с Метод сопряженных градиентов MPI(1)+OpenMP 4 3 3 2 1 1 0 8, 1 4, 2 2, 4 1, 8 8, 1 Число процессов, потоков Метод простой итерации MPI(1)+OpenMP 4, 2 2, 4 1, 8 Число процессов, потоков Метод простой итерации MPI(2)+OpenMP hpc7000 ibm1350 8 8 7 7 6 6 5 5 Время, с Время, с ibm1350 4 2 0 hpc7000 4 3 ibm1350 4 3 2 2 1 1 0 hpc7000 0 8, 1 4, 2 2, 4 Число процессов, потоков 1, 8 8, 1 4, 2 2, 4 1, 8 Число процессов, потоков На задачах решения СЛАУ соотношения между временами хорошо отражают соотношение между частотами процессоров (2.66 ГГц для hpc7000 и 1.86 ГГц для ibm1350). На задаче перемножения матриц, где имеет место непоследовательный обход, картина более сложная. Здесь, в отличие от задач с последовательным обходом данных, объем данных в каждом MPI-процессе сложно предсказуемым образом влияет на скорость их обхода, что объясняет полученный разброс времен. Наилучшее соотношение между процессами и потоками на различных кластерах на задаче перемножения матриц отличается. Для задач решения СЛАУ лучшее время показывает тест с одним MPI-процессом и 8-ю потоками OpenMP. В следующих тестах используется 4 узла кластера (32 ядра). Также показано время работы теста при различных соотношениях числа процессов и потоков. Параметру I_MPI_PIN_DOMAIN задано значение node. Размер задачи: 5000×5000. Умножение матрицы на матрицу MPI(1)+OpenMP Умножение матрицы на матрицу MPI(2)+OpenMP hpc7000 ibm1350 60 80 40 Время, с Время, с 70 30 20 60 50 40 30 20 10 10 0 0 8_1 4_2 2_4 1_8 8_1 Число процессов, потоков Метод сопряженных градиентов MPI(1)+OpenMP 4_2 2_4 1_8 Число процессов, потоков Метод сопряженных градиентов MPI(2)+OpenMP hpc7000 ibm1350 14 14 12 12 10 10 Время, с Время, с ibm1350 90 50 8 6 hpc7000 ibm1350 8 6 4 4 2 2 0 0 8_1 4_2 2_4 1_8 8_1 Число процессов, потоков Метод простой итерации MPI(1)+OpenMP 4_2 2_4 1_8 Число процессов, потоков Метод простой итерации MPI(2)+OpenMP hpc7000 ibm1350 14 14 12 12 10 10 Время, с Время, с hpc7000 8 6 ibm1350 8 6 4 4 2 2 0 hpc7000 0 8_1 4_2 2_4 Число процессов, потоков 1_8 8_1 4_2 2_4 1_8 Число процессов, потоков Для задач большего размера, работавших на 4 узлах, выводы в целом аналогичны выводам для одного узла. Только уменьшилась разница времен для различных соотношений числа процессов и потоков. Более того, в отличие от результатов для одного узла, на кластере hpc7000 у некоторых задач с увеличением числа потоков имеет место замедление. 4.3. Сравнение реализаций коллективных операций в MPI Intel MPI позволяет выбирать различные алгоритмы для функций коллективных взаимодействий между процессами: MPI_Allreduce, MPI_Allgather и т.д. Было исследовано влияние выбора того или иного алгоритма на скорость выполнения программ, в которых эти алгоритмы используются. 4.3.1. Сравнение реализаций операции MPI_Allreduce Операция MPI_Allreduce используется в реализациях MPI(1) и MPI(2) метода простой итерации и метода сопряженных градиентов для распределения вычисленных коэффициентов между всеми процессами на каждой итерации. Алгоритмы MPI_Allreduce: 1. Recursive doubling algorithm 2. Rabenseifner’s algorithm 3. Reduce + Bcast algorithm 4. Topology aware Reduce + Bcast algorithm 5. Binomial gather + scatter algorithm 6. Topology aware binomial gather + scatter algorithm Количество итераций в тестах было различным в зависимости от числа процессов. В качестве результата бралось среднее время из 2 повторений. В методе сопряженных градиентов выполняется две операции MPI_Allreduce на итерацию метода, а в методе простой итерации – одна операция MPI_Allreduce на итерацию метода. Размер задачи: 1600×1600. Метод сопряженных градиентов, MPI(1) 200 180 Recursive doubling algorithm 160 Время, с 140 Rabenseifner’s algorithm 120 100 Reduce + Bcast algorithm 80 60 Topology aware Reduce + Bcast algorithm 40 Binomial gather + scatter algorithm 20 0 8 16 32 80000 160000 320000 Число процессов, итераций Topology aware binomial gather + scatter algorithm Метод сопряженных градиентов, MPI(2) 250 Recursive doubling algorithm 200 Время, с Rabenseifner’s algorithm 150 Reduce + Bcast algorithm 100 ` 50 Topology aware Reduce + Bcast algorithm 0 Binomial gather + scatter algorithm 8 16 32 80000 160000 320000 Topology aware binomial gather + scatter algorithm Число процессов, итераций Метод простой итерации, MPI(1) 180 160 Recursive doubling algorithm Время, с 140 Rabenseifner’s algorithm 120 100 Reduce + Bcast algorithm 80 60 Topology aware Reduce + Bcast algorithm 40 20 Binomial gather + scatter algorithm 0 8 16 32 80000 160000 320000 Topology aware binomial gather + scatter algorithm Число процессов, итераций Метод простой итерации, MPI(2) 180 160 Recursive doubling algorithm 140 Rabenseifner’s algorithm Время, с 120 100 Reduce + Bcast algorithm 80 ` 60 Topology aware Reduce + Bcast algorithm 40 20 Binomial gather + scatter algorithm 0 8 16 32 80000 160000 320000 Topology aware binomial gather + scatter algorithm Число процессов, итераций Алгоритм 3 (Reduce + Bcast) показывает наихудшие результаты практически во всех тестах. Наилучшие результаты у алгоритма 1 (Recursive doubling). 4.3.2. Сравнение реализаций операции MPI_Allgather Операция MPI_Allgather используется в реализации MPI(2) метода простой итерации и метода сопряженных градиентов для распределения вычисленных векторов между всеми процессами на каждой итерации. Алгоритмы MPI_Allgather: 1. Recursive doubling algorithm 2. Bruck’s algorithm 3. Ring algorithm 4. Topology aware Gatherv + Bcast algorithm Количество итераций в тестах было различным в зависимости от числа процессов. В качестве результата бралось среднее время из 2 повторений. В обоих методах выполняется одна операция MPI_Allreduce на итерацию метода. Размер задачи: 3200×3200. Метод сопряженных градиентов, MPI(2) 120 100 Время, с Recursive doubling algorithm 80 Bruckr’s algorithm 60 Ring algorithm 40 Topology aware Gatherv + Bcast algorithm 20 0 8 80000 16 32 160000 320000 Число процессов, итераций Метод простой итерации, MPI(2) 120 100 Время, с Recursive doubling algorithm 80 Bruckr’s algorithm 60 Ring algorithm 40 Topology aware Gatherv + Bcast algorithm 20 0 8 16 32 80000 160000 320000 Число процессов, итераций Алгоритм 4 (Topology aware Gatherv + Bcast) показывает наихудшие результаты практически во всех тестах (причем его результаты ухудшаются с ростом числа процессов). Наилучшие результаты у алгоритма 1 (Recursive doubling). 5. Выводы Проведенное тестирование позволяет сделать следующие выводы об особенностях программного и аппаратного обеспечения кластера hpc7000 и их влиянии на время выполнения программ численного моделирования: 1. Пропускная способность памяти на некоторых задачах ограничивает рост производительности при увеличении числа используемых ядер узла. 2. Использование MPI+OpenMP при некоторых сочетаниях числа процессов и потоков в узле может дать существенный прирост производительности по сравнению с использованием только MPI или только OpenMP. Наилучшее сочетание числа процессов и потоков зависит от задачи и параметров вычислительного узла. По сути, решающим фактором для производительности является способ разбиения данных на блоки для их независимой обработки процессами или потоками. Реализовать различные способы параллельной обработки данных в узле можно как с помощью MPI, так и с помощью OpenMP. Но при использовании простого подхода к параллельному программированию, когда каждый процесс содержит блок данных, обрабатываемый несколькими потоками, сочетание MPI+OpenMP дает большую гибкость в настройке параметров. 3. Наиболее предпочтительные значения параметра I_MPI_PIN_DOMAIN в реализации MPI+OpenMP при полной загрузке узла в большинстве случаев: node или omp. Если же используются не все ядра узла, то лучше использовать значение node, при котором задействуется максимально возможный объем кэш-памяти узла. Например, задание параметра omp привело в тестах к такому размещению 2-х процессов по 2 потока, что каждая пара потоков находится над общей кэш-памятью, а при задании параметра node операционная система распределила по одному потоку на каждую общую кэш-память узла. 4. Производительность кластера hpc7000 превосходит производительность ibm1350 на большинстве задач примерно на 30%, что соответственно разнице в тактовой частоте базовых процессоров. 5. Среди реализаций коллективных операций в Intel MPI наилучшую производительность показал Recursive doubling algorithm.