Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснительная записка Гуцу Олег.docx
Скачиваний:
5
Добавлен:
21.09.2019
Размер:
2.32 Mб
Скачать
      1. Листинг тестирующей mpi-программы

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include "mpi.h"

double f(double a)

{

return (4.0 / (1.0+ a*a));

}

int main(int argc, char **argv)

{

int done = 0, n, myid, numprocs, i;

double PI25DT = 3.141592653589793238462643;

double mypi[160], pi[160], perf[20], h, sum, x, maxtime=0;

double startwtime = 0.0, endwtime;

int namelen;

char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Get_processor_name(processor_name,&namelen);

fprintf(stdout, "Process %d of %d is on %s\n", myid,numprocs,processor_name);

fflush(stdout);

if(myid==0)

{

fflush(stdout);

n=10000000*numprocs;

startwtime = MPI_Wtime();

}

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

double procstime=MPI_Wtime();

if(n==0)

done = 1;

else

{

h = 1.0 / (double) n;

sum = 0.0;

for(i = myid + 1 ; (i <= n) ; i += numprocs)

{

x = h * ((double)i - 0.5);

sum += f(x);

}

double procetime=MPI_Wtime();

for(i=0;i<numprocs;i++)mypi[i]=0;

mypi[myid] = procetime - procstime;

MPI_Reduce(mypi, pi, numprocs, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if(myid==0)

{

for(int j=0;j<numprocs;j++){

printf("%.9f\n", pi[j]);

}

for(int j=0;j<numprocs;j=j+8){

perf[j/8]=(pi[j]+pi[j+1]+pi[j+2]+pi[j+3]+pi[j+4]+pi[j+5]+pi[j+6]+pi[j+7])/8;

if(maxtime<perf[j/8])maxtime=perf[j/8];

printf("%.9f\n", perf[j/8]);

}

int numhosts=numprocs/8;

FILE *of;

of=fopen(argv[1],"w");

for(int j=0;j<numhosts;j++){

int p=floor(maxtime/perf[j]*8+0.8);

printf("%d\n", p);

fprintf(of,"%d\n", p);

}

fclose(of);

endwtime = MPI_Wtime();

printf("wall clock time = %f\n", endwtime-startwtime);

fflush(stdout);

}

}

MPI_Finalize();

return 0;

}

    1. Приложение 2. Инструкция по написанию и запуску заданий на кластере миит т-4700.

Для запуска задач на вычислительном кластере МИИТ Т-4700 необходимо пользоваться менеджером распределённых ресурсов Torque. Пользователь готовит файл задания для Torque и ставит его в очередь командой qsub. При этом пользователь запрашивает необходимые для этой задачи ресурсы: число узлов кластера, число процессоров на каждом из них, необходимое количество оперативной памяти и время выполнения задачи.

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

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

Спецификация необходимых ресурсов может быть осуществлена в команде qsub с помощью ключей командной строки.

  • -l nodes=1:ppn=2 Число узлов=1, число ядер=2

  • -l mem=100mb Объём выделенной на задание памяти = 100mb

  • -l walltime=1:30:00 Время выполнения задания

  • -q single Название очереди для задания

  • -o sleep.out Название файла для стандартного вывода

  • -e sleep.err Название файла для вывода ошибок

Например, чтобы поставить в очередь под названием single задачу sleep.job на один процессор, на полтора часа, используя сто мегабайт памяти, нужно выполнить такую команду:

qsub -l nodes=1:ppn=1,mem=100mb,walltime=1:30:00 -q single sleep.job

Еще одна возможность задания ресурсов – это указание их внутри самого командного файла, в строках-комментариях начинающихся с #PBS. Например, файл sleep.job, который описывает задание, похожее на приведённое выше, может выглядеть следующим образом:

#!/bin/bash

#PBS -q single

#PBS -l nodes=1:ppn=1,mem=100mb,walltime=1:30:00

#PBS -S /bin/bash

#PBS -o sleep.out

#PBS -e sleep.err

#PBS -N sleep

echo " Start date:`date`"

sleep 10

echo " End date:`date`"

В таком случае задание запускается просто как qsub sleep.job. В отличие предыдущего задания, у этого будет sleep, а стандартный вывод и вывод ошибок будут помещены в файлы sleep.out и sleep.err соответственно. С помощью оператора echo можно также поместить в выходной файл желаемые данные. В нашем примере после выполнения задания в sleep.out будет выведено:

Start date:<текущая дата>

End date:<текущая дата>

Полный список параметров и ресурсов для qsub можно найти c помощью man qsub и man pbs_resources.

После того, как задание успешно поставлено в очередь, ему присваивается уникальный идентификатор задачи (Job ID). Используя этот номер, можно манипулировать заданием в очереди:

  • - qstat Посмотреть состояние очереди;

  • - qdel Удалить задание из очереди;

  • - qalter Изменить параметры уже запущенного задания;

  • - qrerun Перезапустить задание, если это возможно;

  • - qhold Приостановить задание;

  • - qrls Запустить приостановленное задание.

Каждая из этих команд имеет множество параметров, ознакомиться с которыми пользователь может при помощи команды man <имя команды>, например man qstat.

Если задание было успешно поставлено в очередь, qstat по умолчанию выведет на экран таблицу, столбцы которой имеют следующие значения:

  • Job id - уникальный идентификатор задания;

  • Name - имя исполняемого задания;

  • User - имя владельца задания;

  • Time Use - общее процессорное время, использованное заданием на данный момент

  • S - состояние задачи (Q - находится в очереди, R – вычисляется, E - произошла ошибка при выполнении или задание завершает выполнение);

  • Queue - название очереди, в которой запущена задание.

Пример запуска команды qstat:

Job id Name User Time Use S Queue

------------------- ---------------- --------------- -------- - -----

1972.master PCGAMESS davydovk 00:00:00 R single

1993.master cpi-mpirun kruchin 00:00:00 R para

1994.master dl chepasov 0 Q para