Автор книги: Алла Владова
Жанр: Техническая литература, Наука и Образование
сообщить о неприемлемом содержимом
Текущая страница: 1 (всего у книги 5 страниц) [доступный отрывок для чтения: 1 страниц]
А. Ю. Владова
Разработка масштабируемых программ для многоядерных архитектур
Введение
В лабораторном практикуме рассматривается круг вопросов, связанных с основами разработки многопоточных приложений, элементами их инструментированной отладки и тестирования. Целью лабораторного практикума является развитие у студентов-программистов навыков разработки масштабируемых многопоточных программ. Для достижения поставленной цели рассмотрены следующие задачи:
– основы многоядерной архитектуры;
– проектирование многопоточных программ с использованием различных инструментальных средств;
– причины плохой масштабируемости программ;
– теоретическая и практическая оценка ускорения и масштабируемости программ;
– элементы оптимизации.
Для демонстрации влияния пропускной способности шины на плохую масштабируемость программ разработана лабораторная работа № 1, в которой описаны реализация последовательного и многопоточного приложений, демонстрирующих проблему, предварительная и практическая оценки ускорения и масштабируемости, оптимизация программы для повышения доли параллельного кода, а также инструментированный анализ загрузки шины.
Влияние размера пула потоков на масштабируемость программ раскрывается в лабораторной работе № 2, в которой приводятся причины использования пула потоков, математическое описание системы, анализ предполагаемых проблем при оптимизации приложения, теоретическая и практическая оценки ускорения и масштабируемости, даны рекомендации по выбору размера пула и очереди.
В качестве языков программирования, в которых разрабатывались и отлаживались приведенные примеры, выбраны С++ и С#, как мощные современные инструменты создания многопоточных приложений. Все теоретические сведения подкреплены примерами и графиками, которые могут служить базой при разработке полноценного программного обеспечения в данной области.
Отчет по каждой лабораторной работе должен включать титульный лист, постановку задачи, теоретические сведения, иерархическую схему процедур, текст основных процедур, результаты работы и выводы.
1 Предпосылки создания многоядерной архитектуры
Гонка тактовых частот, продолжавшаяся на протяжении многих лет уходит в прошлое, так как развитие физики полупроводников, следствием которого стало увеличение числа логических элементов на единицу площади, подчиняющееся закону Гордона Мура, провоцирует ряд проблем, таких как перегрев и физическое ограничение плотности транзисторов. Проблема перегрева транзисторов в современных процессорах стоит очень остро. Сами транзисторы становятся все меньше, но при этом с ростом тактовой частоты процессора они потребляют больше мощности и выделяют больше тепла. До бесконечности это продолжаться не может, поскольку приводит к быстрому обгоранию соответствующего контакта разъема, нагреву и сколам процессора, разряду батарей питания. Суть проблемы заключается в том, что современные процессоры потребляют такую мощность, что при питании их стабилизаторов от шины +5В ток превосходит разумные пределы (мощность равна произведению тока на напряжение, поэтому, чем ниже напряжение, тем выше ток при той же мощности). По всей видимости, масштабирование процессоров по тактовой частоте оказалось не столь простой задачей, как предполагалось, и потому при сегодняшних технологических нормах производства процессоров и малоэффективных воздушных системах охлаждения добиться линейного масштабирования тактовой частоты процессоров не удаётся.
Таким образом, производители столкнулись с проблемой достижения предела прогнозируемой скорости роста тактовой частоты – небольшого зазора оптимизации исполнения в пределах одного ядра, за которым рост сложности становится неоправдан и для дальнейшего наращивания размеров кэш-памяти процессоров остается лишь небольшой зазор для развития [1]. Осознав, что увеличение прежними темпами тактовых частот процессоров не представляется невозможным, нужно было искать принципиально иные технологии увеличения производительности процессоров. Достигая пределов роста скорости и уровня охлаждения, производители процессоров пришли к одному и тому же решению: объединить в одной микросхеме два процессорных ядра. Поэтому перспективным направлением для дальнейшего развития видится многоядерная и многопотоковая архитектура процессоров.
2 Преимущества многоядерной архитектуры процессоров
Еще несколько лет назад в силу технологических ограничений все многопотоковые процессоры строились на базе одного ядра, и такая многопотоковость была названа «одновременной» – Simultaneous Multi Threading (SMT), но с появлением многоядерных процессоров появился альтернативный тип многопотоковости – Chip Multi Processor (CMP).
Многоядерная архитектура – это архитектура, в составе которой находится один физический процессор, содержащий основные логические узлы нескольких процессоров.
Преимущество такого процессора над одноядерным проявляется, прежде всего, при работе с многопоточными приложениями. Многопоточные задачи работают быстрее на двухядерных процессорах, потому что операционная система может распределять программные потоки отдельно по каждому ядру, в то время как на одноядерных процессорах задачи меняются по мере выполнения, то есть по очереди. Применение этой технологии позволит увеличить производительность процессоров нового поколения и одновременно избежать роста потребления энергии, которое накладывает ограничения на развитие одноядерных процессоров. Поскольку производительность памяти увеличивается медленнее, чем скорость процессоров, то чем выше частота процессора, тем больше потеря производительности при обращении к памяти. Два ядра получаются предпочтительней, чем одно, так как в этом случае легче обеспечить процессор данными для обработки.
Такая архитектура предоставляет одну из возможностей преодоления врожденной слабости современных процессоров – «бутылочного горла» архитектуры фон Неймана в соответствии с рисунком 1.
Рисунок 1 – Демонстрация «узкого горла» архитектуры фон Неймана на примере четырехпроцессорной архитектуры Intel Xeon
Впервые публично об этом недостатке сказал создатель Fortran Джон Бэкус на церемонии вручения ему премии имени Тьюринга в 1977 году: «Что такое компьютер по фон Нейману? Когда 30 лет назад Джон фон Нейман и другие предложили свою оригинальную архитектуру, идея показалась элегантной, практичной и позволяющей упростить решение целого ряда инженерных и программистских задач. И хотя за прошедшее время условия, существовавшие на момент ее публикации радикально изменились, мы отождествляем наши представления о компьютерах с этой старой концепций. В простейшем изложении фон-неймановский компьютер состоит из трех частей: это центральный процессор, память и соединяющий их канал, который служит для обмена данными между CPU и памятью, причем маленькими порциями – по одному слову.
Я предлагаю назвать этот канал «бутылочным горлом фон Неймана». Наверняка должно быть менее примитивное решение, чем перекачивание огромного количества данных через «узкое бутылочное горло». Такой канал не только создает проблему для трафика, но еще и является «интеллектуальным бутылочным горлом», которое навязывает программистам «пословное» мышление, не позволяя рассуждать в более высоких концептуальных категориях» [1].
С момента произнесения Бэкусом его речи в программировании произошли заметные сдвиги, появились функциональные и объектно-ориентированные технологии, и с их помощью удалось преодолеть то, что Бэкус называл «интеллектуальным фон-неймановским бутылочным горлом». Однако архитектурная первопричина данного явления, врожденная болезнь канала между памятью и процессором – его ограниченная пропускная способность – не исчезла, несмотря на прогресс в области технологии за прошедшие с тех пор 30 лет. С годами эта проблема постоянно усугубляется, поскольку скорость работы памяти растет гораздо медленнее, чем производительность процессоров, и разрыв между ними становится все больше .
Фон-неймановская архитектура компьютера не является единственно возможной. С точки зрения организации обмена командами между процессором и памятью все компьютеры можно разделить на четыре класса (классификация Флинна) [11]:
SISD (Single Instruction Single Data) – «один поток команд, один поток данных»»;
SIMD (Single Instruction Multiply Data) – один поток команд, много потоков данных;
MISD (Multiple Instruction Single Data) – много потоков команд, один поток данных;
MIMD (Multiple Instruction Multiple Data) – много потоков команд, много потоков данных.
Из этой классификации видно, что фон-неймановская машина является частным случаем, попадающим в категорию SISD. Возможные усовершенствования в рамках архитектуры SISD ограничиваются включением в нее конвейеров и других дополнительных функциональных узлов, а также использованием разных методов кэширования. Две другие категории архитектур (SIMD, в которую входят векторные процессоры, и конвейерные архитектуры MISD) были реализованы в нескольких проектах, но не стали массовыми. Если оставаться в рамках этой классификации, то единственной возможностью преодоления ограничений «бутылочного горла» остается развитие архитектур класса MIMD. В их рамках обнаруживается множество подходов: это могут быть и различные параллельные и кластерные архитектуры, и многопотоковые процессоры.
Широкое распространение мультиядерных технологий – это следующий этап развития компьютерных технологий, который преобразит существующую вычислительную среду. Основные выгоды, получаемые от внедрения мультиядерных технологий представляются следующими.
Для коммерческого рынка – корпоративные IT-системы получат значительное увеличение производительности, используя оптимизированные мультипоточные приложения. Внедрение новых процессоров позволит создавать более сложные системы, с минимальными вложениями, опираясь на существующую инфраструктуру. Кроме того, такие системы отличаются простым управлением, упрощенным менеджментом, низкой совокупной стоимостью владения, высокой эффективностью и производительностью.
Для бизнеса и конечных пользователей – мультиядерная технология AMD способна существенно увеличить количество выполняемой работы в задачах требующих интенсивных вычислений, например таких, как мультимедиа, создание цифрового контента, обеспечения безопасности и других.
Разработчики и тестеры программного обеспечения озадачены созданием новых алгоритмов, обрабатывающих данные одновременно. [2].
Конечно, говорить о том, что двухядерные процессоры в два раза производительнее одноядерных, не приходится. Причина заключается в том, что для реализации параллельного выполнения двух потоков необходимо, чтобы эти потоки были полностью или частично независимы друг от друга, а кроме того, чтобы операционная система и само приложение поддерживали на программном уровне возможность распараллеливания задач. И в связи с этим стоит подчеркнуть, что сегодня далеко не все приложения удовлетворяют этим требованиям и потому не смогут получить выигрыша от использования двухядерных процессоров. Впрочем, уже сегодня существует немало приложений, которые оптимизированы для выполнения в многопроцессорной среде, и такие приложения, несомненно, позволят использовать преимущества двухядерного процессора. Кроме того, она позволяет выявить преимущества при одновременной работе с несколькими приложениями, что является типичной ситуацией на сегодняшний день.
2.1 Архитектура Intel Core
Рассмотрим технологию Intel Core на примере двухядерного процессора Presler, выполненного по 65-нанометровому технологическому процессу, каждое ядро которого имеет собственный кэш второго уровня L2 объемом 2 Мбайт. Он поддерживает 64-битное расширение памяти Intel EM64T и технологию Executable Disable Bit, с отключенной на аппаратном уровне технологии HyperThreading.
В отличие от двухядерных процессоров Pentium Extreme Edition и Pentium D в процессоре Presler два ядра размещены на разных кристаллах, то есть это будут два физически разделенных кристалла в одной упаковке в соответствии с рисунком 2. Такой подход к организации двухядерной архитектуры предоставляет достаточно гибкие возможности для отбраковки кристаллов, позволяя увеличить долю выхода годных двухядерных процессоров, а к тому же (и скорее всего, в этом главная причина) это позволяет одновременно с двухядерным процессором Presler выпускать и одноядерный аналог, причем кристаллы для обоих процессоров могут «нарезаться» из одних и тех же пластин [3].
Рисунок 2 – Структурная схема процессора Presler
Микроархитектура Intel Core, реализованная в процессорах Intel позволяет улучшить соотношение производительности и энергопотребления. Характеристики новой микроархитектуры Intel® Core™:
Технология Intel® Wide Dynamic Execution позволяет обрабатывать больше команд за такт процессора, повышая эффективность выполнения приложений и сокращая энергопотребление. Каждое ядро процессора, поддерживающего эту технологию, может выполнять до четырех инструкций одновременно, используя эффективный конвейер из 14 стадий.
Технология Intel® Intelligent Power Capability делает энергопотребление более низким, активируя отдельные логические подсистемы только по мере необходимости.
Технология Intel® Advanced Smart Cache включает совместно используемую кэш-память 2-го уровня, которая снижает энергопотребление, сводя к минимуму обмен данными с памятью, и повышает производительность, позволяя одному из ядер процессора использовать всю кэш-память при бездействии другого ядра.
Технология Intel® Smart Memory Access повышает производительность системы, сокращая время отклика памяти и оптимизируя, таким образом, использование пропускной способности подсистемы памяти.
Технология Intel® Advanced Digital Media Boost позволяет обрабатывать все 128-разрядные команды SSE, SSE2 и SSE3, широко используемые в мультимедийных и графических приложениях, за один такт, что удваивает скорость их выполнения [4].
2.2 Многоядерная технология AMD
Имеющаяся процессорная архитектура AMD позволила интегрировать на тот же кристалл второе ядро при переходе на технологический процесс 90 нм. В процессорах архитектуры AMD64 с двумя ядрами дублированию подвергнуто само вычислительное ядро и кэш-память, в то время как контроллер памяти и контроллер HyperTransport остаются в двухядерных процессорах в неизменном виде. В этой связи ключевое значение начинает играть блок System Request Interface (SRI), на который возлагается обязанность арбитража потоков команд и данных между двумя ядрами. Процессорные ядра взаимодействуют с интегрированным контроллером памяти и контроллером шины HyperTransport через Crossbar Switch, который, по сути, является арбитром шин контроллера памяти и HyperTransport в соответствии с рисунком 3.
Рисунок 3 – Архитектура процессора AMD Athlon 64 X2 Dual-Core
Особо стоит отметить тот факт, что хотя каждое ядро имеет собственный кэш L2, для него доступны данные и «соседнего» кэша – второго уровня. При этом процессор поддерживает когерентность хранимой в этой «быстрой памяти» информации. Такой подход исключает повторное обращение к оперативной памяти за данными, уже загруженными в кэш одного из ядер, что позволяет уменьшить время ожидания и снизить нагрузку на шину памяти. Кстати говоря, наличие интегрированного на кристалле контроллера памяти также весьма удачно укладывается в концепцию двухъядерности. Ведь в этом случае ядра общаются прямо с контроллером памяти, не имея посредника в лице контроллера системной шины. В своей же практической реализации новые двухъядерные процессоры компании Athlon 64 X2 Dual-Core изготавливаются на основе ядер Toledo и Manchester, для которых одноядерными аналогами являются соответственно ядра San Diego и Venice. Это, в свою очередь, означает, что процессоры выполнены по 90-нанометровому технологическому процессу с применением технологии SOI (Silicon On Insulator) и обладают поддержкой набора инструкций SSE3, а также усовершенствованным контроллером памяти, поддерживающим работу модулей DDR SDRAM PC1600/2100/2700/3200, в том числе и в двухканальном режиме. Различие ядер Toledo и Manchester, как и San Diego и Venice, состоит в размере кэша второго уровня. Так, в первом случае кэш L2 составляет 2Ѕ1024 Мбайт, а во втором – 2Ѕ512 Мбайт. При этом тактовая частота процессоров этой линейки равна 2400, 2200 и 2000 МГц, т.е. при переходе на двухъядерную архитектуру не пришлось жертвовать скоростью объединяемых в тандем ядер.
Двухядерные процессоры семейства AMD Athlon 64 X2 Dual-Core, как и семейство Intel Pentium D, ориентированы на использование в графических станциях для работы с 3D-графикой и на универсальные рабочие станции для пользования офисными приложениями, приложениями создания контента, обработке цифровых фотографий и т.д.
Таким образом, как утверждают многие эксперты, в течение ближайших двух лет почти все микропроцессоры, устанавливаемые в настольных ПК, рабочих станциях и серверах, будут иметь два ядра или даже больше. И надо сказать, что основания для таких прогнозов весьма весомые. Производительность двухядерного процессора может быть почти в два раза выше, чем у одноядерного, а его стоимость будет ниже, чем у двух процессоров, имеющих по одному ядру. При размещении двух процессоров на одном кристалле скорость обмена информацией между ними возрастает, а совместное использование кэш-памяти может еще более повысить эффективность обработки данных. Кроме того, двухядерные процессоры занимают меньше места, потребляют меньше энергии и рассеивают меньше тепла, нежели отдельные процессоры. Добавим еще, что, по имеющейся информации, процессоры на базе нескольких ядер хорошо подходят для обработки транзакций, а также для обслуживания баз данных и научных применений [5,8].
3 Особенности проектирования и написания многопоточных программ
Активное внедрение многоядерных систем подразумевает существенное изменение стиля программирования: разработчики будут вынуждены использовать параллельные потоки, порождение и обработку асинхронных событий и др. Иными словами, новая аппаратная архитектура требует смены программной парадигмы – перехода от последовательного стиля программирования к параллельному. Сегодня только небольшая часть программного обеспечения может эффективно выполняться на многоядерных процессорах, что подтверждают результаты тестов – синтетических и предназначенных для конкретных классов приложений (см., например, www.3dnews.ru/cpu/dualcore-cpu/index03.htm). Реальный рост производительности дают лишь программы, оптимизированные под многопоточность, такие как Adobe Premiere Pro 1.5, 3DMax и др. Остаются актуальными задачи разработки и внедрения драйверов устройств, поддерживающих многопоточность [6].
При переходе с одноядерных процессоров на многоядерные приходится принимать во внимание проблему последовательного выполнения. Что это означает применительно к многоядерной системе? В ней выполнение считается последовательным, если в какой-то момент одно или более ядер не могут выполнять код одновременно с другими ядрами. Такая ситуация может возникнуть по разным причинам [1]: блокировка при доступе к ресурсам, необходимость синхронизации процессов или потоков на ядрах, поддержка когерентности кэш-памяти, неравномерность загрузки.
Блокировки возникают из-за невозможности (например, в момент «сбора мусора») одновременного доступа приложений на разных ядрах к жесткому диску, к устройствам ввода/вывода или данным приложений. Очень часто параллельные процессы, выполняемые на разных ядрах, нужно синхронизировать в определенные моменты. Например, приложение на одном из ядер должно использовать промежуточные данные, которые получает приложение (поток, процесс) на другом ядре. Первое приложение не может продолжить работу до получения этих данных, то есть находится в состоянии ожидания. В такой ситуации неизбежны накладные расходы на синхронизацию приложений (процессов, потоков), выполняемых на разных ядрах. В свою очередь, это обусловливает снижение эффективности параллельной работы, что находит отражение в сетевом законе Амдала. Возникает необходимость в поддержке когерентности (согласованности) кэш-памяти для всех ядер при использовании разделяемой памяти.
Можно упомянуть об исследованиях Intel, посвященных динамическому регулированию интенсивности выполнения инструкций (energy per instruction, EPI) в зависимости от степени параллелизма реализации программного обеспечения [2]. Специалисты корпорации опытным путем показали эффективность регулирования тактовой частоты асимметричной многопроцессорной системы в зависимости от активности вычислительных ядер.
Внимание! Это не конец книги.
Если начало книги вам понравилось, то полную версию можно приобрести у нашего партнёра - распространителя легального контента. Поддержите автора!Правообладателям!
Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.Читателям!
Оплатили, но не знаете что делать дальше?