Перейти к содержимому

Как подключить библиотеку mkl в intel fortran

  • автор:

Использование возможностей математической библиотеки Intel mkl в параллельных программах на языке т++ для Т-системы с открытой архитектурой Текст научной статьи по специальности «Компьютерные и информационные науки»

ЯЗЫК ПРОГРАММИРОВАНИЯ Т++ / Т-СИСТЕМА / ПАРАЛЛЕЛЬНОЕ РАСШИРЕНИЕ СИ++ / СУПЕРКОМ-ПЬЮТЕРЫ / МАТЕМАТИЧЕСКАЯ БИБЛИОТЕКА INTEL MKL / T++ programming language / C++parallel extension / OPENTS / OpenTS / T-system / supercomputers / Intel MKL math library

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Роганов В. А., Кузнецов А. А., Матвеев Г. А., Осипов В. И.

Реализация параллельных вычислений в большей мере является проблемой программного обеспечения. Самый распространенный подход к разработке параллельных программ основан на использовании программных пакетов типа MPI (Message Passing Interface,интерфейс передачи сообщений). При этом такой подход требует от разработ-чика большого объема знаний, а также значительных временных затрат на разработку и отладку параллельных про-грамм. В разработанной в ИПС РАН Т-системе реализован подход, при котором большая часть решений по распараллеливанию принимается динамически в процессе выполнения программ. Входной язык для Т-системы – язык Т++, а приложения, разработанные для Т-системы , являются Т-приложениями или Т-программами. В статье дается краткий обзор продуктов и компонентов математической библиотеки Intel Math Kernel Library (Intel MKL), которая содержит большой набор математических функций и может использоваться в параллельных Т-приложениях для ускорения процесса счета и достижения максимальной производительности. В работе рассматриваются режимы использования математической библиотекиIntel MKL на кластерах, имеющих процессоры Intel Xeon и один или несколько ускорителей (сопроцессоров) Intel Xeon Phi компании Intel. Приводится несколько демонстрационных примеров использования библиотеки на языках Си и Т++. В работе показано, как использование математической библиотеки влияет на эффективность выполнения параллельных Т-программ. Все эксперименты проводились на энергоэффективном суперкомпьютере «РСК Торнадо ЮУрГУ» Южно-Уральского государственного университета.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Роганов В. А., Кузнецов А. А., Матвеев Г. А., Осипов В. И.

Распараллеливание тестов nas NPB для сопроцессора Intel Xeon Phi на языке Fortran-DVMH

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

Интеграция приложения Tachyon с системой параллельного программирования OpenTS
Образовательная программа по технологиям HPC на базе гетерогенного кластера HybriLIT (лит ОИЯИ)

Параллельный алгоритм вычисления матрицы Евклидовых расстояний для многоядерного процессора Intel Xeon Phi поколения Knights Landing

i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

USING POSSIBILITIES OF INTEL MKL MATH LIBRARY IN PARALLEL PROGRAMS IN T++ LANGUAGE FOR A T-SYSTEM WITH AN OPEN ARCHITECTURE TO IMPROVE THEIR PERFORMANCE

The problem of parallel computing is a problem of software. The most common approach to developing parallel programs is based on using software packages such as MPI(Message Passing Interface). This approach requires a large amount of knowledge from developer. Developing and debuging parallel programs is also time consuming. The PSI RAS has developed a T-system which implements automatic dynamic parallelization at runtime. Input language for T-system is T++, and applications developed for the T-system are T-applications or T-programs. This paper provides an overview of products and components of Intel Math Kernel Library (Intel MKL), which contains a large set of mathematical functions and can be used in parallel T-applications to accelerate computation and get maximum performance. The paper considers the modes of using the Intel MKL mathematical library on clusters with Intel Xeon processors and one or more Intel Xeon Phi accelerators (coprocessors) from Intel company. There are demo examples of using the library in C and T++. The paper shows how the use of Intel MKL math library affects the efficiency of parallel T-programs. All experiments has been performed on “RSC Tornado SUSU” energy-efficient supercomputer of the South Ural State University.

Текст научной работы на тему «Использование возможностей математической библиотеки Intel mkl в параллельных программах на языке т++ для Т-системы с открытой архитектурой»

Программные продукты и системы / Software & Systems

УДК 519.682.3 Дата подачи статьи: 29.09.14

ИСПОЛЬЗОВАНИЕ ВОЗМОЖНОСТЕЙ МАТЕМАТИЧЕСКОЙ БИБЛИОТЕКИ INTEL MKL В ПАРАЛЛЕЛЬНЫХ ПРОГРАММАХ НА ЯЗЫКЕ Т++ ДЛЯ Т-СИСТЕМЫ С ОТКРЫТОЙ АРХИТЕКТУРОЙ

(Работы выполнены в рамках Программы фундаментальных научных исследований ОНИТ РАН «Архитектурно-программные решения и обеспечение безопасности суперкомпьютерных информационно-вычислительных комплексов новых поколений» и НИР «Методы и программные средства разработки параллельных приложений и обеспечения функционирования вычислительных комплексов

и сетей нового поколения»)

В.А. Роганов, научный сотрудник, var@pereslavl.ru;

А.А. Кузнецов, научный сотрудник, tonic@pereslavl.ru;

Г.А. Матвеев, ведущий инженер-исследователь, gera@prime.botik.ru;

В.И. Осипов, к.ф.-м.н., научный сотрудник, val@pereslavl.ru (Институт программных систем им. А.К. Айламазяна РАН, ул. Петра I, 4а, г. Переславль-Залесский, 152021, Россия)

Реализация параллельных вычислений в большей мере является проблемой программного обеспечения. Самый распространенный подход к разработке параллельных программ основан на использовании программных пакетов типа MPI (Message Passing Interface, интерфейс передачи сообщений). При этом такой подход требует от разработчика большого объема знаний, а также значительных временных затрат на разработку и отладку параллельных программ. В разработанной в ИПС РАН Т-системе реализован подход, при котором большая часть решений по распараллеливанию принимается динамически в процессе выполнения программ. Входной язык для Т-системы — язык Т++, а приложения, разработанные для Т-системы, являются Т-приложениями или Т-программами.

В статье дается краткий обзор продуктов и компонентов математической библиотеки Intel Math Kernel Library (Intel MKL), которая содержит большой набор математических функций и может использоваться в параллельных Т-приложениях для ускорения процесса счета и достижения максимальной производительности. В работе рассматриваются режимы использования математической библиотеки Intel MKL на кластерах, имеющих процессоры Intel Xeon и один или несколько ускорителей (сопроцессоров) Intel Xeon Phi компании Intel. Приводится несколько демонстрационных примеров использования библиотеки на языках Си и Т++. В работе показано, как использование математической библиотеки влияет на эффективность выполнения параллельных Т-программ. Все эксперименты проводились на энергоэффективном суперкомпьютере «РСК Торнадо ЮУрГУ» Южно-Уральского государственного университета.

Ключевые слова: язык программирования Т++, OpenTS, Т-система, параллельное расширение Си++, суперкомпьютеры, математическая библиотека Intel MKL.

Известно, что Т-система представляет собой концепцию автоматического динамического распараллеливания, в которой сочетаются наиболее удачные черты функционального программирования, dataflow-систем и традиционных языков и методов программирования [1-2].

Современная реализация концепции Т-системы (OpenTS [3]) обладает открытой и масштабируемой архитектурой, легко адаптируемой к стремительно меняющимся аппаратным платформам современных суперкомпьютеров. Поддерживаемый системой OpenTS входной язык программирования Т++ является синтаксически и семантически гладким расширением языка программирования Си++ [4-7].

Математическая библиотека Intel MKL

Библиотека Intel Math Kernel Library (Intel MKL) — это математическая библиотека, которая содержит большой набор математических функций и может использоваться в параллельных приложениях для ускорения процесса счета и достижения максимальной производительности [8].

Библиотека Intel MKL, адаптированная для процессоров компании Intel, предлагает высокооптимизированные и многопоточные функции, которые реализуют многие типы операций. Библиотека работает как на 32-разрядных (IA-32), так и на 64-разрядных (Intel 64) архитектурах.

Библитека включает в себя следующие продукты и компоненты для работы с линейной алгеброй: BLAS, SparseBLAS, PBLAS, LAPACK/ ScaLAPACK, PARDISO, Iterative sparse solvers.

BLAS (Basic Linear Algebra Subprograms) — математическая библиотека, содержащая набор функций для реализации операций линейной алгебры (обработка матриц и векторов).

Операции линейной алгебры разделены на три уровня: 1-й уровень — векторно-векторные операции, 2-й уровень — матрично-векторные операции, 3-й уровень — матрично-матричные операции. На библиотеке BLAS построен тест Linpack.

SparseBLAS (Sparse Basic Linear Algebra Subroutines) — расширение библиотеки BLAS для работы с разреженными векторами и матрицами.

PBLAS (Parallel BLAS) — параллельная, основанная на использовании технологии MPI библио-

Программные продукты и системы / Software & Systems

тека, адаптированная для кластеров с распределенной памятью.

LAPACK (Linear Algebra PACKage) — пакет, содержащий набор подпрограмм для решения линейных алгебраических уравнений. Предназначен для работы с плотными матрицами.

ScaLAPACK — пакет, представляющий собой набор параллельных подпрограмм для решения задач линейной алгебры.

PARDISO (PARallel Direct Solver) — библиотека, предназначенная для решения систем линейных уравнений с большими разреженными матрицами.

Iterative sparse solvers — итерационные решатели для разреженных матриц.

FFTs — модули быстрого преобразования Фурье.

ClusterFFT — кластерная реализация библиотеки быстрого преобразования Фурье, которая содержит следующие компоненты:

— функции математической статистики: эксцесс распределения, коэффициент вариации, квантили и порядковая статистика, минимум/мак-симум, вариация/ковариация;

— аппроксимация (выравнивание) и интерполяция данных: сплайны, интерполяция и др.;

— другие компоненты: тригонометрические, логарифмические функции, взятие корня, генераторы случайных чисел, функции округления и т.д.

Библиотека Intel MKL хорошо оптимизирована для параллельной работы на кластерных установках, имеющих на узлах многоядерные процессоры с ускорителями Intel Xeon Phi, и на SMP-системах (системах с общей памятью). Библиотека поддерживает как гетерогенный режим вычислений, когда код библиотеки выполняется одновременно на хост-процессоре узла и на ускорителе (сопроцессоре), так и однородный режим вычислений, когда код библиотеки выполняется одновременно только на сопроцессорах либо только на хост-процессорах. Для использования библиотеки Intel MKL приложение может быть собрано компилятором Intel с указанием опции «-mkl».

Доступны три способа (режима) использования математической библиотеки Intel MKL:

— Automatic Offload mode — буквально «автоматическая выгрузка», используется при гетерогенном режиме вычислений;

— Offload mode supported by Compiler — выгрузка с поддержкой от компилятора; в этом режиме процесс выгрузки (переноса части вычислений) вычислительного кода на ускоритель задается в программе с помощью директив компилятора;

— Native mode — код библиотеки выполняется одновременно только на ускорителях (сопроцессорах).

Автоматическая выгрузка. Данный способ является самым простым в использовании математической библиотеки Intel MKL на кластерах, имеющих процессоры от Intel и один или несколь-

ко ускорителей (сопроцессоров). При использовании данного режима не требуется значительного изменения кода программы. Библиотека сама автоматически принимает решение об использовании ускорителя при вызове функций библиотеки на этапе выполнения программы. Решение принимается, исходя из текущей загрузки процессора и ускорителя, количества входных данных и параметров функции. Например, если в момент вызова какой-то функции ускоритель загружен другой работой, функция будет выполнена на хостпроцессоре. В противном случае функция будет выполнена на ускорителе. Таким образом, библиотека Intel MKL выполняет автоматическую балансировку нагрузки на систему. Нагрузка на систему может как распределяться автоматически, так и задаваться программистом для достижения эффективного использования вычислительных ресурсов кластера.

Для включения режима необходимо вызвать функцию mkl_mic_enable(). Она позволяет автоматически выполнять (выгружать) на ускорителе Intel Xeon Phi код математических функций библиотеки Intel MKL.

Для включения режима можно воспользоваться и переменной окружения MKL_MIC_ENABLE, установив ее значение в «1».

Библиотека Intel MKL предоставляет функции для поддержки выполнения программ на ускорителях Intel Xeon Phi:

#include «mkl.h» rc = mkl_mic_enable();

rc = mkl_mic_set_workdivision(MKL_TARGET_MlC, 0,

rc = mkl_mic_get_workdivision(MKL_TARGET_MIC, 0,

rc = mkl_mic_set_max_memory(MKL_TARGET_MIC, 0, mem_size);

MIC, 0, num_threads);

rc = mkl_mic_free_memory(MKL_TARGET_MIC, 0);

Семейство функций mkl_mic_set_workdivisi-on() позволяет задавать желаемое распределение нагрузки между хост-процессором и ускорителями Intel Xeon Phi. Дополнительные функции управления распределением нагрузки позволяют определить объем вычислительной работы в виде пропорции, которая будет распределена между хост-процессором и ускорителями Intel Xeon Phi. Объем работы задается вещественным числом и может изменяться в пределах от 0,0 до 1,0. Например, установка объема работы для хост-процессора в значение 0,5 означает, что нагрузка будет распределена следующим образом: половина вычислительной работы (50 %) будет выполнена на хост-процессоре, а вторая половина — на ускорителях (если в системе больше одного ускорите-

Программные продукты и системы / Software & Systems

ля). Или, например, установка объема работы в значение 0,25 для ускорителя означает, что четверть вычислительной работы (25 %) будет выполнена на ускорителе, а остальная часть работы (75 %) будет отдана хост-процессору. Отметим, что такое указание распределения нагрузки на систему носит лишь рекомендательный характер.

Существуют также переменные окружения, с помощью которых можно управлять нагрузкой на систему. Например, в данной переменной окружения для нулевого ускорителя установлен объем работы в 25 % от общей нагрузки:

Для отключения режима используется функция mkl_mic_disable():

Выгрузка с поддержкой от компилятора. В этом режиме процесс выгрузки (переноса) вычислительного кода на ускоритель Intel Xeon Phi задается в программе с помощью директив компилятора.

#pragma offload target(mic) \ in(maxfct, mnum, mtype, phase) \ in(n) \ in(nrhs) \ in(msglvl) \ out(error) \ in(pt:length(64)) \ in(p_a:length(18)) \ in(p_ia:length(9)) \ in(p_ja:length(18)) \ in(iparm:length(64)) \ in(p_b:length(8)) \ in(p_x:length(8)) \ out(p_x:length(8) alloc_if(0))

pardiso(pt, &maxfct, &mnum, &mtype, &phase, &n, p_a, p_ia, p_ja, &idummy, &nrhs,

В данном примере дано описание входных и выходных данных для передачи в математическую функцию pardiso(), код которой будет выполнен на ускорителе. Функция pardiso() используется для решения большой разреженной линейной системы уравнений, поддерживает работу с различными типами матриц.

Следует отметить, что данный способ не гарантирует увеличения производительности вычислений.

Выполнение кода только на ускорителях. В данном режиме код библиотеки выполняется только на ускорителях Intel Xeon Phi, исключая хост-процессоры. Во время выполнения команды mpirun (mpiexec.hydra) создается однородная подсеть из вычислительных узлов, содержащих только ускорители, которые взаимодействуют между собой и обмениваются данными посредством MPI-сообщений.

Для создания исполняемого файла, который может быть выполнен на ускорителе, используется ключ «-mmic». Унаследованный код, предназначенный для выполнения на CPU, может быть легко собран для выполнения на ускорителе. Для этого достаточно при сборке приложения указать ключ «-mmic».

Более подробные сведения о режимах использования библиотеки Intel MKL можно узнать в работе [9].

Примеры использования математической библиотеки Intel MKL

в параллельных программах на языке Т++

Первый набор Т-программ. Рассмотрим несколько простых Т-программ. Первая Т-програм-ма состоит из трех Т-функций: главной Т-функции tfun int main() и двух вспомогательных — t1() и t2(). Каждая вспомогательная Т-функция выполняет умножение двух матриц простым способом, используя тройной вложенный цикл, а затем в результирующей матрице считает сумму абсолютных значений всех ее элементов. Данное число возвращается Т-функцией в качестве выходного (tout) готового значения. Матрицы, участвующие в операции умножения, инициализируются случайным образом. Главная Т-функция осуществляет вызов вспомогательных Т-функций и ожидает завершения их выполнения. Она получает от вспомогательных Т-функций значения сумм абсолютных значений элементов результирующих матриц и вычисляет минимальное из двух значений. Результат выводится на экран. Отметим, что данная Т-программа не использует возможности математической библиотеки Intel MKL.

Компиляция и компоновка кода. Соберем нашу Т-программу для выполнения на хост-узлах и для выполнения на ускорителях Intel Xeon Phi.

Сборка Т-программы для хост-узла выполняется командой

$ t++ -opt t-simple_mult_sum_test.tcc -o t-simple_mult_ sum_test

Сборка Т-программы для сопроцессора Intel Xeon Phi выполняется командой $ t++ -opt -mmic t-simple_mult_sum_test.tcc -o t-simple_ mult_sum_test.mic

Запуск Т-программы на выполнение. Все эксперименты будем проводить на суперкомпьютере «РСК Торнадо ЮУрГУ», разработанном группой компаний «РСК» [10].

Вычислительный кластер представляет собой 480 вычислительных узлов и два сервера (управления и доступа пользователей), объединенных между собой с помощью транспортной сети Infiniband и двух Ethernet-сетей (мониторинга и управления заданиями). Вычислительные узлы имеют сквозную нумерацию вида «nodeXXX» (где Х — число от 001 до 480). Каждый вычислительный узел имеет в своем составе

Программные продукты и системы / Software & Systems

— сопроцессор Intel Xeon Phi с именем вида «nodeXXX-mic0»; внутри вычислительного узла возможна адресация по «mic0»;

— сетевой интерфейс Infiniband (имя ГЬ0 в пределах узла или nodeXXX-ib0 в пределах кластера);

— сетевой интерфейс Ethernet (eth0).

Для запуска MPI-программ (в нашем случае Т-программ) на выполнение используется планировщик задач SLURM [11]. MPI-программы могут быть запущены на кластере как в интерактивном, так и в пакетном режимах. В интерактивном режиме пользователь либо использует для запуска команду srun, либо самостоятельно выделяет необходимое количество ресурсов (вычислительных узлов), а затем выполняет команду mpiexec.hydra. В пакетном режиме пользователь использует утилиту sbatch. Программа становится в очередь и будет выполнена, как только станут доступными необходимые для ее выполнения ресурсы. Результат выполнения программы будет записан в файл slurm.out.

Для управления версиями различных библиотек и пакетов на кластере установлен пакет Environmental Modules. Он позволяет гибко настраивать переменные окружения для пользовательских и пакетных задач. Пакет состоит из модулей. Каждый модуль содержит всю информацию, необходимую для настройки окружения под конкретное приложение. Например, настраиваются такие переменные окружения, как PATH, MANPATH, INCLUDE, LD_LIBRARY_PATH. Модули можно подгружать или выгружать вручную.

Для просмотра списка уже загруженных модулей нужно выполнить команду $ module list

i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Перед запуском Т-программы на выполнение необходимо загрузить модуль launcher/mic. Для этого выполним команду $ module load launcher/mic

Запустим Т-программу на двух узлах кластера в пакетном режиме. Для этого используем утилиту sbatch и скрипт symmetric_run_tcp.sh:

$ sbatch -N 2 -p quick symmetric_run_tcp.sh —ppn=1 —ppnmic=0 $HOME/t-simple_mult_sum_test

В команде используются следующие опции:

-N — количество запрашиваемых вычислительных узлов;

-p [comm | quick] — очередь (comm — коммерческая, quick — тестовая);

Будут запущены два MPI-процесса: по одному на каждом узле.

Просмотреть очередь задач можно командой

Теперь запустим Т-программу на двух сопроцессорах Intel Xeon Phi. Для этого опять использу-

ем утилиту sbatch и скрипт symmetric_run_tcp.sh:

$ sbatch -N 2 -p quick symmetric_run_tcp.sh —ppn=0 —ppnmic= 1 $HOME/t-simple_mult_sum_test

Будут запущены два MPI-процесса: по одному на каждом из ускорителей Intel Xeon Phi. Время выполнения Т-программы t-simple_mult_sum_test на двух хост-узлах и время выполнения на двух ускорителях приведено в таблице.

Возникает вопрос: можно ли как-то оптимизировать код и повысить эффективность и, как следствие, производительность вычислений. Попробуем поднять оптимизацию. Для этого соберем Т-программу с ключом «-03».

Сборка Т-программы для выполнения на хостузле выполняется командой

$ t++ -opt -O3 t-simple_mult_sum_test.tcc -o t-simple_mult_sum_test

Сборка Т-программы для сопроцессора Intel Xeon Phi — командой

$ t++ -opt -O3 -mmic t-simple_mult_sum_test.tcc -o t-simple_mult_sum_test.mic

Время выполнения Т-программы t-simple_ mult_sum_test, собранной с ключом «-03», на двух хост-узлах и время выполнения на двух ускорителях Intel Xeon Phi приведены в таблице.

Из полученных результатов можно сделать вывод: применение ключа оптимизации «-03» сократило время выполнения Т-программы почти в два раза.

Рассмотрим следующую Т-программу. По функциональности она выполняет ту же работу, что и первая Т-программа, рассмотренная выше. Только теперь Т-программа будет использовать возможности математической библиотеки Intel MKL. Нам важно увидеть, насколько применение библиотеки Intel MKL сможет повысить эффективность выполнения Т-программы. Теперь Т-программа перемножения матриц будет использовать функцию cblas_dgemm(), а для вычисления суммы абсолютных значений всех элементов результирующих матриц — функцию cblas_dasum() из библиотеки подпрограмм для линейной алгебры BLAS (Basic Linear Algebra Subprograms) [12]. Для выделения памяти под входные и результирующие матрицы во вспомогательных Т-функци-ях будем использовать функцию mkl_malloc() из библиотеки Intel MKL. Она позволяет выделять память под объекты, выровненную по границе 64 байта, для повышения производительности вычислений.

Соберем нашу Т-программу для выполнения на хост-узлах и для выполнения на ускорителях Intel Xeon Phi. Для подключения математической библиотеки Intel MKL используем ключ «-mkl».

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

$ t++ -opt -mkl t-mkl_test.tcc -o t-mkl_test Сборка Т-программы для сопроцессора Intel Xeon Phi:

$ t++ -opt -mmic -mkl t-mkl_test.tcc -o t-mkl_test.mic

Программные продукты и системы / Software & Systems

Сравнительная таблица времени выполнения Т-программ Comparison table T-programs execution time

Т-программа Время выполнения Т-программы, сек.

На двух хост-узлах На двух ускорителях Intel Xeon Phi

t-simple mult sum test, собранной с ключом «-O2» 4,02 327,9

t-simple mult sum test, собранной с ключом «-O3» 2,29 176,5

t-mkl test, собранной с ключом «-mkl», использующей возможности библиотеки Intel MKL 0,68 1,66

t-simple dot product test 3,84 7,02

t-mkl dot product test, собранной с ключом «-mkl», использующей возможности библиотеки Intel MKL 3,15 6,39

Перед запуском Т-программы предварительно установим переменную окружения LD_LIBRA-RY_PATH:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: $MKLROOT/lib/mic: $MKLROOT/.. / compiler/lib/mic

В переменную окружения LD_LIBRARY_ PATH добавлены пути для поиска динамических библиотек: libmkl_core.so, libmkl_intel_thread.so, libmkl_intel_lp64.so, libiomp5. so.

Время выполнения Т-программы t-mkl_test, использующей возможности математической библиотеки Intel MKL, на двух хост-узлах и время выполнения на двух ускорителях приведены в таблице.

Второй набор Т-программ. Рассмотрим следующий пример. Т-программа состоит из трех Т-функций: главной Т-функции tfun int main() и двух вспомогательных — t1() и t2(). Каждая вспомогательная Т-функция вычисляет скалярное умножение двух векторов размерности 134 217 728 чисел типа double, и результат возвращается в качестве выходного значения. При этом для умножения векторов используется обычный цикл. Результат возвращается в главную Т-функцию. Главная Т-функция запускает и ожидает завершения выполнения Т-функций и печатает сумму двух вычисленных сумм. Данная Т-программа не использует возможности математической библиотеки Intel MKL.

Сборка Т-программы для хост-узла выполняется командой

$ t++ -opt t-simple_dot_product_test.tcc -o t-simple_ dot_product_test

Сборка Т-программы для сопроцессора Intel Xeon Phi — командой

$ t++ -opt -mmic t-simple_dot_product_test.tcc -o t-simple_dot_product_test.mic

Время выполнения Т-программы на двух хостузлах и время выполнения на двух ускорителях приведены в таблице.

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

перь Т-программа для скалярного умножения двух векторов будет использовать функцию cblas_ ddot() из библиотеки подпрограмм для линейной алгебры BLAS [12]. Для выделения памяти под входные векторы во вспомогательных Т-функциях будем использовать функцию mkl_malloc() из библиотеки Intel MKL. Она позволяет выделять память под объекты, выровненную по границе 64 байта, для повышения производительности вычислений.

Сборка Т-программы для хост-узла с ключом «-mkl» выполняется следующим образом:

$ t++ -opt -mkl t-mkl_dot_product_test.tcc -o t-mkl_ dot_product_test

Сборка Т-программы для сопроцессора Intel Xeon Phi с ключом «-mkl»:

$ t++ -opt -mmic -mkl t-mkl_dot_product_test.tcc -o t-mkl_dot_product_test.mic

Время выполнения Т-программы, использующей возможности библиотеки Intel MKL, на двух хост-узлах и время выполнения на двух ускорителях представлены в таблице.

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

1. Абрамов С.М., Васенин В.А., Мамчиц Е.Е., Рога-нов В.А., Слепухин А.Ф. Динамическое распараллеливание программ на базе параллельной редукции графов. Архитектура программного обеспечения новой версии Т-системы // Науч. сессия МИФИ-2001: сб. науч. тр. Т. 2. М., 2001. С. 34-235.

2. Абрамов С.М., Кузнецов А.А., Роганов В.А. Кроссплатформенная версия Т-системы с открытой архитектурой // Параллельные вычислительные технологии (ПаВТ’2007): тр. Междунар. науч. конф. (29 января-2 февраля 2007 г., Челябинск). Челябинск: Изд-во ЮУрГУ. Т. 1. С. 115-121.

3. Абрамов С.М., Кузнецов А.А., Роганов В.А. Кроссплатформенная версия T-системы с открытой архитектурой // Вычислительные методы и программирование. 2007. Т. 8. № 1. Разд. 2. С. 175-180; URL: http://num-meth.srcc.msu.su/ (дата обращения: 04.09.2014).

4. Кузнецов А.А., Роганов В.А. Экспериментальная реализация отказоустойчивой версии системы OPENTS для платформы WINDOWS CCS // Суперкомпьютерные системы и их применение (SSA’2008): тр. 2-й Междунар. науч. конф. (27-29

Программные продукты и системы / Software & Systems

октября 2008 г., Минск). Минск: Изд-во ОИПИ НАН Беларуси, 2008. С. 65-70.

5. OpenTS. Руководство программиста. URL: http://www. opents.net/index.php/ru/ruk-progr (дата обращения: 04.09.2014).

6. Степанов Е.А. Планирование в OpenTS — системе автоматического динамического распараллеливания // Информационные технологии и программирование: межвуз. сб. стат.; [под ред. В.А. Васенина, Д.Л. Ревизникова, Е.А. Роганова]. М.: Изд-во МГИУ, 2005. Вып. 2 (14). С. 31-42.

7. Кузнецов А.А., Роганов В.А. Поддержка отказоустойчивых хранилищ данных в системе OpenTS // Программные системы: теория и приложения. 2011. № 3 (7); С. 53-60. URL: http://psta.psiras.ru/read/psta2011_3_53-60.pdf (дата обращения:

8. Intel Math Kernel Library Documentation. URL: http://

software.intel.com/en-us/articles/intel-math-kernel-library-docu-mentation/ (дата обращения: 04.09.2014).

9. Использование библиотеки Intel MKL при программировании на сопроцессоре Intel Xeon Phi. URL: http://www.intu-it.ru/studies/courses/10612/1096/lecture/22919 (дата обращения:

10. Суперкомпьютер «Торнадо ЮурГУ». URL: http://super-computer.susu.ac.ru/computers/tornado/ (дата обращения:

11. Планировщик задач SLURM. URL: https://computing. llnl.gov/linux/slurm/documentation.html (дата обращения:

12. Intel Math Kernel Library Reference Manual. URL: https://software.intel.com/sites/products/documentation/doclib/iss/2 013/mkl/mklman/index.htm (дата обращения: 04.09.2014).

DOI: 10.15827/0236-235X.109.043-048 Received 29.09.14

USING POSSIBILITIES OF INTEL MKL MATH LIBRARY IN PARALLEL PROGRAMS IN T++ LANGUAGE FOR A T-SYSTEM WITH AN OPEN ARCHITECTURE TO IMPROVE THEIR PERFORMANCE Roganov V.A., Research Associate, var@pereslavl.ru; Kuznetsov A. A., Research Associate, tonic@pereslavl.ru;

Matveev G.A, Leading Engineer Researcher, gera@prime.botik.ru;

Osipov V.I., Ph.D. (Physics and Mathematics), Research Associate, val@pereslavl.ru (Program System Institute of RAS, Petr I St. 4а, Pereslavl-Zalesskiy, 152021, Russian Federation)

Abstract. The problem of parallel computing is a problem of software. The most common approach to developing parallel programs is based on using software packages such as MPI (Message Passing Interface). This approach requires a large amount of knowledge from developer. Developing and debuging parallel programs is also time consuming. The PSI RAS has developed a T-system which implements automatic dynamic parallelization at runtime. Input language for T-system is T++, and applications developed for the T-system are T-applications or T-programs. This paper provides an overview of products and components of Intel Math Kernel Library (Intel MKL), which contains a large set of mathematical functions and can be used in parallel T-applications to accelerate computation and get maximum performance. The paper considers the modes of using the Intel MKL mathematical library on clusters with Intel Xeon processors and one or more Intel Xeon Phi accelerators (coprocessors) from Intel company. There are demo examples of using the library in C and T++. The paper shows how the use of Intel MKL math library affects the efficiency of parallel T-programs. All experiments has been performed on “RSC Tornado SUSU” energy-efficient supercomputer of the South Ural State University.

Keywords: T++ programming language, OpenTS, T-system, C++parallel extension, supercomputers, Intel MKL math library.

1. Abramov S.M., Vasenin V.A., Mamchits E.E., Roganov V.A., Slepukhin A.F. Dynamic program multisequencing based on parallel graph reduction. T-system new version software architecture. Nauchnaya sessiya M1F1-2001. Vol. 2 Informatika i upravlenie. Informatsionnye tekhnologii. Setevye tekhnologii. Parallelnye setevye tekhnologii [MEPhi-2001 scientific session. Informatics and Control. Informational technologies. Network technologies. Parallel Computing Technologies]. Collected papers. Moscow, 2001, pp. 234-235 (in Russ.).

2. Abramov S.M., Kuznetsov A.A., Roganov V.A. T-system cross-platform version with open architecture. Trudy Mezhdunar. nauch. konf “Parallelnye vychislitelnye tekhnologii (PAVT’2007) ” [Proc. of the Int. Scientific Conf. “Parallel Computational Technologies PCT’2007”]. Vol. 1, Chelyabinsk, 2007, pp. 115-121 (in Russ.).

3. Abramov S.M., Kuznetsov A.A., Roganov V.A. T-system cross-platform version with open architecture. Vychislitelnye metody i programmirovanie [Computational methods and programming]. 2007, vol. 8, no. 1, section 2, pp. 175-180, available at: http://num-meth.srcc.msu.su/ (accessed September 04, 2014).

4. Kuznetsov A.A., Roganov V.A. An experimental implementation of OPENTS system fault-tolerant version for WINDOWS CCS. Trudy 2 Mezhdunar. nauch. konf. “Superkomputernye sistemy i ikh primenenie (SSA’2008)” [Proc. of the 2nd Int. Scientific Conf. “Supercomputer Systems and Applications (SSA’2008)”]. Minsk, OIPI NAN Belarusi Publ., 2008, pp. 65-70 (in Russ.).

5. OpenTS. Progarmmer’s Guide. Available at: http://www.opents.net/index.php/ru/ruk-progr (accessed September 04, 2014).

6. Stepanov E.A. Scheduling in OpenTS — system with automatic dynamic parallelization. Informatsionnye tekhnologii i programmirovanie: mezhvuzovskiy sbornik statey [Informational technologies and Programming: interuniversity collection of articles]. Pod redaksiey V.A. Vasenin, D.L. Reviznikov, E.A. Roganov (Eds.). Moscow, MGIU Publ., 2005, iss. 2 (14). pp. 31-42 (in Russ.).

7. Kuznetsov A.A., Roganov V.A. Supporting fault-tolerant data storage in OpenTS system. Elektronny Nauchny Zhurnal: “Programmnye systemy: teoriya i prilozheniya” [Electronic scientific journ.: “Program systems: theory and applications”]. 2011, no. 3 (7), pp. 53-60. Available at: http://psta.psiras.ru/read/psta2011_3_53-60.pdf (accessed September 04, 2014).

8. Intel Math Kernel Library Documentation. Available at: http://software.intel.com/en-us/articles/intel-math-kernel-library-documentation/ (accessed September 04, 2014).

9. Ispolzovanie biblioteki Intel MKL pri programmirovanii na soprotsessore Intel Xeon Phi [The use of Intel MKL library when programming in Intel Xeon Phi accelerator]. Available at: http://www.intuit.ru/studies/courses/10612/1096/lecture/22919 (accessed September 04, 2014).

10. Supercomputer “Tornado YuUrGU” [Supercomputer “YuUrGU Tornado”]. Available at: http://supercomputer.susu. ac.ru/computers/tornado/ (accessed September 04, 2014).

11. Planirovshchik zadach SLURM [SLURM Task Scheduler]. Available at: https://computing.llnl.gov/linux/slurm/docu-mentation.html (accessed September 04, 2014).

12. 1ntel Math Kernel Library Reference Manual. Available at: https://software.intel.com/sites/products/documenta-

i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

tion/doclib/iss/2013/mkl/mklman/index.htm (accessed September 04, 2014).

Как подключить библиотеку mkl в intel fortran

Профиль
Группа: Участник
Сообщений: 23
Регистрация: 23.10.2009

Репутация: нет
Всего: нет

Здравствуйте!
Мне тут уже несколько раз помогали. Решила обратиться с новой проблемой.
Для вычислительной задачи мне понадобилась математическая библиотека. Выбор пал на IMSL 7.0. Скачала на Торрентах (не сочтите за рекламу ), там многие отписывались, что установили библиотеку и все работает, поэтому полагаю, что исходники нормальные.

Итак, прописала путь к библиотеке в Tools -> Options . Compiler -> Libraries и Includes; прописала в Projects, в Additional Library Directories путь к папке lib с файлами; в Projects, в Additional Dependencies прописала список библиотек.

Но простая программулька:

дает следующую ошибку:

Код
1>LINK : fatal error LNK1104: cannot open file ‘mkl_intel_c.lib’

Как ни странно, этого файла нет ни в папке IMSL, ни в папке с Fortran’ом, то есть просто прописать путь к нему я не могу.
Подскажите, пожалуйста, зачем нужен этот файл mkl_intel_c.lib? Или может я неправильно подключаю библиотеку IMSL?

Дата 1.3.2011, 11:39 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9

Привет, OlikFleur,
Насчет IMSL 7 точно не знаю, но в более ранних версиях IMSL, насколько помню, можно было сделать примерно так
1) сделать доступной директорию /include/ia32 или ia32_s (последнее для статической версии IMSL) — например, включить ее в список директорий, автоматически просматриваемых фортран-окружением на предмет включамых (заголовочных и пр.) файлов;
2) сделать доступной директорию /lib/ia32 или ia32_s (последнее для статической версии IMSL) — например, включить ее в список директорий, автоматически просматриваемых фортран-окружением на предмет библиотечных файлов;
3) добавить в фортран-исходники одну из cтрок:
include ‘link_f90_static.h’ — для использования статической версии IMSL
include ‘link_f90_static_smp.h’ — для использования статической версии + Intel MKL
include ‘link_f90_dll.h’ — для использования динамической версии IMSL
include ‘link_f90_static_smp.h’ — для использования динамической версии + Intel MKL

Данные .h-файлы просто содержат директивы автоматической линковки соответствующих библиотек.

Покажи, как выглядит файл ‘link_fnl_static.h’ , включаемый в твоем примере.

PS/ Gamma-функция (и ряд других спецфункций) включена в стандарт Фортран-2008 и должна поддерживаться последними версиями Intel Fortran (>=12) и gfortran.

Это сообщение отредактировал(а) FCM — 1.3.2011, 12:51

Дата 1.3.2011, 17:23 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 23
Регистрация: 23.10.2009

Репутация: нет
Всего: нет

Указанные пути я прописала. Только у меня хедеры для библиотеки имеют вид «link_fnl. «, а не «link_f90. «.

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

Вот, как выглядит файл ‘link_fnl_static.h’:

Код
!dec$objcomment lib:’imsl.lib’
!dec$objcomment lib:’imslsuperlu.lib’
!dec$objcomment lib:’imslhpc_l.lib’
!dec$objcomment lib:’imsllapack_vendor.lib’
!dec$objcomment lib:’imslblas_vendor.lib’
!dec$objcomment lib:’imsls_err.lib’
!dec$objcomment lib:’imslmpistub.lib’
!dec$objcomment lib:’mkl_intel_c.lib’
!dec$objcomment lib:’mkl_intel_thread.lib’
!dec$objcomment lib:’mkl_core.lib’
!dec$objcomment lib:’libiomp5md.lib’
!dec$objcomment lib:’lmgr.lib’
!dec$objcomment lib:’kernel32.lib’
!dec$objcomment lib:’user32.lib’
!dec$objcomment lib:’netapi32.lib’
!dec$objcomment lib:’advapi32.lib’
!dec$objcomment lib:’gdi32.lib’
!dec$objcomment lib:’comdlg32.lib’
!dec$objcomment lib:’comctl32.lib’
!dec$objcomment lib:’wsock32.lib’
!dec$objcomment lib:’libcrvs.lib’
!dec$objcomment lib:’libFNPload.lib’
!dec$objcomment lib:’libsb.lib’

Дата 1.3.2011, 18:26 (ссылка) | (нет голосов) Загрузка .

Как подключить библиотеку mkl в intel fortran

Изготовление исполнимых программ из исходных текстов выполняется с помощью компиляторов, переводящих исходный текст программы в эквивалентную ей результирующую программу на языке машинных команд. Основными языками программирования на высокопроизводительных вычислительных системах являются С/C++ и Фортран . Язык С создавался как язык для написания системных приложений, однако в последнее время широко применяется и для написания вычислительных программ. Язык программирования Фортран изначально разрабатывался для написания вычислительных программ. Для него разработано множество библиотек прикладных подпрограмм, в которых реализованы различные вычислительные алгоритмы. Например, библиотека LAPACK содержит широчайший набор подпрограмм для решения различных задач линейной алгебры.

Синтаксис команды компиляции имеет вид:

компилятор [опции] файлы [библиотеки]

  • Здесь компилятор — команда вызова компилятора;
  • основные опции:
  • -o — создать выходной файл с заданным именем (без опции создается a.out);
  • -c — не изготавливать исполнимый модуль (при компиляции подпрограмм);
  • -O -O1,-O2,-O3 — задание уровня оптимизации;
  • -g — выполнить компиляцию в отладочном режиме;
  • файлы — компилируемые файлы;;
  • библиотеки — подключаемые библиотеки.

В квадратных скобках указываются необязательные компоненты команды.

На UNIX-подобных системах имеется множество компиляторов. Большая часть из них является коммерческими продуктами. Для систем Linux пакет GCC является неотъемлемой частью дистрибутивов, поскольку является базовым компилятором сборки ядра системы и всех ее утилит.

Пакет компиляторов GCC

В него входят компиляторы:

  • gcc — компилятор языка С;
  • g++ — компилятор языка С++;
  • gfortran — компилятор языка Фортран95.

Компиляторы GCC оптимизирующие, поддерживающие три уровня оптимизации (опции -O1, -O2, -O3). На разных программах более эффективной может оказаться та или другая опция. В большинстве случаев наиболее приемлемой бывает опция -O2, при этом ускорение программы может достигать 2-3 раз. Типичные команды компиляции:

  • gcc -O2 -o prog prog.c — для языка С;
  • gfortran -O2 -o prog prog.f — для языка Фортран.

Помимо этого, на Linux кластерах, являющихся сегодня основным видом высокопроизводительных вычислительных систем, широко используется пакет компиляторов Intel Compiler, наилучшим образом оптимизированный под платформу x86-64, являющуюся основной при построении вычислительных кластеров. Это коммерческй продукты и он приобретен Вычислительным центром СПбГУ.

Пакет компиляторов Intel
  • icc — компилятор языка С;
  • icpc — компилятор языка С++;
  • ifort — компилятор языка f77, f90, f95.

Компиляторы также поддерживают три уровня оптимизации (опции -O1, -O2, -O3, задание опции -O соответствует уровню -O2). Сочетание опций -fast -On, задает режим максимального ускорения программы на соответствующем уровне оптимизации. Для отлаженных программ включение оптимизации обязательно. В большинстве случаев ускорение работы программы может достигать 2-3 раз.

  • icc -O2 -o prog prog.c — для языка С;
  • ifort -O2 -o prog prog.f — для языка Фортран.

Рассмотрим подробнее работу с компилятором gcc.

Создадим файл с именем ex1.c с помощью команды touch. Откроем его в текстовом редакторе и наберем текст программы на языке С.

Программа ex1.c #include int main(int argc, char* argv[])

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

Если программа написана без ошибок, то никакой выдачи информации на терминал не будет, а в рабочем каталоге появится файл с именем a.out. Это исполнимый файл, полученный в результате компиляции программы. Его можно запустить на исполнение(поэтому файлы и называются исполнимыми), набрав в командной строке:

На терминал будет напечатана строка «Hello word».

Для того чтобы поменять имя создаваемого файла c a.out на любое другое необходимо использовать опцию -o:

gcc -o ex1 ex1.c

В результате будет создан исполнимый файл с именем ex1.

Приведем несколько важных опций компилятора gcc (они справедливы и для icc)

  • -o файл — Поместить вывод в файл ‘файл‘. Эта опция применяется вне зависимости от вида порождаемого файла, является ли это выполнимый файл, объектный файл, ассемблерный файл или препроцессированный C код. Если ‘-o‘ не указано, по умолчанию выполнимый файл помещается в ‘a.out‘, объектный файл для ‘исходный.суффикс‘ — в ‘исходный.o‘, его ассемблерный код в ‘исходный.s‘ и все препроцессированные C файлы — в стандартный вывод.
  • -c — Компилировать или ассемблировать исходные файлы, но не линковать. Стадия ликовки просто не выполняется. Конечный вывод происходит в форме объектного файла для каждого исходного файла.
  • -g — Порождает отладочную информацию.
  • -O,-O1,-O2,-O3 — Задание уровня оптимизации оптимизации
  • -Iдиректория — Добавляет каталог ‘директория‘ в начало списка каталогов, используемых для поиска заголовочных файлов. Ее можно использовать для подмены системных заголовочных файлов, подставляя ваши собственные версии, поскольку эти директории просматриваются до директорий системных заголовочных файлов. Если используется более чем одна опция ‘-I‘, директории просматриваются в порядке слева на право; стандартные системные директории просматриваются последними.
  • -Lдиректория — Добавляет каталог ‘директория‘ в начало списка каталогов, используемых для поиска библиотек
  • -lбиблиотека — Подключает библиотеку с именем lib’библиотека’.so

Рассмотрим назначение опций более подробно на примерах.

В программах часто используются уже написанные ранее функции. Например, в приведенной выше программе, применялась системная функция вывода информации в стандартный поток printf. Для того чтобы транслятор на этапе создания программы, мог правильно обработать внешнюю функцию необходимо ее предварительно описать, либо внутри программы, либо в специальном заголовочном файле. Такие файлы еще называют include файлами, в языке С они подключаются с помощью специальной директивы #include. На первом этапе трансляции программы, запускается так называемый препроцессор, он находит файл с именем stdio.h, и вставляет его содержимое внутрь программы. Пути поиска задаются с помощью опции

-Iдиректория,
где директория — путь к каталогу, в котором расположен данный файл.

Если используется стандартный заголовочный файл, то опцию -I для его поиска в командной строке компиляции программы указывать необязательно. Существует специальный каталог, где располагаются стандартные заголовочные файлы. Препроцессор автоматически просматривает его при поиске заголовочных файлов. Все сказанное в полной мере относится и к компилятору с языка Фортран. Отличие состоит в синтаксисе подключения include файла:

include ‘файл.h’

Если в команде компиляции не указана опция -c, то компилятор автоматически выполняет операцию компоновки, т.е. изготовление исполнимой программы. В примере для вывода строки «Hello word» применялась стандартная функция printf, следовательно, код этой функции должен быть вставлен в программу. Операцию объедения кода программы и кода внешних функций выполняет компоновщик. Компоновщик (или линковщик — linker) — программа, которая производит компоновку, принимает на вход один или несколько объектных модулей и собирает из них исполняемый модуль. Объектный модуль (или объектный файл — object file) — это файл с промежуточным представлением отдельного модуля программы, полученный в результате обработки исходного кода компилятором. Объектный файл содержит в себе особым образом подготовленный код (часто называемый бинарным), который может быть объединён с другими объектными файлами при помощи редактора связей (линковщика) для получения готового исполняемого модуля либо библиотеки.

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

Программа ex2.c #include #include int main(int argc, char *argv[])

Эта программа вычисляет результат возведения в степень 0.1 числа 2 и присваивает результат переменной res и затем выводит ее значение на стандартный поток вывода. Возведение в степень осуществляет функция pow. Заголовочный файл, в котором описан заголовок для этой функции, подключается директивой #include , являющимся стандартным заголовочным файлом для библиотеки математических подпрограмм.

Попробуем скомпилировать программу командой:

gcc -o ex2 ex2.c

В результате получим следующие сообщение об ошибке:

/tmp/ccgSk9AB.o(.text+0x49): In function `main’:
ex2.c: undefined reference to `pow’
collect2: ld returned 1 exit status

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

gcc -o ex2 ex2.c -lm

В результате будет создана программа с именем ex2, которая при запуске напечатает:

Подключение библиотеки было выполнено с помощью опции -lm. Файл этой библиотеки находится в каталоге /usr/lib. Полное его название libm, имена файлов библиотек подпрограмм всегда начинаются с префикса lib, за которым идет название библиотеки. При подключении библиотеки к программе в строке компилятора префикс lib заменяется на -l. Таким образом, подключение библиотеки libm осуществляется опцией -lm. Поскольку библиотека стандартная, находится в специальном каталоге, то нет необходимости указывать путь поиска файла библиотеки математических подпрограмм с помощью опции -L. Компилятор сам найдет его в директории /usr/lib. Работа с библиотеками имеет ряд аспектов, которые нуждаются в более подробном рассмотрении.

В рассмотренном ранее примере было упомянуто, что стандартная математическая библиотека находится в системном каталоге /usr/lib. Однако если перейти в каталог /usr/lib, и попробовать найти там файл с именем libm, то такого файла там нет. Зато есть два файла с именами libm.a и libm.so. Почему два и с разными расширениями? Потому что большинство UNIX-подобных систем поддерживают два типа компоновки — статическую и динамическую.

Динамические библиотеки, называемые также библиотеками общего пользования или разделяемыми библиотеками (shared library), загружаются на этапе выполнения программы. Код вызываемых функций не встраивается внутрь исполняемой программы, а вызывается по мере необходимости при запуске программы на исполнение. Такой подход позволяет создавать программы значительно меньшего объема. Динамические библиотеки хранятся обычно в определенном месте и имеют стандартное расширение. В ОС Windows файлы библиотек общего пользования имеют расширение .dll, а в UNIX-подобных системах .so. Если на этапе загрузки программы система не смогла найти необходимый код, то программа не запустится. Будет выдано сообщение об ошибке:

error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory

Статические библиотеки в виде пакетов объектных файлов, присоединяются (линкуются) к исполнимой программе на этапе компиляции (в Windows такие файлы имеют расширение .lib, а в UNIX-подобных .a). В результате этого программа включает в себя все необходимы функции, что делает её автономной, хорошо переносимой, но увеличивает размер.

Статическая библиотека создается специальной командой:

ar rc libимя.a список_объектных_файлов

Объектные файлы создаются компиляцией функций с опцией -c. Рекомендуется каждую функцию (или подпрограмму в Фортране) оформлять в отдельном файле.

Динамическая библиотека создаются компилятором:

gcc -shared -o libимя.so список_объектных_файлов

Для создания объектных файлов компиляция выполняется с опциями -fPIC -c. Опция -fPIC (PIC — Position Independent Code) означает создание позиционно-независимого кода.

Все библиотеки обычно хранятся в каталоге lib. Если с одним и тем же именем имеется две библиотеки и статическая и динамическая, то по умолчанию линковщик будет использовать динамическую библиотеку. Предположим, что в домашнем каталоге пользователя имеется подкаталог lib и в нем находятся два библиотечных файла: libmy.a и libmy.so. Подкаталог includeсодержит заголовочный файл. Тогда команда компиляции
gcc -o prog_shared prog.c -I~/include -L~/lib -lmy
будет использовать динамическую библиотеку.

Для создания исполнимого файла со статической библиотекой потребуется команда:

gcc -static -o prog_static prog.c -I~/include -L~/lib -lmy

Мы создали две версии программы: с использованием динамической и статической библиотек. Во втором случае использовалась опция -static, чтобы компилятор использовал статическую библиотеку libmy.a. Если бы динамической версии библиотеки не было, то эту опцию можно было бы не указывать. Компилятор, не найдя динамической библиотеки автоматически подключает статическую библиотеку. Опция -I~/include заставляет искать заголовочные файлы в пользовательском подкаталоге include. Заметим, что в Фортране использование заголовочных файлов не требуется, и include файлы используются для других целей — определения констант и параметров. Опция -L~/lib указывает компилятору, что при сборке программы, помимо стандартных путей, следует искать библиотеки и в директории lib домашнего каталога пользователя.

При запуске на исполнение разные версии программы, скорее всего, поведут себя по-разному:

  • команда
  • ./prog_static — выполнится без проблем;
  • а при запуске
  • ./prog_shared — программа завершится с ошибкой:
  • prog_shared: error while loading shared libraries: libmy.so: cannot open shared object file: No such file or directory

Дело в том, что в момент загрузки программы, система ищет необходимые для запуска программы разделяемые библиотеки, чтобы собрать исполнимую программу. Поиск идет по заранее установленному списку директорий. Имена директорий перечислены в системном файле /etc/ld.so.conf. Очевидно, что в этот файл невозможно занести все индивидуальные каталоги пользователей. В этой ситуации на помощь приходят переменные окружения. Как уже говорилось ранее, в UNIX системах существует специальная переменная LD_LIBRARY_PATH, в которой каждый пользователь может перечислить директории для поиска разделяемых библиотек. Добавим к переменной LD_LIBRARY_PATH путь к директории lib, где находится библиотека libmy.so. Делается это командой

export LD_LIBRARY_PATH=$:~/lib (bash)
setenv LD_LIBRARY_PATH $:~/lib (tcsh)

Данной командой мы к ранее установленному значению добавили путь к персональному каталогу пользователя с библиотечными файлами. Если теперь запустить программу
./prog_shared
то она сработает корректно.

Предпочтительное использование динамических библиотек обусловлено тем, что размеры исполнимых модулей в десятки раз меньше, чем у статических. Все системные утилиты собираются с использованием динамических библиотек. А поскольку в системе их несколько тысяч, то экономятся гигантские объемы дискового пространства. Кроме того, исполнимые файлы с использованием динамических библиотек более мобильны. В качестве примера рассмотрим типичную ситуацию. В организации имеется два кластера с различной коммуникационной средой — Ethernet и Infiniband. Если использовать статические MPI библиотеки, то для каждого кластера нужно иметь свою версию программы, а если использовать динамические библиотеки, то программы становится совместимыми. При запуске программы на каждом кластере будет вызываться своя версия коммуникационной библиотеки. Еще одно преимущество динамических библиотек состоит в том, что при обновлении системной библиотеки не потребуется пересборка всех системных утилит и программ пользователей.

При использовании большого количества библиотек и include файлов команда компиляции может оказаться довольно длинной. Чтобы упростить компиляцию, часто используют командные файлы (скрипты), выступающих в качестве интерфейсов к стандартным компиляторам. Такой подход используется в пакете MPI. При сборке библиотек формируются командные файлы для вызова тех или иных компиляторов. Компиляция параллельных MPI-программ выполняется командами:

  • mpif77 -O -o progname progname.f — на языке Фортран
  • mpicc -O -o progname progname.c — на языке С
  • mpicxx -O -o progname progname.cc — на языке С++

Здесь mpif77, mpicc, mpicxx — командные скрипты, вызывающие стандартные компиляторы с настройкой путей к необходимым include-файлам и подключением всех необходимых коммуникационных библиотек библиотек. Использование таких скриптов, в свою очередь, порождает некоторые проблемы. Дело в том, что практически на любом вычислительном кластере имеется множество версий коммуникационных библиотек. Это, во-первых, связано с необходимостью обновления установленных версий, а, во-вторых, с тем, что поставщики коммуникационного программного обеспечения, как правило, предоставляют множество реализаций коммуникационных библиотек. Например, в состав коммуникационного пакета OFED входят три различных реализации MPI (MVAPICH, MVAPICH2, OpenMPI), которые к тому же собираются всеми имеющимися в системе компиляторами. К сожалению, все эти версии не совместимы друг с другом, и поэтому очень важно при работе с MPI программами соблюсти синхронность в использовании коммуникационных библиотек. Это означает, что если программа откомпилирована с использованием некоторой версии MPI, то нужно быть уверенным, что при запуске программы на выполнение будет использована та же самая версия MPI, т.е. будет использована команда mpirun из этой же версии пакета, и будут подключены нужные версии динамических библиотек. Это достигается соответствующими настройками переменных окружения PATH и LD_LIBRARY_PATH.

PARALLEL.RU — Информационно-аналитический центр по параллельным вычислениям

Наряду со стандартными для 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.

Характеристики компиляторов Intel

  • Значительная оптимизация
    видимо, здесь имеется в виду оптимизация кода еще на высоком уровне, т.е. прежде всего, различные преобразования циклов, что с большим или меньшим успехом делают почти все компиляторы
  • Оптимизация вычислений с плавающей точкой
    видимо, имеется в виду прежде всего максимальное использование команд, реализованных на аппаратном уровне
  • Межпроцедурные оптимизации
    т.е. глобальная оптимизация всей программы, в отличие от обычной оптимизации, которая затрагивает только код конкретных функций
  • Оптимизация на базе профилей
    т.е. возможность прогнать программу в тестовом режиме, собрать данные о времени прохождение тех или иных фрагментов кода внутри часто используемых функций, а затем использовать эти данные для оптимизации
  • Поддержка системы команд SSE в процессорах Pentium III
    примечание: для вычислительных задач больший интерес представляют команды SSE2, т.е. векторные команды над 64-разрядными вещественными числами, но они поддерживаются только в процессорах Pentium 4, которых в нашем распоряжении пока нет
  • Автоматическая векторизация
    т.е. опять же, использование команд SSE и SSE2, вставляемых автоматически компилятором
  • Поддержка OpenMP для программирования на SMP-системах
    примечание: на кластере рекомендуется преимущественно пользоваться интерфейсом MPI; широкое использование OpenMP на кластере не предполагается и таких экспериментов пока не проводилось; но, вероятно, имеет смысл пользоваться библиотеками (BLAS и др.), распараллеленными для общей памяти.
  • Предвыборка данных
    т.е. видимо, использование команд предварительной загрузки из памяти в кэш данных, которые понадобятся через некоторое время
  • «Диспетчеризация» кода для различных процессоров
    т.е. возможность генерации кода для различных процессоров в одном исполняемом файле, что позволяет использовать преимущества новейших процессоров для достижения на них наибольшей производительности, при сохранении двоичной совместимости программ с более ранними процессорами; на нашем кластере это пока не актуально, т.к. используются только процессоры Pentium III, а также не предполагается передача и запуск на других машинах программ, откомпилированных на кластере

Основные опции компиляторов

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

Уровни оптимизации ОпцияОписание -O0Отключает оптимизацию -O1 или -O2 Базовая оптимизация на скорость работы. Отключается инлайн-вставка библиотечных функций. Для компилятора С++ эти опции дают одинаковую оптимизацию, для компилятора Фортрана опция -O2 предпочтительнее, т.к. включает еще раскрутку циклов. -O3 Более мощная оптимизация, включая преобразования циклов, предвыборку данных, использование OpenMP. На некоторых программах может не гарантироваться повышенная производительность по сравнению с -O2. Имеет смысл использовать вместе с опциями векторизации -xK и -xW. -unroll[n] Включает раскрутку циклов до n раз. Оптимизации под конкретный процессор ОпцияОписание -tpp6 Оптимизация для процессоров Penitum Pro, Pentium II и Pentium III -tpp7 Оптимизация для процессоров Penitum 4 (эта опция включена по умолчанию для компилятора на IA-32) -xM Генерация кода с использованием расширений MMX, специфических для процессоров Pentium MMX, Pentium II и более поздних -xK Генерация кода с использованием расширений SSE, специфических для процессоров Pentium III -xW Генерация кода с использованием расширений SSE2, специфических для процессоров Pentium 4 Межпроцедурная оптимизация -ip Включается межпроцедурная оптимизация внутри одного файла. Если при этом указать опцию -ip_no_inlining, то отключаются инлайн-вставки функций. -ipo Включается межпроцедурная оптимизация между различными файлами Оптимизации с использованием профилей -prof_gen Генерируется «профилировочный» код, который будет использован для профилировки, т.е. сбора данных о частоте прохождения тех или иных мест в программе -prof_use Производится оптимизация на основе данных, полученных на этапе профилировки. Имеет смысл использовать вместе с опцией межпроцедурной оптимизации -ipo. Распараллеливание для SMP-систем -openmp Включается поддержка стандарта OpenMP 2.0 -parallel Включается автоматическое распараллеливание циклов

Производительность

Согласно результатам прогона тестов 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).

  • libcprts.a — runtime-библиотека языка С++ разработки Dinkumware.
  • libcxa.a — дополнительная runtime-библиотека для С++ разработки Intel.
  • libimf.a — библиотека математических функций разработки Intel, в которую входят оптимизированные и высокоточные реализации тригонометрических, гиперболических, экспоненциальных, специальных, комплексных и других функций (подробнее см. список функций).
  • libirc.a — runtime-поддержка профилировки (PGO) и «диспетчеризации» кода в зависимости от процессора (см. выше).
  • libguide.a — реализация OpenMP.

В этом списке перечислены статических библиотек, но для большинства из них существуют также динамические, т.е. подключаемые во время запуска, варианты (.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 и GCC

Объектные модули на языке Си, полученные компилятором 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.

Ссылки

  • developer.intel.com — сайт Интел (англоязычный) для производителей компьютерной техники и разработчиков программного обеспечения;
    • Intel Software development products. Страница содержит ссылки на страницы о компиляторах C++ и Фортран и о других средствах разработки.
    • Форум для пользователей компилятора Intel C++
    • Форум для пользователей компилятора Intel Fortran для Linux

    • Intel C++ Compiler User’s Guide.
    • Intel Fortran Compiler User’s Guide.

    • Руководство пользователя по компилятору Intel С++: Intel C++ Compiler User’s Guide (1.3 Мбайт, 395 страниц).
    • Руководство пользователя по компилятору Intel Fortran: Intel Fortran Compiler User’s Guide (1.1 Мбайт, 285 страниц).
    • Справочник программиста на языке Фортран: Intel Fortran Programmer’s Reference (7 Мбайт, 566 страниц).
    • Справочник по библиотекам для языка Фортран: Intel Fortran Libraries Reference Manual (9.5 Мбайт, 881 страница).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *