Средства автоматизированного распараллеливания программ
Дополнительные настройки в kmp_cluster.ini-файле
В этом разделе рассмотрим более подробно настройки, которые можно задавать в kmp_cluster.ini -файлах. Настройки --hostlist и --process_threads уже были рассмотрены ранее. Отметим лишь, что по умолчанию значение process_threads равно 1, а список hostlist по умолчанию тождественен узлу кластера, на котором в данный момент осуществляется работа.
Настройка --omp_num_threads в файле kmp_cluster.ini позволяет определить число потоков OpenMP, т. е. значение переменной окружения OMP_NUM_THREADS. По умолчанию значение omp_num_threads равно произведению значений настроек
processes * process_threads
Настройка --processes позволяет задавать число параллельных процессов. По умолчанию оно принимает значение, либо равное числу узлов в списке hostlist, либо, если определено значение настройки omp_num_threads, - равное частному
omp_num_threads / process_threads
Отметим, что если значение omp_num_threads не равно значению произведения processes * process_threads, то следует переопределить настройку process_threads как omp_num_threads / processes.
Настройка --transport определяет протокол связи между узлами кластера. Эта настройка по умолчанию принимает значение --transport=tcp, что соответствует протоколу TCP IP. Кроме того, допустимо значение --transport=dapl. В этом случае настройка --adapter должна быть определена следующим образом:
adapter=Openib-ib0
В последнем случае в команду компиляции программы должны быть добавлены настройки примерно следующего вида: - L/usr/local/ibgd/lib и -ldat, первая из которых определяет путь к библиотеке, а вторая - саму библиотеку dat.
Настройка --launch определяет метод запуска Cluster OpenMP-программы на удаленных узлах кластера. Она может принимать два возможных значения - rsh или ssh ; первое значение является тем значением, которое эта настройка принимает по умолчанию.
Настройка --sharable_heap определяет число страниц, выделяемых под общую для всех узлов кластера память. По умолчанию ее значение равно 16384.
Настройка --suffix позволяет определить суффикс, который будет добавлен слева к именам узлов кластера. Эта настройка полезна в случае наличия различных типов межузловых соединений в кластере. По умолчанию suffix имеет значение null.
Для задания задержки при запуске удаленных процессов можно воспользоваться настройкой --startup_timeout. Значение этой настройки задается в секундах, и по умолчанию оно равно 30. Если процесс не успевает стартовать за заданное время, то выполнение программы прерывается.
Настройка --IO={system | debug | files} позволяет переопределять выходные потоки stderr и stdout следующим образом. Настройка по умолчанию system определяет пути к файлам stderr и stdout в соответствии с правилами оболочки shell. В случае debug происходит переадресация потоков stderr и stdout с удаленных узлов на рабочий узел кластера, при этом для идентификации файлов, соответствующих удаленным процессам, в их имена добавляется префикс Process x:, где x - номер удаленного процесса. В случае files осуществляется переадресация файлов stderr и stdout в файлы clomp-<process_id>-stdout и clomp-<process_id>-stderr соответственно, где process_id есть идентификатор процесса.
Настройка --[no]heartbeat позволяет включить или выключить механизм контроля того, что все запущенные процессы функционируют нормально. По умолчанию устанавливается настройка --heartbeat.
Для задания имени директории, в которой размещается файл обмена страниц динамической, общей для всех процессоров памяти, в kmp_cluster.ini -файле имеется специальная настройка --back_store= <имя директории обмена страниц памяти>. По умолчанию обмен страниц памяти осуществляется в директории /tmp.
Наконец, последняя настройка --[no-]divert_twins предназначена для резервирования двух страниц в директории обмена страниц для файла обмена страниц памяти. По умолчанию эта настройка имеет значение --no-divert_twins, соответствующее отключению режима резервирования.
В заключение отметим, что в kmp_cluster.ini -файле строго запрещается использовать переменные PATH, SHELL и LD_LIBRARY_PATH.
Дополнительные настройки компилятора Fortran в Cluster OpenMP
В программах, написанных на языке Fortran, имеются дополнительные настройки компилятора для работы и анализа переменных, размещенных в общей для всех узлов кластера памяти. Отметим, что компиляторы Fortran компании Intel, начиная с версии 9.1.xx, по умолчанию определяют как sharable переменные программы, содержащиеся в common-блоках, а также переменные программных модулей, локальные переменные типа SAVE и временные переменные для вычисления выражений в вызовах функций и подпрограмм. Для изменения этого режима определения по умолчанию в Intel Fortran компиляторе имеются четыре дополнительные настройки.
Настройка -[no]-clomp-sharable-common позволяет отключить или включить режим определения по умолчанию переменных common-блоков как sharable.
Для отключения или включения режима определения по умолчанию локальных переменных типа SAVE как sharable следует использовать настройку -[no]-clomp-sharable-localsaves.
Настройка -[no]-clomp-sharable-modvars позволяет отключить или включить режим определения по умолчанию переменных программных модулей как sharable.
Для отключения или включения режима определения по умолчанию временных переменных для вычисления выражений в вызовах функций и подпрограмм как sharable следует использовать настройку -[no]-clompsharable-argexprs.
В заключение этого раздела отметим, что по умолчанию все четыре вышеперечисленные настройки устанавливаются с префиксом no, т. е. в выключенном режиме.
Переменные окружения Cluster OpenMP
При программировании с использованием Cluster OpenMP можно определить ряд переменных окружения, позволяющих контролировать и изменять процессы выполнения программ.
Для задания размера стеков потоков в Cluster OpenMP можно воспользоваться переменной окружения KMP_STACKSIZE. Размер стека задается в килобайтах (K) или мегабайтах (M). По умолчанию задается KMP_STACKSIZE=1M. Определять размер стека можно не только для отдельных параллельных потоков, но и для общих переменных типа sharable. В последнем случае следует определить переменную окружения KMP_SHARABLE_STACKSIZE. По умолчанию значение этой переменной также равно 1M.
Переменная окружения KMP_STATSFILE предназначена для определения имени файла, в который будет выводиться статистическая информация при профилировании программы, созданной с настройкой -cluster-openmp-profile. По умолчанию KMP_STATSFILE=guide.gvs.
При отладке Cluster OpenMP программ необходимо задать имя отладчика. Для этого имеется специальная переменная окружения KMP_CLUSTER_DEBUGGER. Эта переменная может принимать значения idb (отладчик Intel), gdb (отладчик GNU) или totalview (отладчик TotalView). Значение по умолчанию для этой переменной окружения отсутствует.
Переменная окружения KMP_WARNINGS позволяет включить ( 1 или on ) или выключить ( 0 или off ) режим вывода предупреждающих сообщений библиотеки выполнения ( runtime library ) Cluster OpenMP. По умолчанию задается KMP_WARNINGS=on.
Для задания режима вывода предупреждающих сообщений об общих для всех узлов кластера переменных в Cluster OpenMP имеется переменная окружения KMP_SHARABLE_WARNINGS. Она также может принимать значения "включить" ( 1 или on ) или "выключить" ( 0 или off ) режим вывода предупреждающих сообщений. Но по умолчанию задается режим KMP_SHARABLE_WARNINGS=off.
Переменная окружения KMP_CLUSTER_SETTINGS позволяет организовать вывод на экран всех переменных окружения, в том числе определенные в kmp_cluster.ini -файле, а также настройки, заданные в этом же файле. Для этой переменной отсутствует значение по умолчанию.
Переменная окружения KMP_CLUSTER_PATH определяет путь к kmp_cluster.ini -файлу, если этот файл отсутствует в разделе, из которого запускается программа. По умолчанию это путь к домашнему разделу каталога пользователя.
Для вывода информации об использовании настроек в kmp_cluster.ini -файле следует задать переменную окружения KMP_CLUSTER_HELP. Еще одна сервисная переменная окружения KMP_VERSION позволяет выводить информацию о версии в процессе работы библиотеки выполнения (run-time library).
Наконец, последняя переменная окружения KMP_DISJOINT_HEAP задает размер несимметрично распределенной по процессам динамической памяти в килобайтах (K) или мегабайтах (M). Минимальный размер несимметрично распределенной по процессам динамической памяти равен 2K. Значение по умолчанию этой переменной не определено.
Особенности реализации переменных окружения OpenMP в Cluster OpenMP
В этом разделе рассматриваются особенности реализации переменных окружения OpenMP в среде Cluster OpenMP.
В Cluster OpenMP максимальное число параллельных потоков в параллельной области программы определяется заданием настройки --omp_num_threads. Однако число параллельных потоков может быть и меньше максимального, если оно определено с помощью задания переменной окружения OMP_NUM_THREADS или с помощью вызова функции omp_set_num_threads() из библиотеки выполнения (runtime library).
Число процессоров, которое возвращает функция omp_get_num_procs(),
- это сумма процессоров, вычисленная по всем узлам вычислительной системы. Cluster OpenMP не поддерживает вложенный параллелизм. Поэтому вложенные параллельные области выполняются как последовательность потоков, причем на том же процессоре, на котором выполняется их родительский поток. Таким образом, вызов функции omp_set_nested или задание переменной окружения OMP_NESTED не имеют никакого влияния.
При задании переменных окружения, определяющих загрузку вычислительной системы, следует иметь в виду, что если переменная окружения OMP_SCHEDULE не определена, то это означает, что по умолчанию задается статический ( static ) режим загрузки параллельных процессов.