![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
В: Проблема эффективности кода для систем с симметричной многопроцессорностью и для гибридных систем. Подходы к её решению
О: Симметричная мультипроцессорность (SMP) — архитектура многопроцессорных компьютеров, в которой два или более одинаковых процессора сравнимой производительности подключаются единообразно к общей памяти (и периферийным устройствам) и выполняют одни и те же функции. В этом классе систем процессоры тесно связаны друг с другом через общую шину и имеют равный доступ ко всем ресурсам вычислительной системы (памяти и устройствам ввода-вывода) и управляются все одной копией операционной системы. SMP — простой и экономически выгодный способ масштабирования вычислительной системы. Однопроцессорные и многопроцессорные системы нуждаются в различных программных методах для достижения максимального быстродействия. Программы, оптимизированные для однопроцессорных систем не задействуют сильные стороны SMP-систем и теряют в производительности (справедливо и обратное). И все же программы, запущенные на SMP-системах, получают незначительный прирост производительности, даже если они были написаны для однопроцессорных систем. Это связано с тем, что аппаратные прерывания, обычно приостанавливающие выполнение программы для их обработки ядром, могут обрабатываться на свободном процессоре. Также поддержка SMP должна быть встроена в операционную систему, иначе дополнительные процессоры будут бездействовать, и система будет работать как однопроцессорная. В SMP-системах возникает проблема согласования кэша. Каждый процессор имеет свой кэш, но все они работают с общей основной памятью. Из-за этого может возникнуть подобная ситуация: процессор изменяет значение переменной в своем кэше, а другой процессор запрашивает эту переменную из основной памяти. И он получит старое значение переменной. Или, например, подсистема ввода-вывода записывает в основную память новое значение переменной, а в кэш-памяти процессора по-прежнему остается старое. Разрешение этой проблемы возложено на протокол согласования кэшей, который призван обеспечить согласованность кэшей всех процессоров и основной памяти без потери общей производительности. Другим подходом является введение общего кэша для всех процессоров. Для решения проблемы эффективности кода также применяют параллелизм на уровне инструкций Возьмем простенькую программу: a = 1 b = 2 c = a + b Первые две инструкции вполне можно выполнять параллельно, только третья от них зависит. А значит — всю программу можно выполнить за два шага, а не за три. Процессоры с таким функционалом называются суперскалярными. Параллелизм на уровне данных реализуется с помощью векторных инструкций. Пример кода, который успешно векторизуется компилятором: for (int i = 0; i < n; i++) c[i] = a[i] * b[i] + a[i]; --------------------------------------------------------------------------------------------- Увеличение потока обращений процессора к памяти: • Многофазность операций ввода-вывода для порождения множества параллельных обращений к памяти: o выставление чтения (read issue) o передача (yield) o завершение чтения (read complete)
• Загрузка глобально-адресуемых данных может проводиться отдельными программными потоками или аппаратно-реализованными алгоритмами, но механизм внесёт задержки при обращении к данным на том же узле, то есть задержки должны быть допустимыми
• МЕТОД МНОГОФАЗНОГО ЧТЕНИЯ Реализация механизма многофазного чтения — через легковесные потоки, не требующие переключения контекста процессора.Один из методов введения легковесных потоков — применение сопрограмм (coroutines).
Предлагаемые принципы:
• Исходный̆ код должен оставаться на высоком уровне абстракции • Исходный̆ код больше не должен зависеть от архитектуры, как сейчас он не зависит от системы команд • Исходный̆ код должен не компилироваться, а транслироваться на многопоточную и гибридную архитектуру — C, OpenCL,... — используя формальные методы и затем потом компилироваться РЕШЕНИЕ — трансляторы с высокопроизводительных языков на языки программирования и библиотеки низкого уровня
|