Лабораторная работа №3
Тема: организация распределенных вычислений путем разработки программ с использованием библиотеки MPI.
Цель: научиться организовывать распределенные вычисления посредством использования библиотеки MPI.
Индивидуальное задание.
1. Разработать программу, производящую вычисления согласно варианту с
использованием библиотеки MPI. Отчет по лабораторной работе должен содержать
листинг программы и результаты тестирования работы программы на одной машине и
на нескольких машинах с указанием времени работы программы.
Варианты заданий:
1. Вычислить сумму элементов вектора (одномерного массива) вещественных чисел.
Тест проводился на 80 "ядрах" с 20000 случайных значений.
import mpi.*;
import java.util.Random;
public class mpj1 {
public static void main(String[] args) {
MPI.Init(args);
double startTime = System.currentTimeMillis();//засекаем время
int rank = MPI.COMM_WORLD.Rank();
int size = MPI.COMM_WORLD.Size();
final int ROOT = 0;
Random rg = new Random();
float [] bigBuf = new float[20000];//массив генеририруемых чисел
int mass_size = (int)Math.ceil(bigBuf.length/size);
float [] recvbuf = new float[mass_size];
|
|
if (rank == ROOT)
{
for(int i = 0; i< bigBuf.length; i++)
bigBuf[i] = rg.nextFloat()*10;
}
int n=bigBuf.length;
try {
String s_buff = "";
MPI.COMM_WORLD.Scatter(bigBuf, 0,mass_size, MPI.FLOAT, recvbuf, 0, mass_size, MPI.FLOAT, 0);
for (int i=0;i<mass_size;i++)
s_buff =s_buff+" "+recvbuf[i];
System.out.println("1ST BLOCK <"+s_buff+">");
} catch (Exception e) {
System.out.println("Error in 1st block>"+e.getMessage());
System.exit(-1);
}
float count = 0;
for (int i=0;i<(int)recvbuf.length;i++)
count+=recvbuf[i];
float [] t = new float[400];
t[0] = count;
System.out.println("sum["+rank+"]="+t[0]);
float [] counts = new float[400];
try {
MPI.COMM_WORLD.Reduce(t,0,counts,0,mass_size,MPI.FLOAT,MPI.SUM,ROOT);
if (rank==ROOT)
System.out.println("Recieve ="+counts[0]);
} catch (Exception e) {
System.out.println("Error in 2d block>"+e.getMessage());
System.exit(-1);
}
double endTime = System.currentTimeMillis();//время конца
MPI.Finalize();
if (rank==ROOT)
System.out.println("Start="+startTime+" End="+endTime+" Diff="+(endTime-startTime)); }}
Настройка MPI под java:
0)качаем файлы mpi отсюда: http://sourceforge.net/projects/mpjexpress/files/rele..
1)распаковываем в папку
f:\mpj
2)установка глобальных переменных:
MPJ_HOME f:\mpj
PATH f:\mpj\bin
classpath F:\mpj\lib
если такие переменные уже есть, то просто дописать к уже имеющемуся наши пути через точку с запятой ";"
Также необходимо настроить path и classpath для самой java(если это не сделано)
3)тестируем работу в консольке mpjrun.bat -np 2 -jar %MPJ_HOME%/lib/test.jar
4)Создаём тестовое приложение(в папке mpj):
import mpi.*;
public class HelloWorld {
public static void main(String args[]) throws Exception {
MPI.Init(args);
int me = MPI.COMM_WORLD.Rank();
int size = MPI.COMM_WORLD.Size();
System.out.println("Hi from <"+me+">");
MPI.Finalize();
}
}
5)Компилируем и запускаем наш тест
javac -cp.;%MPJ_HOME%/lib/mpj.jar HelloWorld.java
mpjrun.bat -np 2 HelloWorld
Запуск(файл.bat\коммандная строка):
f:
cd %MPJ_HOME%
javac -cp.;f:\mpj\lib\mpj.jar AddIntSR.java
f:\mpj\bin\mpjrun.bat -np 4 AddIntSR
Контрольные вопросы.
1. Перечислите и опишите функции управления вычислительным окружением MPI.