| КОМПЬЮТЕРЫ | ![]() ![]() |
Наряду со стандартными для Linux компиляторами GNU, на кластерах вычислительного комплекса НИВЦ установлены компиляторы Intel C++ и Fortran. На настоящее время (начало 2006 года) на всех кластерах установлены компиляторы версии 9.1. Настоящая страница посвящена описанию наиболее важных опций и настроек этих компиляторов, а также их основных отличий от компиляторов GNU. Страница ориентирована, в основном, на пользователей кластеров НИВЦ МГУ, но может быть полезна и другим русскоязычным пользователям. Здесь не затрагиваются вопросы, связанные с компиляцией для платформы IA-64.
Также на всех кластерах установлена библиотека Intel Kernel Math Library (MKL) версии 8.0.2. Библиотека располагается в каталоге /usr/mkl. Обращаем внимание на то, что в каталоге lib доступны подкаталоги 32, 64 и em64t. На кластере Ant необходимо использовать библиотеки из подкаталога em64t, а на остальных кластерах - из подкаталога 32. Вся необходимая документация и примеры могут быть получены из каталога /usr/mkl/doc.
Необходимость в новых компиляторах возникла, главным образом, а) для поддержки программирования на языке Фортран 90, а также б) для более мощной оптимизации программ на языке Фортран, чем обеспечивает компилятор g77, использующий трансляцию в язык Си и затем компиляцию с помощью gcc.
Этим требованиям удовлетворяют также компиляторы PGI (Portland Group), но компания-разработчик отказалась поставлять их в Россию.
Компиляторы Intel вызываются с помощью команд icc (C или C++), icpc (C++) и ifort (Фортран 77/90). Команды mpicc, mpiCC и mpif77 для компиляции и сборки MPI-программ также настроены на использование компиляторов Intel.
Сохраняется также возможность пользоваться компиляторами GNU с помощью команд mpigcc, mpig++ и mpig77 (Фортран 90 не поддерживается).
По умолчанию, файлы с расширением .cpp и .cxx считаются исходными текстами на языке С++, файлы с расширением .c - исходными текстами на языке Си, а компилятор icpc также компилирует файлы .c как исходные тексты на С++.
Файлы с расширениями .f, .ftn и .for распознаются как исходные тексты на языке Фотран, с фиксированной формой записи, а файлы .fpp и .F дополнительно пропускаются через препроцессор языка Фортран. Файлы с расширением .f90 считаются исходными текстами Фортран 90/95 со свободной формой записи. Явным образом можно задать фиксированную или свободную форму записи Фортран-программ с помощью опций -FI и -FR соответственно.
Файлы с расширением .s распознаются как код на языке ассемблера для IA-32.
Здесь мы приводим характеристики компиляторов Интел, как они заявлены разработчиком в руководстве пользователя с некоторыми нашими комментариями.
Наиболее интересными, конечно же, являются опции оптимизации кода. Большинство опций являются общими для компиляторов С++ и Фортран. Более подробное описанием опций смотри в англоязычных руководствах пользователя.
Согласно результатам прогона тестов SPEC CPU2000, опубликованным на сервере ixbt.com, компиляторы Intel версии 6.0 практически везде оказались лучше по сравнению с компиляторами gcc версий 2.95.3, 2.96 и 3.1, и PGI версии 4.0.2. Эти тесты проводились в 2002 году на компьютере с процессором Pentium 4/1.7 ГГц и ОС RedHat Linux 7.3.
Согласно результатам тестов, проведенных компанией Polyhedron, компилятор Intel Fortran версии 7.0 почти везде оказался лучше по сравнению с другими компиляторами Fortran 77 для Linux (Absoft, GNU, Lahey, NAG, NAS, PGI). Только в некоторых тестах компилятор Intel незначительно проигрывает компиляторам Absoft, NAG и Lahey. Эти тесты были проведены на компьютере с процессором Pentium 4/1.8 ГГц и ОС Mandrake Linux 8.1.
Компиляторы Intel версии 9.1 также обгоняют по производительности компиялторы gcc, и показывают производительность сравнимую с Absoft, PathScale и PGI.
Мы будем благодарны тем пользователям и читателям, которые пришлют нам данные по влиянию выбора компилятора (GCC или Intel) и опций оптимизации на скорость работы на их реальных задачах.
Компилятор языка Си использует runtime-библиотеку, разработанную в рамках проекта GNU (libc.a).
Вместе с компилятором Intel C++ поставляются следующие библиотеки:
В этом списке перечислены статических библиотек, но для большинства из них существуют также динамические, т.е. подключаемые во время запуска, варианты (.so).
Вместе с компилятором Фортрана поставляются следующие библиотеки: libCEPCF90.a, libIEPCF90.a, libintrins.a, libF90.a, также используется библиотека математических функций libimf.a.
Подключение библиотек возможно статическое (во время сборки) или динамическое (во время запуск программы). Динамический подход позволяет уменьшить размер выполняемого файла, позволяет разделять в памяти одну и ту же копию библиотеки, но для этого необходимо установить на каждом узле, где будут запускаться программы, полный набор используемых динамических библиотек.
Таким образом, если Вы установили компилятор Intel на своей машине с Linux и хотите запускать собранные исполняемые файлы на других машинах, то нужно или использовать статическую сборку (что проще) или скопировать на эти машины динамические библиотеки Intel (обычно из директории вида /opt/intel/compiler70/ia32/lib) в одну из директорий, перечисленных в файле /etc/ld.so.conf, а также позаботиться о том, чтобы на этих машинах был установлен одинаковый набор динамических библиотек GNU/Linux.
По умолчанию, все библиотеки разработки Intel (кроме libcxa.so) подключаются статически, а все системные библиотеки Linux и библиотеки GNU подключаются динамически. С помощью опции -static можно заставить сборщик (редактор связей) подключить все библиотеки статически (что увеличит объем исполняемого файла), а с помощью опции -i_dynamic можно подключать динамически все библиотеки разработки Intel.
При подключении дополнительных библиотек с помощью опции вида -lбиблиотека может понадобиться использовать опцию -Lдиректория, чтобы задать путь, где размещаются библиотеки.
С помощью опций -Bstatic и -Bdynamic можно явно задавать динамическое или статическое подключение каждой из библиотек, заданных в командной строке.
С помощью опции -c сборка исполняемого файла отключается и производится только компиляция (генерация объектного модуля).
Чтобы совместно использовать модули, написанные на языках Фортран и Си, нужно согласовать именование процедур в объектных модулях, передачу параметров, а также доступ к глобальным переменным, если такие есть.
По умолчанию, компилятор Intel Fortran переводит имена процедур в нижний регистр и добавляет в конец имени знак подчеркивания. Компилятор Си никогда не изменяет имена функций. Таким образом, если мы хотим из модуля на Фортране вызвать функцию или процедуру FNNAME, реализованную на Си, то в модуле на Си она должна именоваться fnname_.
Компилятор Фортрана поддерживает опцию -nus [имя файла], которая позволяет отключать добавление знаков подчеркивания к внутренним именам процедур. Если задано имя файла, то это производится только для имен процедур, перечисленным в заданном файле.
По умолчанию, на Фортране параметры передаются по ссылке, а на Си — всегда по значению. Таким образом, при вызове Фортран-процедуры из модуля на Си мы должны в качестве параметров передавать указатели на соответствующие переменные, содержащие значения фактических параметров. При написании на Си функции, которую надо будет вызывать из модуля на Фортране, мы должны описывать формальные параметры как указатели соответствующих типов.
В модулях на Си возможно использование COMMON-блоков, определенных внутри модулей на Фортране (подробнее об этом см. Intel Fortran Compiler User's Guide, глава Mixing C and Fortran).
Объектные модули на языке Си, полученные компилятором Intel C++, совместимы с модулями, полученными компилятором GCC и библиотекой GNU для языка Си. Таким образом, эти модули могут совместно использоваться в одной программе, собираемой с помощью команд icc или gcc, но для корректного подключения библиотек Intel рекомендуется использовать icc.
Компилятор Intel поддерживает ряд нестандартных расширений языка Си, используемых в рамках проекта GNU и поддерживаемых компилятором GCC (но не все из них, подробнее см. здесь).
О совместимости объектных модулей на языках С++ и Фортран в руководстве пользователя ничего не сказано, видимо, она не поддерживается.
Компилятор Intel C++ Compiler 7.0 for Linux поддерживает стандарт языка Си ANSI/ISO (ISO/IEC 9899/1990). Возможно установка строгой совместимости cо стадартом ANSI C (-ansi) или расширенного диалекта ANSI C (-Xa). При использовании опции -c99 поддерживается некоторое подмножество стандарта C99: ключевое слова restrict, массивы переменной длины, комплексные числа, объявления переменных в произвольных местах кода, макро-определения с переменным числом аргументов, inline-функции, булевский тип и др.
Поддерживается стандарт ISO/IEC 14882:1998 языка С++.
Компилятор Intel Fortran Compiler 7.0 for Linux поддерживает спецификацию ISO Fortran 95, а также совместим на уровне исходных текстов с компилятором Compaq Visual Fortran 6.6.