Средства и приемы оптимизации исходного кода можно разбить на следующие три основные категории:
Помимо вышеперечисленных средств, можно воспользоваться программой реструктуризации объектного кода fdpr. Программа fdpr описана в разделе Реструктуризация исполняемых программ с помощью программы fdpr.
При создании эффективной программы прежде всего необходимо воспользоваться встроенными средствами оптимизации компилятора. Это повысит быстродействие программы и сократит объем дальнейших операций по настройке.
Ниже приведены некоторые рекомендации:
Опция -qipa активизирует или настраивает класс оптимизирующих процедур, называемых межпроцедурным анализом. У опции -qipa есть несколько подопций, описанных в руководстве по компилятору. Ее можно применять двумя способами:
Оптимизация с помощью компилятора дает следующие преимущества:
Не указывайте опцию -O для программ, которые вы собираетесь отлаживать с помощью символьного отладчика, независимо от того, применяется ли опция -g. Однако, поскольку оптимизация крайне важна для программ HPF, для таких программ следует указывать -O3 -qhot даже во время отладки.
Оптимизатор реорганизует инструкции на языке ассемблера, затрудняя представление отдельных инструкций в виде строки исходного кода. Если вы компилируете с опцией -g, то такая реорганизация может создать впечатление того, что исходные операторы выполняются в неправильном порядке, когда вы запускаете символьный отладчик.
Если программа выдает неверные результаты при компиляции с любой из опций -O, то причиной может быть наличие псевдонимов переменных в вызовах процедур.
В системах устанавливаются процессоры различных типов. С помощью опций -qarch и -qtune вы можете оптимизировать программы с учетом специальных команд и особенностей этих процессоров.
Ниже приведены некоторые рекомендации по компиляции для конкретных аппаратных платформ:
Некоторые опции операций над вещественными числами, применяемые по умолчанию, можно изменить с целью повысить производительность программ, выполняющих большое число таких операций. Некоторые из этих опций могут повлиять на соответствие стандартам операций над вещественными числами. Применение таких опций в принципе может повлиять на результаты, однако в большинстве случае оно повышает точность вычислений.
Выполните следующие рекомендации:
-qfloat=fltint:rsqrt:hssngl
Если программа с одинарной точностью не слишком интенсивно взаимодействует с памятью (например, программа не запрашивает больше данных, чем умещается в кэше), то вы можете повысить точность вычислений, сохранив или повысив производительность, с помощью следующих опций:
-qfloat=fltint:rsqrt -qautodbl=dblpad4
Для программ, не содержащих переменных одинарной точности, следует указывать только опцию -qfloat=rsqrt:fltint. Учтите, что опция -O3 без опции -qstrict автоматически задает режим -qfloat=rsqrt:fltint.
-qfloat=hssngl:fltint:rsqrt
Если программу предполагается выполнять исключительно в одной системе или конфигурации, то вы можете помочь компилятору настроить программу в соответствии с конфигурацией памяти в системе, указав опцию FORTRAN -qcache. Укажите также опцию -qhot, иначе опция -qcache не окажет нужного действия. Опция -qhot определяет подходящие варианты оптимизации управления памятью на основе информации -qcache.
Кэш может быть трех типов: для данных, для команд и комбинированный. Все системы подразделяются на две категории: системы с кэшем данных и кэшем команд и системы с одним комбинированным кэшем. Подопция TYPE позволяет указать, к какому типу кэша относится опция -qcache.
С помощью опции -qcache можно также задать размер и уровень ассоциативности кэша второго уровня и буфера Translation Lookaside Buffer (TLB) - таблицы, которая служит для поиска недавно использовавшихся страниц памяти. В большинстве случаев вам не требуется указывать запись -qcache для TLB, за исключением случаев, когда ваша программа использует более 512 Кб памяти для данных.
В некоторых случаях уменьшение значения атрибута SIZE приводит к повышению производительности. Это зависит от загруженности системы во время выполнения программы.
Встраивание означает замену вызова процедуры на ее код. Это исключает выполнение операций по вызову процедур и позволяет оптимизатору выполнять оптимизацию также и во встраиваемых процедурах.
В случае программ на 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 (библиотека функций для научно-инженерных расчетов), содержит дополнительные функции и специально оптимизирована для архитектуры семейства 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 выполните следующие действия:
Для работы с каталогом, указанным в переменной PDFDIR, предусмотрены две команды:
Команда fdpr позволяет реорганизовать код в откомпилированной исполняемой программе с целью повысить производительность операций ветвления и перехода, отделить редко используемый код от активных областей программы и выполнить другие глобальные операции по оптимизации. Она наиболее эффективна для больших программ со значительным числом условных переходов, а также программ с высокой степенью структуризации и большим числом произвольно расположенных процедур. Команда fdpr описана в разделе Реструктуризация исполняемых программ с помощью программы fdpr.