Индивидуальное задание

Лабораторная работа №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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: