[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по настройке производительности


Приемы оптимизации с помощью компилятора

Средства и приемы оптимизации исходного кода можно разбить на следующие три основные категории:

Помимо вышеперечисленных средств, можно воспользоваться программой реструктуризации объектного кода fdpr. Программа fdpr описана в разделе Реструктуризация исполняемых программ с помощью программы fdpr.

Компиляция с оптимизацией (-O, -O2, -O3, -qstrict, -qhot, -qipa)

При создании эффективной программы прежде всего необходимо воспользоваться встроенными средствами оптимизации компилятора. Это повысит быстродействие программы и сократит объем дальнейших операций по настройке.

Рекомендации

Ниже приведены некоторые рекомендации:

Опция -qipa активизирует или настраивает класс оптимизирующих процедур, называемых межпроцедурным анализом. У опции -qipa есть несколько подопций, описанных в руководстве по компилятору. Ее можно применять двумя способами:

Оптимизация с помощью компилятора дает следующие преимущества:

Оптимизация ветвления
Код программы реорганизуется с целью минимизировать операции перехода и объединить различные блоки кода.

Перемещение кода
Если переменные, используемые в цикле, не изменяются в его теле, то такие переменные могут быть вычислены заранее вне цикла.

Исключение повторных вычислений
Если в выражении одно и то же значение вычисляется несколько раз, то дублирование можно исключить.

Применение констант
На основе констант, применяемых в выражении, генерируются новые константы. При этом выполняются некоторые неявные преобразования целых и вещественных типов.

Исключение лишнего кода
Исключается недостижимый или не оказывающий влияния на дальнейшие вычисления код.

Исключение лишних операций сохранения
Исключаются операции по сохранению не используемых в дальнейшем значений. Например, если между двумя операциями сохранения значения нет операций по его извлечению, то первая операция сохранения не нужна и удаляется.

Глобальное распределение по регистрам
Переменные и выражения распределяются по доступным аппаратным регистрам с помощью алгоритма "раскрашивания карты".

Встраивание
Вызовы функций заменяются на фактический код

Планирование команд
Машинные команды переупорядочиваются с целью минимизировать время выполнения

Межпроцедурный анализ
Обрабатываются перекрестные ссылки и исключаются операции загрузки, сохранения и вычисления, которые нельзя было исключить ранее.

Модификация инвариантного кода IF (без переключения)
Из циклов удаляется инвариантный код перехода с целью расширить возможности других способов оптимизации.

Учет результатов профилирования
Результаты выполнения модельных программ используются для оптимизации условных переходов и часто исполняемых участков кода.

Изменение порядка операций
Последовательность вычислений в индексах массивов изменяется с целью предоставить дополнительные возможности для исключения повторных вычислений.

Перемещение операций сохранения
Команды сохранения перемещаются за пределы циклов.

Повышение эффективности команд
Менее эффективные команды заменяются на более эффективные. Например, в индексах массивов команда умножения заменяется на команду добавления.

Обработка числовых значений
Включает создание новых констант, исключение одинаковых выражений, свертывание нескольких инструкций в одну и т.п.

Когда следует компилировать без оптимизации

Не указывайте опцию -O для программ, которые вы собираетесь отлаживать с помощью символьного отладчика, независимо от того, применяется ли опция -g. Однако, поскольку оптимизация крайне важна для программ HPF, для таких программ следует указывать -O3 -qhot даже во время отладки.

Оптимизатор реорганизует инструкции на языке ассемблера, затрудняя представление отдельных инструкций в виде строки исходного кода. Если вы компилируете с опцией -g, то такая реорганизация может создать впечатление того, что исходные операторы выполняются в неправильном порядке, когда вы запускаете символьный отладчик.

Если программа выдает неверные результаты при компиляции с любой из опций -O, то причиной может быть наличие псевдонимов переменных в вызовах процедур.

Компиляция для конкретных аппаратных платформ (-qarch, -qtune)

В системах устанавливаются процессоры различных типов. С помощью опций -qarch и -qtune вы можете оптимизировать программы с учетом специальных команд и особенностей этих процессоров.

Рекомендации

Ниже приведены некоторые рекомендации по компиляции для конкретных аппаратных платформ:

Компиляция с оптимизацией операций над вещественными числами (-qfloat)

Некоторые опции операций над вещественными числами, применяемые по умолчанию, можно изменить с целью повысить производительность программ, выполняющих большое число таких операций. Некоторые из этих опций могут повлиять на соответствие стандартам операций над вещественными числами. Применение таких опций в принципе может повлиять на результаты, однако в большинстве случае оно повышает точность вычислений.

Рекомендации

Выполните следующие рекомендации:

Выбор размера кэша (-qcache)

Если программу предполагается выполнять исключительно в одной системе или конфигурации, то вы можете помочь компилятору настроить программу в соответствии с конфигурацией памяти в системе, указав опцию FORTRAN -qcache. Укажите также опцию -qhot, иначе опция -qcache не окажет нужного действия. Опция -qhot определяет подходящие варианты оптимизации управления памятью на основе информации -qcache.

Кэш может быть трех типов: для данных, для команд и комбинированный. Все системы подразделяются на две категории: системы с кэшем данных и кэшем команд и системы с одним комбинированным кэшем. Подопция TYPE позволяет указать, к какому типу кэша относится опция -qcache.

С помощью опции -qcache можно также задать размер и уровень ассоциативности кэша второго уровня и буфера Translation Lookaside Buffer (TLB) - таблицы, которая служит для поиска недавно использовавшихся страниц памяти. В большинстве случаев вам не требуется указывать запись -qcache для TLB, за исключением случаев, когда ваша программа использует более 512 Кб памяти для данных.

В некоторых случаях уменьшение значения атрибута SIZE приводит к повышению производительности. Это зависит от загруженности системы во время выполнения программы.

Встраивание кода процедур (-Q)

Встраивание означает замену вызова процедуры на ее код. Это исключает выполнение операций по вызову процедур и позволяет оптимизатору выполнять оптимизацию также и во встраиваемых процедурах.

В случае программ на FORTRAN и C вы можете указать опцию -Q (вместе с -O2 или -O3) для встраивания процедур по месту их вызова.

В некоторых случаях встраивание повышает производительность, в некоторых - наоборот. Снижение производительности возможно в случае, если размер кода слишком велик, что повышает нагрузку на кэш и частоту подкачки страниц, или если в системе недостаточно регистров для хранения всех локальных переменных встроенной функции.

При указании опции -Q обязательно сравните производительность версии программы, откомпилированной с опциями -O3 и -Q, и версии, откомпилированной только с опцией -O3. Производительность программ, откомпилированных с опцией -Q, может быть значительно выше, значительно ниже или почти такой же.

Компилятор решает вопрос о встраивании процедур в зависимости от их размера. Возможно, вам удастся повысить производительность приложения, задав другие критерии встраивания. Для процедур, вызов которых в обычной ситуации маловероятен (примерами могут служить процедуры отладки и исправления ошибок), рекомендуется выборочно отключить встраивание с помощью опции -Q-имена. Для часто используемых процедур, наоборот, рекомендуется выбрать обязательное встраивание, указав опцию -Q+имена.

Динамическая и статическая компоновка

В операционной системе предусмотрены средства создания и применения динамически подключаемых общих библиотек. При динамическом подключении внешние идентификаторы, встречающиеся в пользовательском коде и определенные в общей библиотеке, преобразуются загрузчиком на этапе загрузки. Во время компиляции программы, применяющей общие библиотеки, они динамически связываются с ней по умолчанию.

Смысл использования общих библиотек заключается в хранении одной копии стандартных библиотек, доступной всем приложениям. Это позволяет значительно сократить размер исполняемых программ и тем самым сэкономить место на диске.

Вы можете сократить размер программ за счет применения динамической компоновки, однако, как правило, это приводит к снижению производительности. Код общих библиотек хранится не в исполняемом образе на диске, а в отдельном файле библиотеки. Общий код загружается в память один раз и используется всеми процессами, в которых есть ссылка на него. Таким образом, применение динамически подключаемых библиотек позволяет снизить объем виртуальной памяти, применяемой программой, при условии, что несколько параллельных приложений (или экземпляров одного приложения) обращаются к общей библиотеке. Кроме того, оно позволяет сократить объем дисковой памяти, необходимой программе, при условии, что несколько различных приложений данной системы обращаются к общей библиотеке. Ниже перечислены другие преимущества применения общих библиотек:

Однако динамическая компоновка обладает и некоторыми недостатками:

В статически связываемых программах весь код содержится в одном исполняемом модуле. Ссылки на библиотеки обрабатываются более эффективно, поскольку библиотечные процедуры статически подключены к программе. Статическая компоновка увеличивает размер файла, содержащего программу, а также, возможно, размер кода в памяти, если в системе запущены другие приложения или другие экземпляры того же приложения.

По умолчанию команда cc использует поддержку общих библиотек. Если вы хотите переопределить значение по умолчанию, при компиляции программ для создания статически подключаемых объектных файлов укажите опцию -bnso:

cc xxx.c -o xxx.noshr -O -bnso -bI:/lib/syscalls.exp

Эта опция означает, что компоновщик должен поместить библиотечные процедуры, на которые ссылается программа, в объектный файл. Файл /lib/syscalIs.exp содержит имена системных функций, которые следует импортировать в программу из системы. Этот файл обязателен при статической компоновке. При динамической компоновке указывать этот файл необязательно, поскольку перечисленные в нем функции автоматически импортируются модулем libc.a. Дополнительные сведения об этих опциях приведены в разделе Приложение B. Эффективное применение команды ld и в описании команды Id.

Влияние отключения общих библиотек на производительность

Один из способов определить, насколько эффективно применение общих библиотек в вашем приложении, заключается в повторной компиляции исполняемой программы с опцией отключения общих библиотек. Если производительность заметно увеличилась, вы можете отказаться от преимуществ общих библиотек в пользу быстродействия. Не забудьте, что измерения нужно проводить в рабочей среде. В незагруженной системе программа без использования общих библиотек обычно работает быстрее. Однако когда в системе работает много пользователей, запуск такой программы может привести к переполнению памяти.

Выбор порядка компоновки больших программ для снижения интенсивности подкачки

На этапе компоновки во время компиляции программы компоновщик переупорядочивает блоки программы, пытаясь более удачно разместить вызываемые объекты. Например, если процедура вызывает другую процедуру, компоновщик может разместить их рядом в загрузочном модуле, так чтобы обе процедуры уместились в одной странице виртуальной памяти. Это снижает интенсивность подкачки. Когда при первом обращении к первой процедуре содержащая ее страница загружается в память, вторая процедура будет уже готова к использованию без дополнительных операций подкачки.

Если размер программы очень велик и подкачка выполняется очень интенсивно, вы можете задать определенный порядок компоновки для компоновщика. Для этого расположите управляющие разделы в нужном порядке и с помощью опции -bnoobjreorder запретите компоновщику изменять этот порядок. Управляющий раздел, или CSECT, - это наименьший сменный блок кода или данных в объектном модуле XCOFF. Более подробная информация приведена в книге AIX 5L Version 5.1 Files Reference.

Однако фиксация порядка компоновки обладает и рядом недостатков. Любое изменения порядка должно сопровождаться тщательным тестированием с целью убедиться, что заданный порядок компоновки дает более высокую производительность по сравнению с тем, который выбирает компоновщик. Перед тем, как задать свой собственный порядок компоновки, учтите следующее:

Если вы изменяете порядок компоновки программы, обязательно протестируйте ее в системе, в которой общий объем памяти и показатели ее использования другими программами близки к аналогичным параметрам предполагаемой рабочей среды. Порядок компоновки, оправдывающий себя в системе с небольшим числом задач, может привести к конфликтам подкачки в загруженной системе.

Применение библиотек BLAS и ESSL

Библиотека BLAS (библиотека элементарных линейных алгебраических преобразований) обеспечивает высокоэффективное выполнение линейных алгебраических преобразований над матрицами и векторами. Ее расширение, библиотека ESSL (библиотека функций для научно-инженерных расчетов), содержит дополнительные функции и специально оптимизирована для архитектуры семейства POWER, POWER2 и PowerPC. Применение BLAS и ESSL позволяет значительно ускорить выполнение многих арифметических операций и дает выигрыш в производительности даже по сравнению с настройкой вручную или автоматической оптимизацией этих операций. Функции из обеих библиотек можно вызывать в программах на FORTRAN, C и C++.

Библиотека BLAS содержит функции, специально оптимизированные для применяемой архитектуры. Библиотека BLAS поставляется вместе с операционной системой (/lib/libblas.a).

Пользователям настоятельно рекомендуется применять эту библиотеку при выполнении операций над матрицами и векторами, поскольку предоставляемый ей уровень оптимизации недостижим при настройке вручную.

Функции BLAS предназначены для использования в программах на FORTRAN, но могут вызываться и в программах на C. При работе с матрицами необходимо учесть различия между этими языками. Например, в языке FORTRAN матрицы хранятся по столбцам, а в языке C - по строкам.

Для включения в программу библиотеки BLAS, хранящейся в файле /lib/libblas.a, укажите опцию -lblas в операторе компиляции (xlf -O prog.f -lblas). Если вы вызываете библиотеку BLAS из программы на C, добавьте также опцию -lxlf, так как библиотека относится к языку FORTRAN (cc -O prog.c -lblas -lxlf).

Библиотека ESSL содержит более широкий набор математических функций, применяемых в физических, химических и инженерных расчетах.

Ниже перечислены преимущества применения библиотек BLAS и ESSL:

В примере программы следующие девять строк кода на языке FORTRAN:

do l=1,control
do j=1,control
        xmult=0.d0
        do k=1,control
                xmult=xmult+a(i,k)*a(k,j)
        end do
        b(i,j)=xmult
end do
end do

были заменены на следующую строку FORTRAN, вызывающую функцию библиотеки BLAS:

call dgemm (`n','n',control,control,control,1,d0,a, control,a,1control,1.d0,b,control)

Это привело к следующему повышению производительности:

Размерность массива Затраченное время - MULT Затраченное время - BLAS Коэффициент
101 x 101 0,1200 0,0500 2,40
201 x 201 0,8900 0,3700 2,41
301 x 301 16,4400 1,2300 13,37
401 x 401 65,3500 2,8700 22,77
501 x 501 170,4700 5,4100 31,51

Этот пример демонстрирует эффективность применения функции уровня 3 BLAS вместо обычных операций умножения матриц. Обратите внимание, что эффективность повышается с увеличением размерности массива.

Учет результатов профилирования (PDF)

PDF - это опция компилятора, позволяющая выполнить дополнительную оптимизацию на процедурном уровне: распределение регистров, планирование команд, реорганизацию блоков и т.п. Для применения PDF выполните следующие действия:

  1. Откомпилируйте исходные файлы в программе с опцией -qpdf1 (а также функцию main()). На этапе компоновки укажите опцию -lpdf. Если вы применяете другие опции компиляции, то все они должны быть использованы и на шаге 3.
  2. Выполните программу от начала до конца со стандартным набором данных. По окончании работы программа запишет информацию профилирования в файл .__BLOCKS в каталоге, указанном в переменной среды PDFDIR, либо в текущем рабочем каталоге, если эта переменная не задана. Вы можете выполнить программу несколько раз с различными наборами данных. В этом случае вы получите совокупную информацию профилирования, предоставляющую более точные сведения о частоте отдельных переходов и исполнения различных блоков кода. Важно, чтобы данные, которые вы вводите, соответствовали тем, которые вы будете применять при дальнейшей работе с программой.
  3. Еще раз откомпилируйте программу с теми же опциями, что и на шаге 1, но вместо -qpdf1 укажите -qpdf2. Помните, что -L и -l - это опции компоновщика, и вы можете изменить их на этом этапе; в частности, опустите опцию -lpdf. Во время данной (второй) компиляции происходит дополнительная оптимизация на основе совокупной информации профилирования. В результате программа не будет содержать "узких мест" и будет работать с максимально возможной скоростью.

Для работы с каталогом, указанным в переменной PDFDIR, предусмотрены две команды:

resetpdf каталог
Удаляет всю информацию профилирования (но не файлы данных) из указанного каталога. Если каталог не задан, то по умолчанию применяется каталог, указанный в переменной PDFDIR, а если переменная PDFDIR не задана, то текущий каталог. При внесении изменений в приложение и повторной компиляции некоторых файлов информация профилирования для этих файлов автоматически сбрасывается. После внесения существенных изменений, которые могут повлиять на показатели выполнения частей программы, не компилировавшихся заново, выполните команду resetpdf для сброса информации профилирования для всего приложения.

cleanpdf каталог
Удаляет всю информацию профилирования из указанного каталога, каталога, заданного в переменной PDFDIR, или текущего каталога. Удаление информации профилирования сокращает нагрузку во время выполнения, если вы измените программу и затем еще раз выполните процедуру PDF. Запустите программу после ее компиляции с опцией -qpdf2.

Команда fdpr

Команда fdpr позволяет реорганизовать код в откомпилированной исполняемой программе с целью повысить производительность операций ветвления и перехода, отделить редко используемый код от активных областей программы и выполнить другие глобальные операции по оптимизации. Она наиболее эффективна для больших программ со значительным числом условных переходов, а также программ с высокой степенью структуризации и большим числом произвольно расположенных процедур. Команда fdpr описана в разделе Реструктуризация исполняемых программ с помощью программы fdpr.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]