Пример программы на языке C
Начнем с классического примера: программы ``hello, world''.
#include < stdio.h>
int main() {
printf("Hello, world\n");
return 0;
}
Теперь надо построить PARIX-приложение. Для этого даем команду
px ancc -o hello.px hello.c
Теперь мы получили исполняемый файл hello.px, который можно запустить. Действительно, команда
px run -a p4 hello.px
запустит PARIX-приложение на разделе из 4-х процессоров и вы получите четыре строчки (ответит каждый процессор) Hello, world
Теперь немного модифицируем программу.
#include < stdio.h>
#include < epx/root.h>
int main() {
int ID;
ID=GET_ROOT()-> ProcRoot-> MyProcID;
printf("Hello, world! This is processor %d.\n",ID);
return 0;
}
Скомпилируем программу и запустим. Каждый процессор сообщит свой номер. На этом простом примере демонстрируется важное свойство PARIX: на каждом узле изначально запущены идентичные приложения. Но поведение процесса изменяется в соответствии с позицией процессора в решетке раздела. Функция GET_ROOT осуществляет доступ к (глобальным) данным о конфигурации раздела и положении текущего узла в решетке. Эта функция возвращает указатель на данные следующей структуры:
typedef struct {
int MyProcID; /* my processor number */
int MyX; /* my X coordinate */
int MyY; /* my Y coordinate */
int MyZ; /* my Z coordinate */
int nProcs; /* Number of processors */
int DimX; /* array dimension in X direction */
int DimY; /* array dimension in Y direction */
int DimZ; /* array dimension in Z direction */
} RootProc_t;
Эти данные не являются независимыми, т.к. справедливо следующее
MyProcID = (MyZ * DimX * DimY) + (MyY * DimX) + MyX
nProcs = Dimx * DimY * DimZ
Эта информация позволяет также вычислить идентификаторы соседних процессоров.
Более содержательные примеры см. в каталоге /epx/epx/examples.