О ПРОИЗВОДИТЕЛЬНОСТИ ВЫЧИСЛИТЕЛЬНЫХ КЛАСТЕРОВ Л.А. Крукиер, А.А. Букатов, Г.В. Муратова, О.В. Дацюк, В.Н. Дацюк Южный федеральный университет, ЮГИНФО, г. Ростов-на-Дону Тел.: (863) 297-50-93, e-mail: dolv@sfedu.ru Господствующей тенденцией при создании высокопроизводительных вычислительных систем стали кластерные технологии, которые позволяют из стандартных серверных системных блоков создавать вычислительные системы практически неограниченной вычислительной мощности. Эти технологии сделали суперкомпьютерные технологии общедоступными, что привело к широкому распространению вычислительных кластеров. Теперь практически каждый факультет, или даже лаборатория стремятся иметь свой кластер, при этом, зачастую, не задумываясь о том, что это, все-таки, достаточно сложное оборудование и организация его эффективной эксплуатации требует значительных усилий и квалификации персонала. Зачастую ошибки допускаются уже на стадии проектирования таких систем, когда они заказываются без учета специфики тех задач, которые будут решаться на вычислительных кластерах. Очевидно, что производительность таких систем зависит от производительности вычислительных узлов и числа узлов в системе. Сейчас в мире доминирует подход, когда стараются поднять общую производительность вычислительных кластеров за счет увеличения производительности узлов, вставляя в каждый узел все больше и больше многоядерных процессоров. Такой подход выглядит очень привлекательным, поскольку позволяет делать мощные вычислительные системы весьма компактными. Однако предположение о том, что общая производительность вычислительной системы будет равняться произведению количества вычислительных узлов на производительность одного вычислительного узла, зачастую не соответствует действительности. Существует два способа использования многоядерных узлов: • Запуск на вычислительном узле n процессов, где n количество ядер. Это могут быть как процессы, относящиеся к одной программе, так и процессы различных программ. • Запуск на узле одного n-нитевого процесса. Такая программа легко может быть создана с помощью технологии OpenMP. Сравним, как масштабируются вычислительные системы различной архитектуры на примере простейшей задачи перемножения двух квадратных матриц. Такая тестовая задача не является безукоризненно строгой, поскольку в ней задействованы не все виды арифметических операций, однако она очень удобна, так как прекрасно распараллеливается, хорошо известно количество операций, которое нужно выполнить для решения задачи. Покажем, как масштабируется эта задача на кластере INFINI ЮГИНФО ЮФУ, состоящего из однопроцессорных одноядерных узлов с процессором Intel Pentium 4. Распараллеливание выполнено с использованием технологии MPI. На рис. 1 показана зависимость производительности системы от числа вычислительных узлов. Рис. 1. Зависимость производительности кластера INFINI от числа узлов на задаче перемножения матриц На рис. 2 показана масштабируемость 16-ти ядерного вычислительного узла кластера ТТИ ЮФУ, состоящего из четырех 4-х-ядерных процессоров AMD Opteron. Для распараллеливания задачи использовалась технология OpenMP. Рис. 2. Зависимость производительности узла кластера ТТИ от числа ядер на задаче перемножения матриц Сравнение рис. 1 и 2 однозначно указывает на гораздо лучшую масштабируемость по узлам кластера, чем по ядрам внутри узла. Более того, ни при каком количестве ядер производительность узла не превысила 4-х кратной производительности ядра. На первый взгляд ситуация выглядит парадоксальной – взаимодействие независимых узлов оказывается более эффективным, чем взаимодействие процессоров внутри одного узла. На самом деле, ни чего удивительного в этом нет. Если вспомнить историю развития многопроцессорной техники, то вычислительные системы с распределенной памятью возникли как альтернатива симметричным мультипроцессорным системам из-за непреодолимых проблем с масштабируемостью у последних. Сейчас, когда кластерные системы собираются из вычислительных узлов, которые сами являются симметричными мультипроцессорными системами, все ранее известные проблемы возникают вновь на новом уровне. Тем не менее, ситуация с масштабируемостью многоядерных узлов не является совершенно безнадежной. Привлечем для решения нашей задачи библиотечную подпрограмму перемножения матриц из высокооптимизированной библиотеки BLAS (базовой библиотеки линейной алгебры), которые поставляются ведущими производителями процессоров для своих архитектур. На рис. 3 показан рост производительности вычислительного узла кластера ТТИ при увеличении числа используемых ядер. Рост стал практически линейный, и производительность каждого ядра многократно возросла. Рис. 3. Зависимость производительности узла кластера ТТИ от числа ядер на задаче перемножения матриц при использовании подпрограммы из высокооптимизированной библиотеки Произошло это благодаря тому, что с помощью изощренных технологий расслоения циклов, в оптимизированных подпрограммах значительно уменьшено количество обращений непосредственно к оперативной памяти и увеличена доля обращений к высокоскоростной кэш-памяти. Это значительно разгрузило общую шину памяти и повысило эффективность использования процессоров. Однако широкое использование таких технологий в обычных пользовательских программах вряд ли возможно, поскольку сильно усложняет написание программ. Единственным выходом из ситуации является широкое использование оптимизированных библиотек во всех случаях, когда это возможно. Во всех остальных случаях придется мириться с тем, что многоядерные узлы будут работать с весьма низкой эффективностью. Зачастую будет оказываться так, что наибольшая эффективность будет достигаться при использовании только части ядер. Подобный рост производительности при использовании оптимизированных библиотек произошел и на кластере INFINI. На рис. 4 показана зависимость производительности от числа узлов кластера INFINI на задаче перемножения матриц при использовании оптимизированных библиотек. Рис. 4. Зависимость производительности кластера INFINI от числа узлов на задаче перемножения матриц при использовании оптимизированных библиотек