- •Материалы к вводной лекции
- •1)В чём отличие операционной системы и системного программного обеспечения?
- •2)Зачем нужны такие стандарты как posix?
- •Материалы к лекции № 2. Основы работы в Linux. Часть 1
- •Материалы к лекции № 3. Основы работы в Linux. Часть 2
- •Материалы к лекции № 4. Компиляторы и средства разработки gcc
- •16) Какие стандартные типы оптимизаций применяются в большинстве компиляторов?
- •Материалы к лекции № 6. Ядерная физика для программистов, или Ядро Linux. (Сжато)
- •29) Зачем нужны модули ядра Linux?
- •30) В чём отличия модуля от программы?
- •49) Чем компиляция модулей отличается от компиляции программ?
- •63) Больший номер – позже запущен – почему это важно
- •68) Что дает системе cow?
- •Запуск процессов с помощью вызова exec()
- •72) Какие области памяти остаются после завершённого процесса?
Материалы к лекции № 4. Компиляторы и средства разработки gcc
13) Опция /O2 всегда увеличивает производительность, но может увеличить размер кода (да/нет)?
Да.
14) Вопросник: какие ключи где лучше использовать
Разрабатываю 3д игру, важна производительность: -02 или -03(оптимизированный код)
FTP-сервер: - 01(маленький код)
Анализ программы с помощью VTune Performance Analyzer: -Zi -02 (включить генерацию информацию по ошибкам)
15)Я разрабатываю трехмерную модель. В моем приложении используются переменные с плавающей запятой только одинарной точности. Какую функцию оптимизации точности вычислений с плавающей запятой я могу использовать, чтобы улучшить производительность приложения ?
– A) -Qlong_double
– B) -Qprec_div
– C) -Qpc32
Qprec_div, т.к. она отключает оптимизацию division-to-multiplication (скорость падает, увеличивается точность за счет использования деления, но все незначительно)
В данном приложении важна скорость вычислений, а не точность.
Qpc32 — задет точность чисел (32 — минимум).
Qlong_double — увеличивает точность до 80 бит.
*Описание функции: только для систем на базе архитектуры IA-32 . По умолчанию компилятор Intel® преобразовывает операции деления в обратные операции умножения, что снижает точность, но повышает скорость работы. Данная функция отключает оптимизацию типа division-to-multiplication вычислений с плавающей запятой.
16) Какие стандартные типы оптимизаций применяются в большинстве компиляторов?
Оптимизации под типы приложений (оптимизация размера исполняемого кода, времени выполнения без ущерба для его размера и только времени выполнения)
Процессорные оптимизации (планирование инструкций, оптимизация под конкретный процессор, автоматическая и ручная диспетчеризация процессоров) (код оптим. под опред. проц, на других не будет фурычить)
Дополнительные оптимизации (управление точностью вычислений с плавающей точкой, математические библиотеки стандартных функций, короткими векторами библиотек(если считается синус через массив от целого вектора) )
*Про ключи:
о0 — без оптимизации, для отладки и быстрой компиляции
о1 — оптимизация скорости пока есть благоприятствование размеру кода — в большинстве случаев — самый наименьший размер кода; может повысить скорость кода с множеством разветвлений, а также сократить время выполнения, устранив код в циклов; для приложений с высокими требованиями по размеру и размещению кода (БД, множественные ветвления без циклов)
о2 — стандартная оптимизация; самый быстрый код но размера больше о1, не агрессивная, прим. для приложений с целочисленными операциями
о3 — оптимизация высокого уровня (HLO), агрессивная, иногда код работает медленнее чем о2, иногда ломает программу, может увеличить время компиляции; прим. для программ с числами с плавающей запятой и большими массивами данных, с циклами.
17) Зачем нужна опция отключения оптимизации кода?
Для проведения отладки и быстрой компиляции. Рекомендуется на начальных стадиях разработки. Компиляция убыстряется, не возникает лишних ошибок.
18) Какой уровень оптимизации использует по умолчанию компилятор, совместимый с GCC?
о2.
19) Какие недостатки у агрессивной оптимизации кода?
Она не просто так названа «агрессивной», программа может сломаться или могут появиться баги, программа может работать не так, как изначально задумывалось, также увеличивается размер исполнительного файла и следовательно его будет намного тяжелее отладить, может существенно понизить производительность. Производительность может остаться прежней, но код может замедлиться в сравнении с о2 и время компиляции увеличиться.
20) Зачем создавать код, пригодный для запуска только на определённом семействе процессоров?
Получаем код под инструкции определенного процессора, следовательно, выигрываем в производительности. Но только для процессоров которые поддерживают инструкции с помощью которых провели оптимизацию. Чтобы использовать все особенности процессора.
21) Зачем нужна опция уменьшающая точность проводимых вычислений?
Высокая точность замедляет работу приложения. Такая оптимизация нужна для увеличения производительности. Чем больше точность тем возрастает время выполнения различных процессов.
Введение в векторизацию кода.
22)Как векторизовать цикл for (i = 1; i <= N; i ++) {a[i] = a[i-1] + 1;}
Данный цикл нельзя векторизовать, ячейка a[i] получается на основе предыдущей (a[i-1]), по этой причине мы не можем обрабатывать данные параллельно. Векторизация требует независимость итераций.
23) Как активизировать HLO? – А) HLO включается по умолчанию в компиляторе – Б) -O3 – В) HLO включается по умолчанию с компилятором Itanium – Г) -O2
Судя по примеру из лекций: «Пример: gcc -O3 superprog.cpp». Ответ Б) о3.
Проблемы высокопроизводительных вычислений
24) Какую из опций следует использовать для осуществления встраивания функции между исходными файлами? A) -prof_gen B) -ip C) -prof_use D) –ipo
-ipo, т.к. межпроцедурная оптимизация ipo осуществляет многофайловое встраивание (-ip в одном файле)
25) Какие системные методы оптимизации приложений сейчас применяются?
1) Векторизация — увеличивает скорость выполнения кода, используя расширенные инструкции процессора (ограничения: треб. независимость итераций, устранение противоречий памяти, из-за исп. спец. инструкций процессора машинный код будет работать только на процессорах поддерживающих эти инструкции — SIMD)
2) HLO (оптимизация высокого уровня) — увеличивает скорость работы приложения. Подбирает алгоритм с максимальным количеством обращений к кеш-памяти. (ограничения: для циклов те же, не всегда увеличит скорость работы приложения)
3) IPO, QIPO (межпроцедурная оптимизация: для одного исполняемого файла, для нескольких) – оптимизация функций внутри файлов, поддерживает многофайловое встраивание, замену кода (т.е. размещение функций), а также размещ.данных. (ограничения: может увеличить размер кода, компиляция может занимать много времени)
4) PGO (Ведомая профилем оптимизация, компиляция с обратной связью, динамическая, кольцевая) – Предоставляет компилятору информацию о динамическом управлении программой для выполнения наилучших вариантов оптимизаций, используются различные статистические и вероятностные методы. (приложения будут работать быстрее при типичной нагрузке — не для исключительных случаев, лучше использовать в приложениях со множеством функций, вызовов и ветвлений, не связанных с циклами — БД, СППР, МCAD)
26) Почему важно, чтобы исполняемый код умещался в кэш-памяти?
Кэш-память – самая быстрая память процессора, если исполняемый код полностью не умещается в ней, то тратится дополнительное время на выгрузку выполненного кода и загрузку невыполненного, что уменьшает быстродействие.
