
- •Лабораторна робота № 1
- •1. Теоретичні відомості
- •1.1 Simd- і mimd- системи як апаратна основа паралельних середовищ
- •Загальні процедури mpi
- •1.3 Засоби для відлагодження мрі програм, аналізу їх виконання
- •1.4 Засоби перегляду логфайлів
- •1.5 Структура апаратних та системних програмних засобів
- •2. Хід роботи
- •4. Контрольні питання
- •5. Список літератури
- •Додаток 1. Управління файлами у linux
- •Переглядачі: more, less, most
- •Простий вивід: cat, echo
- •Створення файлів і каталогів: touch, mkdir
- •Копіювання і зміна назви.
- •Усунення: rm, rmdir
- •Жорсткі і символічні посилання: ln
- •Додаток 2. Контроль над процесами
- •Фонові процеси
- •Пріоритетні процеси
- •Додаток 3. Приклад програми пересилки повідомлень між паралельними процесами
- •Додаток 4. Програма, що виводить кількість паралельних процесів та їх номери
- •Додаток 5. Приклад розпаралелення ітераційного процесу
Додаток 3. Приклад програми пересилки повідомлень між паралельними процесами
#include "mpi.h"
main (argc, argv)
int argc;
char **argv;
{
char message[20];
int myrank;
MPI_Status status;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
if (myrank==0) /* code for process zero */
{
strcpy (message, "Hello, MPI");
MPI_Send(message, strlen(message), MPI_CHAR, 1, 99, MPI_COMM_WORLD);
}
else /* code for process one */
{
MPI_Recv (message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
printf ("received :%s:\n", message);
}
MPI_Finalize();
}
Додаток 4. Програма, що виводить кількість паралельних процесів та їх номери
#include <stdio.h>
#include <mpi.h>
int main(int argc, char** argv){
int allproc, procid, namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &allproc);
MPI_Comm_rank(MPI_COMM_WORLD, &procid);
MPI_Get_processor_name(processor_name,&namelen);
if (procid == 0)
{ printf("All processes count is: %d \r\n", allproc);
}
printf("Process %d on %s\n", procid, processor_name);
MPI_Finalize();
return 0;
}
Додаток 5. Приклад розпаралелення ітераційного процесу
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define BUFLEN 512
int main(argc,argv)
int argc;
char *argv[];
{
int i, myid, numprocs, next, rc, namelen;
unsigned long j1, j2, sum=0;
char buffer[BUFLEN], processor_name[MPI_MAX_PROCESSOR_NAME];
double startwtime = 0.0, endwtime;
MPI_Status status;
int iter=10, iter2=15000, iter3=25000, piter;
char studName[20]="";
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);
if (myid == 0)
{
printf("-=- Enter your surname: "); scanf("%20s", studName);
printf("-=- Enter number of iterations: "); scanf("%u", &iter);
printf("-=- Amount of Parallel Processes: %d\n-=- Total Iterations: %ux%dx%d\n", numprocs, iter, iter2, iter3);
for (i=0;i<numprocs;i++)
MPI_Send(&iter, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
MPI_Recv(&iter, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
MPI_Barrier(MPI_COMM_WORLD); /* synchronization */
if (myid == 0) startwtime = MPI_Wtime(); /* time stamp of start*/
piter=iter/numprocs; /* partial iterations */
if (myid == 0) if (iter%numprocs > 0) piter=piter+(iter%numprocs);
for (i=1;i<=piter;i++)
{
for (j1=1;j1<=iter2;j1++)
{
for (j2=1;j2<=iter3;j2++) sum = sum + 1;
}
printf("Process %d on processor %s Iteration - %d \n",myid,processor_name,i);
}
MPI_Barrier(MPI_COMM_WORLD);
if (myid == 0) endwtime = MPI_Wtime();
MPI_Finalize();
if (myid == 0) printf("-=- Wall Clock Time: %f\n", endwtime-startwtime);
}