Среда ParaJava – руководство пользователя. ВВЕДЕНИЕ. I. Среда ParJava позволяет пользователю разрабатывать и выполнять параллельные программы на однородных и неоднородных вычислительных системах с распределенной памятью, таких как суперкомпьютеры, кластеры или локальные сети. Кроме того, эта среда дает возможность моделировать однородные вычислительные системы на неоднородных. II. ИНСТАЛЯЦИЯ. Несмотря на то что среда ParJava реализована средствами Java все-таки существует некоторая платформо-зависимая часть библиотек связанных с реализацией интерфейса передачи сообщений. Полная реализация MPI на Java рассматривается нами как актуальная задача, решение которой позволит получить полную переносимость библиотек среды ParJava. На текущий момент предлагается два варианта дистрибуции среды ParJava: Архив с исходными кодами native-библиотек; Архив с прекомпиленными native-библиотеками для Solaris и Linux операционных систем. В первом случае требуется предварительная сборка native-библиотек. В последнем, достаточно развернуть архив и установить переменные окружения. Установка дистрибутива среды ParJava с исходными кодами native-библиотек: 1. Прежде всего вы должны убедится в том, что у вас установлены следующие программные средства: ND LAM - реализация интерфейса передачи сообщений. Среда ParJava разработана и проверенна с использованием LAM версии 6.3.1. JDK 1.2. (или более поздняя версия) - Среда поддержки выполнения, компилятор, JavaVM, Java библиотеки и пр. GCC 2.95 – Компилятор с языков программирования С/C++ необходим для создания native-библиотек. 2. Для того чтобы сборка native-библиотек прошла корректно вам необходимо убедится в наличии следующих переменных окружения: JAVA_HOME, LAMHOME, которые указывают на директории, где инсталлированы соответствующие программные средства. Если эти переменные отсутствуют необходимо создать их самостоятельно в ваших конфигурационных файлах. Замечания: Для того чтобы избежать конфликтов связанных с особенностями работы LAM утилит рекомендуется в качестве первой записи переменной окружения PATH сделать путь указывающий на место где расположена JavaVM (например, PATH=$JAVA_HOME/bin:<…>) 3. Разверните архив ParJava.tar.gz #gunzip ParJava.tar.gz #tar xvf ParJava.tar 4. В результате будет создана директория ParJava, в которой содержаться библиотеки среды ParJava. Для того чтобы установить среду ParJava (собрать native-библиотеки, подготовить конфигурационную директорию .PJ и пр.) зайдите в эту директории и выполните команду setup. #./setup 5. Добавьте к переменной окружения CLASSPATH путь к классам среды ParJava ParJava/classes, а к LD_LIBRARY_PATH путь к библиотекам - ParJava/lib. 6. Для того чтобы запустить среду ParJava необходимо в директории ParJava выполнить команду dev. #dev& Установка дистрибутива среды ParJava с прекомпиленными native-библиотеками для Solaris и Linux: 1. Прежде всего вы должны убедится в том, что у вас установлены следующие программные средства: ND LAM - реализация интерфейса передачи сообщений. Среда ParJava разработана и проверенна с использованием LAM версии 6.3.1. JDK 1.2. (или более поздняя версия) - Среда поддержки выполнения, компилятор, JavaVM, Java библиотеки и пр. 2. Разверните архив ParJava-Linux-i386 если у вас Linux платформа, ParJavaSolaris-sparc в случае Solaris. #gunzip <имя архива>.tar.gz #tar xvf <имя архива>.tar 3. В результате будет создана соответствующая директория, в которой содержаться библиотеки среды ParJava. Для того чтобы установить среду ParJava (подготовить конфигурационную директорию .PJ и пр.) зайдите в эту директории и выполните команду setup. #./setup 4. Добавьте к переменной окружения CLASSPATH путь к классам среды ParJava ParJava/classes, а к LD_LIBRARY_PATH путь к библиотекам - ParJava/lib. 5. Для того чтобы запустить среду ParJava необходимо в директории ParJava выполнить команду dev. #dev& III. ВЫПОЛНЕНИЕ ПАРАЛЛЕЛЬНЫХ ПОГРАММ TOOLS: Доступ к средствам, обеспечивающим выполнение параллельных программ на параллельной вычислительной системе предоставляется пользователю через пункт меню «Tools» главного окна среды. New Net – Через пункт меню «New Net» главного окна среды ParJava пользователь может выбрать узлы формирующие вычислительную сеть на которой будет выполнятся параллельная программа. При вызове этого пункта меню на экране появляется диалоговое окно, которое содержит два списка: список имен доступных узлов параллельной вычислительной системы и список узлов включенных в вычислительную сеть. С помощью управляющих элементов – кнопок, пользователь может формировать вычислительную сеть, добавляя или удаляя узлы из соответствующего списка (кнопки «add», «add all» и «remove» соответственно). Замечания: Перед первым запуском параллельной программы НЕОБХОДИМО выделить вычислительную сеть. Узел, на котором запущена среда ParJava попадает в список узлов вычислительной сети автоматически. К имени этого узла добавляется идентификатор «root» взятый в скобки. Список доступных узлов параллельной вычислительной системы формируется из пользовательского конфигурационного файла .rhosts. Если этот файл в вашей домашней директории отсутствует, создайте его самостоятельно руководствуясь документацией по UNIX операционным системам. После окончания сеанса работы в ParJava текущее состояние среды сохраняется, в том числе и список узлов вычислительной сети. пользователю Hosts Performance - Определить относительную производительность узлов вычислительной сети. При вызове этого пункта меню запускается серия тестов, которая позволяет определить относительные производительности виртуальных Java машин, запущенных на каждом узле вычислительной сети. При этом производительность самого мощного узла принимается равной 100%, тогда производительности остальных узлов вычислительной сети считаются относительно этого утверждения. Результаты тестов представляются пользователю в диалоговом окне. Compile – Через пункт меню «Compile» главного окна среды ParJava пользователь может скомпилировать свою Java-программу. При вызове этого пункта меню на экране появляется диалоговое окно, в котором по умолчанию установлена строка, определяющая режим компиляции. javac <полный путь><имя класса> Пользователь может переопределить режим компиляции исходя из собственных задач. Результат компиляции программы пользователя: предупреждения, сообщения об ошибках и пр. выводятся в отдельное окно среды. Замечания: По умолчанию используется Java компилятор из среды JDK. Среда JDK должна быть предварительно установлена. Переменные окружения должны быть соответственно настроены. За подробными инструкциями обращайтесь к соответствующей документации по установке JDK. Run - Через пункт меню «Run» главного окна среды, пользователь может выполнить последовательную программу. При вызове этого пункта меню на экране появляется диалоговое окно, в котором по умолчанию установлена строка, определяющая режим выполнения программы. java <имя класса> Пользователь может переопределить режим выполнения исходя из собственных задач. Run on Homogeneous Net - Запустить SPMD Java программу на ОДНОРОДНОЙ сети виртуальных Java машин. Однородная сеть моделируется на текущей вычислительной сети с оптимальным количеством узлов. При вызове этого пункта меню на экране появляется диалоговое окно, в котором по умолчанию установлена строка, определяющая режим выполнения программы. Пользователь может переопределить режим выполнения исходя из собственных задач. Run on Heterogeneous Net - Запустить НЕОДНОРОДНОЙ сети виртуальных Java машин. SPMD Java программу на Замечания: Необходимо отметить что если относительная производительность узла меньше 10% процентов, то такой узел исключается из вычислительной сети. ANALYZERS: При разработке, тестировании и отладке последовательной программы необходимо обеспечить не только ее корректность, но и ее эффективность и устойчивость. В случае параллельной SPMD-программы необходимо также обеспечить ее масштабируемость. Для этого разработчику полезно знать некоторые свойства программы, в частности ее профили. Эффективное распределение SPMD-программы по узлам неоднородной сети требует знания значений параметров программы, определяющих фактическую скорость ее выполнения на каждом узле сети. Для определения этих свойств SPMD-программы в среду ParJava включены следующие «Instrumentate» и «Profile» которые позволяют оценить затраты времени на выполнение последовательной части программы на этапе ее разработки и отладки. Это позволяет учитывать вес последовательной части при вычислении производительности узлов, обеспечивая большую производительность сети при выполнении программы. Trace Visualization – В процессе выполнения параллельной программы возможно накопление трасировочной информации (см. пункт «Test_mode»). Визуализировать накопленную во время выполнения параллельной программы историю можно из среды, выбрав пункт «TraceVisualization». Инструмент «TraceVisualization» отображает каждую параллельную ветвь SPMDпрограммы в виде горизонтальной линии, на которой квадратиками отмечены обращения к функциям коммуникационной библиотеки. В верхней части изображения отображается временная линейка. При помощи нее можно определить (в миллисекундах), когда произошел вызов той или иной функции. Функции на схеме, ради экономии места и удобства представления отображаются не названиями, а номерами (например, функциям Init() и Finalize() сопоставлены коды 1 и 2 соответственно). Полный список соответствий приведен в приложении «А». При наводке курсора на тот или иной квадратик с кодом функции, появляется подсказка с именем функции и относительным временем ее вызова. Некоторые квадратики соединены зелеными линиями; что означает обращение ветви параллельной программы к коммуникационной функции и ожидание внешнего события для завершения этой функции. Длина зеленой линии пропорциональна времени ожидания внешнего события (например, ожидание данных) данной функцией. Время простоя каждого процесса будет вычислено и отображено (в процентах от общего времени) на диаграмме соответствующего процесса, если нажать на кнопку слева от его изображения на экране. Простои процесса в миллисекундах отобразятся на гистограмме. Чтобы получить диаграмму всех процессов, надо нажать кнопку «All». Результаты профилирования программ автоматически сохраняются в системных файлах, доступных пользователю с помощью инструмента «TraceVisualization». Имена этих файлов различаются по двум последним цифрам. Первая из них – номер запускаемой программы, вторая – номер процесса. При начальном отображении схемы масштаб представления отрезков времени выбирается таким образом, чтобы вся картина работы программы целиком уместилась на экране. В дальнейшем масштаб изображения может быть изменен пользователем. Пользователь может выделить участок трассы двумя красным границами и нажать кнопку Zoom In. Тогда этот кусок растянется на весь экран. При помощи Zoom Out таким же путем можно увеличить размеры просматриваемого отрезка времени. Передвигаться по схеме можно при помощи полосок скроллинга. Instrumentate – инструментирует программу, т.е. вставляет в нее отладочные обращения к таймеру и выдачи (в процессе реализации). Profile – составляет динамический профиль программы (в процессе реализации). Normal_mode – Режим работы среды установленный по умолчанию. Test_mode – переводит параллельную программу в тестовый режим, в котором она будет выполняться с использованием специальной отладочной библиотеки. В режиме «Test_mode» каждая ветвь параллельной программы накапливает историю параллельного исполнения в специальном файле. В этом файле отражаются все события, связанные с параллельным исполнением, а также абсолютное время выполнения как ветви в целом, так и время между параллельными событиями в этой ветви. К таким событиям, например, относятся все вызовы коммуникационных функций. Специальный файл содержит также дополнительную информацию о событии (размер сообщений, от кого кому, номер строки в исходной Java программе и т.д.). Действия по построению этого файла осуществляются автоматически при помощи отладочной библиотеки и не требуют дополнительных усилий со стороны пользователя. ПРИЛОЖЕНИЕ «А». Соответствие кодов и имен вызовов коммуникационной библиотеки MPI при визуализации истории выполнения параллельной программы. 0 1 2 3 4 5 6 7 Init Finalize Wtime Wtick Get_processor_name Initialized Buffer_attach Buffer_detach 8 clone 9 Size 10 Rank 11 Compare 12 Free 13 Is_null 14 Group 15 Test_inter 16 Create_intercomm 17 GetIntercomm 18 Object_Serialize 19 Object_Deserialize 20 Send 21 Recv 22 Sendrecv 23 Sendrecv_replace 24 Bsend 25 Ssend 26 Rsend 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 Isend Ibsend Issend Irsend Irecv Send_init Bsend_init Ssend_init Rsend_init Recv_init Pack Unpack Pack_size Iprobe Probe Attr_get Topo_test Abort Errhandler_set Errorhandler_get Disconnect Get_parent Join clone Remote_size Remote_group Merge clone Split Creat Barrier copyBuffer newBuffer Bcast Gather Gatherv Scatter Scatterv Allgather Allgatherv Alltoall Alltoallv Reduce Allreduce Reduce_scatter Scan Create_cart Create_graph Spawn Spawn( ... , int[] array_of_errcodes) Spawn_multiple Spawn_multiple( ... , int[] array_of_errcodes)