Предварительная информация

  • Компилятор и конфигуратор НОРМА-программ (norma и normacnf) установлены на головной машине кластера в каталоге /usr/local/bin. Этот каталог должен присутствовать в переменной PATH.
  • Пример работающей НОРМА-программы с инструкцией.
  • Описание языка НОРМА.
  • Главный разработчик: Ефимкин Кирилл Николаевич, ИПМ РАН.

1. Подготовка исходных текстов программ на языке Норма

Тексты программ на языке Норма могут быть подготовлены с использованием любого текстового редактора, позволяющего сохранять текст программы в файл "так как он есть", без каких-либо управляющих кодов или последовательностей. Текст программы должен быть сохранен в файл с расширением .hop.


2. Трансляция программы из языка НОРМА в Фортран.

Запуск на трансляцию в Fortran MPI осуществляется командой:

     norma <имя файла>.hop mpi

Норма-транслятор должен выдать листинг на экран и записать его в файл <имя файла>.lst и при отсутствии ошибок создать файл с результатом трансляции. Результатом трансляции является файл <имя файла> c расширением .fmp. Указанные файлы создаются в текущей директории и содержат текст получившихся Фортран-программ со спецкомментариями для конфигуратора (см. ниже).

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

В случае возникновения какой-либо внутренней ошибки транслятора на экран выдается сообщение вида:

RULEX ABNORMAL STOP <код ошибки> AT STEP <номер шага>
REFAL-M ERROR: <описание ошибки>
In function <имя функции>
With Entry: <аргументы функции>

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


3. Конфигурация программы, объединение с модулями, написанными на Фортране.

После того, как все модули Норма-программы странслированны, они вместе с модулями, написанными на Фортране ( если таковые имеются ) должны быть обработаны конфигуратором.

Запуск осуществляется командой:

     normacnf <имя файла 1 с расширением> ... <имя файла n с расширением> /mpi

Конфигуратор осуществляет проверку наличия всех требуемых модулей, собирает и настраивает модули, относящиеся к одной исполняемой единице, в один файл. Затем конфигуратор выполняет командный файл конфигуратора, если он есть (см. ниже).

Можно записать имена всех файлов, составляющих задачу, в файл проекта и затем вместо перечисления всех файлов в командной строке указать файл проекта опцией:

	/p=<имя файла проекта>
Результат работы:
	<имя файла 1>.f - Текст задачи на Фортране MPI.

4. Компиляция и запуск программ на выполнение.

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

См. также информацию об использовании командного файла конфигуратора (ниже).

Схема выполнения Норма-программы следующая: главный раздел выполняется на одном процессоре, каждый распределенный раздел - на указанном в нем числе процессоров. Количество процессоров задается в строке 'DISTRIBUTION INDEX=' в тексте Норма-программы.

Запуск программ на выполнение производится так же, как и любых других MPI-программ на языке Фортран.

5. Командный файл конфигуратора.

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

Все вызовы, которые конфигуратор должен сделать, записаны в специальном виде в командном файле конфигуратора. Это позволяет легко менять местоположение на диске компиляторов и библиотек, параметры и опции компиляторов и т.п. Файл должен называться normacnf.cnf и находиться в текущей директории при запуске конфигуратора. После генерации файлов с текстами задач конфигуратор, если присутствует командный файл, начинает его исполнять. Команды, указанные в файле, исполняются последовательно. В командах можно использовать следующие переменные:

    %s_btl% - имя файла (без расширения) с задачей.

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

Формат командного файла следующий:

<команда>
   ...
<команда>

<команда>::=
[<условие выполнения>]
       ...
[<условие выполнения>]
<заголовок>
<командная строка>
[<ошибка>]
   ...
[<ошибка>]
'['end command']'

<заголовок> - строка, выдаваемая на экран перед выполнением команды. В ней также возможно использование переменных. <командная строка> - собственно выполняемая команда.

<ошибка>::=
<сообщение об ошибке>
<код возврата команды>
<свой код возврата>

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

С помощью <условия выполнения> можно определить, в каких ситуациях выполнять ту или иную команду. <Условий выполнения> может быть несколько. Команда выполняется, если истинны все <условия выполнения>.

<условия выполнения>::=
? ifdef <идентификатор>    |
? ifndef <идентификатор>   |
? <имя файла 1> -> <имя файла 2>

Условие ifdef <идентификатор> истинно, если <идентификатор> был определен при запуске конфигуратора с помощью опции '/d=' (см. раздел опции конфигуратора). Наоборот, Условие ifndef <идентификатор> истинно, если <идентификатор> не был определен при запуске конфигуратора. С помощью определения идентификаторов можно управлять исполнением файла команд (использовать различные опции и т.п.).

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

? <имя файла 1> -> <имя файла 2>

Это условие истинно, если время модификации <файла 1> больше времени модификации <файла 2>, или <файл 2> отсутствует. В <имени файла i> можно использовать переменные. С помощью условий этого типа можно не перетранслировать неизменившиеся файлы, так как при генерации текстов Фортран-программ конфигуратор не меняет получающимся файлам время модификации, если они полностью совпадают со своими предыдущими вариантами.

Полностью фрагмент командного файла, реализующий трансляцию программ на Фортране MPI, мог бы выглядеть следующим образом:

? %s_btl%.f -> %s_btl%.o                                                        
Compiling %s_btl%.f                                                             
mpif77 -fast -c %s_btl%.f                                                       
See errors                                                                      
1                                                                               
1                                                                               
[end command]                                                                   
? %s_btl%.o -> mpi_go                                                           
Linking %s_btl%.o                                                               
mpif77 -o mpi_go %s_btl%.o                                                      
See errors                                                                      
1                                                                               
1                                                                               
[end command]                                                                   
Program 'mpi_go' is ready to run                                                
echo                                                                            
[end command]