Проблемы высокопроизводительных вычислений
- стены памяти
● Проблема «стены памяти» – это резкое падение реальной производительности из-за простоев процессора, связанных с чрезвычайно неэффективной работой подсистемы памяти. ● Разница в пропускной способности памяти и процессора монотонно растёт
Решения:
● Поводить анализ пространственно-временной локализации для каждой операции чтения/запись. ● Использовать асинхронное, или отложенное, чтение/запись в память для операций с плохой локализацией ● Применять легковесные потоки на основе сопрограмм для реализации асинхронности операций.
● Пространственная локализация (Spatial Locality) определяется близостью адресов данных в памяти.
• Временная локализация (Temporal Locality) определяется частотой обращения к одним и тем же адресам
- организация «миллионных» вычислений
● При увеличении ядер производительность перестаёт расти — проблема масштабируемости ● Число ядер будет возрастать всё быстрее ● Например, в задачах гидродинамики ядра 99,99% времени занимаются обменом данными, а задачу необходимо решать в сотни раз быстрее
- проблема надежности
● Большее число ядер — выгоднее энергетически ● НО при числе ядер ~ О(106) вероятность отказоустойчивой работы всех ядер крайне мала.
Решения:
● Нужна новая парадигма независимых вычислений ● Вычисления на ядрах должны быть слабосвязанными — практически не обмениваться информацией — при миллионных вычислениях обмен будет допустимым ● Часть ядер может получать даже неверные результаты, но в целом вычисления сводятся к верному решению ● Вычисления не должны зависеть от вышедших их строя ядер и узлов ● Вычисления должны использовать иерархическую организацию памяти.
ПРОГРАММИРОВАНИЕ ЯДРА LINUX
Ядро́ (kernel) — центральная часть операционной системы (ОС), обеспечивающая приложениям координированный доступ к ресурсам компьютера, таким как процессорное время, память, внешнее аппаратное обеспечение, внешнее устройство ввода и вывода информации. Также обычно ядро предоставляет сервисы файловой системы и сетевых протоколов.
Различают понятия монолитного ядра, модульного ядра и микроядра.
Монолитное ядро предоставляет богатый набор абстракций оборудования. Все части монолитного ядра работают в одном адресном пространстве. Это такая схема операционной системы, при которой все компоненты её ядра являются составными частями одной программы, используют общие структуры данных и взаимодействуют друг с другом путём непосредственного вызова процедур.
Модульное ядро — современная, усовершенствованная модификация архитектуры монолитных ядер операционных систем. В отличие от «классических» монолитных ядер, модульные ядра, как правило, не требуют полной перекомпиляции ядра при изменении состава аппаратного обеспечения компьютера. Вместо этого модульные ядра предоставляют тот или иной механизм подгрузки модулей ядра, поддерживающих то или иное аппаратное обеспечение (например, драйверов).
Микроядро предоставляет только элементарные функции управления процессами и минимальный набор абстракций для работы с оборудованием. Бо́льшая часть работы осуществляется с помощью специальных пользовательских процессов, называемых сервисами. Решающим критерием «микроядерности» является размещение всех или почти всех драйверов и модулей в сервисных процессах, иногда с явной невозможностью загрузки любых модулей расширения в собственно микроядро, а также разработки таких расширений.
Из презентации:
• Ядро обеспечивает инфраструктуру для работы приложений и использования различных аппаратных средств • Это код низкого уровня, который взаимодействует с интерфейсами аппаратных средств, планирует и распределяет память и т.д.
• Ядро Linux – 1991 год Линус Торвальдс (Minix-подобная операционная система). Первый официальный выпуск Linux 1.0 в марте 1994. Одной из многих сильных сторон ОС, основанных на Linux - является то, что они поддерживают широкий диапазон аппаратных средств и платформ. Каждая версия, начиная с 1.2, включала поддержку новых типов процессоров и особенностей. Поддержка Hyperthreading (один физический процессор – несколько логических) появилась еще в ядре 2.4.17.
МОДУЛИ ЯДРА.
Ядро, способное поддерживать большое разнообразие аппаратных средств, будет слишком большим. Модули ядра позволяют при необходимости загрузить обеспечивающее поддержку программное обеспечение, такое как драйверы для аппаратных средств или файловые системы. Это позволяет запускать систему с небольшим ядром и затем подгружать модули по мере необходимости. Часто эта подгрузка происходит автоматически, например, при подключении устройств USB.
КОНФИГУРИРОВАНИЕ МОДУЛЕЙ
• Команды для выполнения задач загрузки – полномочия суперпользователя • Команды, выдающие информацию о модулях, – обычным пользователем.
• Воспользуйтесь командой lsmod, чтобы узнать, какие модули загружены на вашей системе в настоящее время
• Большинство из них поставляются вместе с ядром • Однако некоторые, такие как nvnet, nvidia и sata_nv от корпорации NVIDIA, содержат проприетарный код и не являются частью стандартного ядра • Таким образом, модульный подход позволяет подключать проприетарный код к ядру с открытым кодом.
• Помимо имени модуля, команда lsmod показывает также размер и число пользователей модуля. • Команда modinfo выдает информацию об одном или нескольких модулях • Эта информация содержит полный путь до файла, имя автора, лицензию, другие параметры, которые можно передать модулю, версию, зависимости и другую инфо. • Если "use count" модуля равен 0, вы можете без опасений удалить его: rmmod • Удаленный вами модуль может понадобиться вновь • Чтобы загрузить модуль, введите команду insmod, полный путь для модуля, который необходимо загрузить, и все необходимые опции. • Команда modprobe предоставляет высокоуровневый интерфейс, оперирующий именами модулей, а не именами путей файлов • Она также управляет загрузкой дополнительных модулей, от которых зависит загружаемый модуль, и позволяет не только загружать, но и удалять модули.
ЗАВИСИМОСТИ
• Если один модуль зависит от другого, при помощи команды modprobe можно управлять автоматической загрузкой нескольких модулей • Зависимости прописаны в файле modules.dep, хранящемся в подкаталоге /lib/modules соответствующего ядра (uname -r) • Этот файл вместе с несколькими map-файлами генерируется при помощи команды depmod • Команда depmod просматривает модули в подкаталоге /lib/modules текущего ядра и обновляет информацию о зависимостях
• Вы можете изменить поведение команд modprobe и depmod, скорректировав файл /etc/modules.conf • Обычно это делается для создания псевдонимов (alias) для имен модулей и определения команд, которые должны быть запущены после загрузки модуля или перед его отключением
• Вы должны также знать, что некоторые системы используют другой конфигурационный файл, modprobe.conf, и есть системы, которые хранят информацию о конфигурации модулей в каталоге /etc/modules.d • В некоторых системах вы можете встретить файлы с названием /etc/modules • Эти файлы содержат имена модулей ядра, которые должны быть загружены в ходе загрузки системы
КОНФИГУРАЦИЯ
• Цель config использует интерфейс командной строки для получения ответов многие на вопросы, касающиеся создания или обновления файла .config • После появления конфигурационных целей, использующих меню, интерфейс командной строки используется редко
• Цель menuconfig использует программу с меню-интерфейсом, построенную на базе ncurses, для создания или обновления файла .config • Вы должны только ответить на вопросы для элементов, которые хотите изменить
• Цель xconfig использует систему графического меню, основанную на QT, используемом в KDE
• Цель gconfig использует систему графического меню, основанную на QT, используемом в GNOME
• Цель oldconfig позволяет создать конфигурацию с использованием существующего файла .config
СБОРКА
• Чтобы начать сборку ядра 2.6, выполните make • Чтобы начать сборку ядра 2.4, выполните эти три команды: make dep make bzImage make modules • Первая создает файлы необходимых зависимостей. Вторая собирает ядро. И последняя собирает модули
УСТАНОВКА
• Сначала вам необходимо выполнить make modules_install для установки модулей ядра в новый подкаталог /lib/modules
• И в заключение, вам необходимо выполнить make install для установки нового ядра и стартового RAM-диска (initial RAM disk) в каталог /boot и обновления конфигурации загрузчика
• Обратите внимание, что в процессе сборки автоматически создается необходимый стартовый RAM-диск (initial RAM disk или initrd) • Если у вас возникнет необходимость создать его вручную, это можно сделать при помощи команды mkinitrd
УСТАНОВКА ИЗ ИСХОДНИКОВ (ИЗ ОПЫТА)
-докачать необходимые пакеты: kernel-package, libncurses5-dev, fakeroot.
-скачать исходники ядра, распаковать архивы (tar)
-создать символическую ссылку на директорию с исходниками (ln -s path name)
-скопировать старый конфиг (или создать новый) => make menuconfig
-fakeroot make-kpkg –initrd -jN kernel_image kernel_headers
-dpkg -i linux-headers***.deb linux-image***.deb
ОПТИМИЗАЦИЯ ЯДРА
Для оптимизации ядра надо исключить из него все лишнее, а для этого надо точно знать, какие устройства используются в системе, и какие будут использоваться в будущем. То есть нужна информация об оборудовании: процессор(ах), оперативной памяти, чипсете материнской платы, видеокарте и т.д.
Хотелось бы добавить, что для ускорения компиляции на многоядерных процессорах можно изменить переменную CONCURRENCY_LEVEL, это позволяет запускать несколько процессов компиляции.
CONCURRENCY_LEVEL=5 make-kpkg --initrd kernel_image …
Цифра 5 означает запуск 5-ти одновременных компиляций. ОЧЕНЬ МАЛО. ДОБАВИТЬ!!!