Автор работы: Пользователь скрыл имя, 02 Декабря 2014 в 18:55, курсовая работа
Данная исследовательская работа посвящена ознакомлению с программированием параллельных вычислительных процессов с использованием пакета программ PVM (Parallel Virtual Machine).
Параллельной машиной называют набор процессоров, памяти и некоторые методы коммуникации между ними. Это может быть двухядерный процессор в ноутбуке, многопроцессорный сервер или, например, кластер (суперкомпьютер). Компьютеры, входящие в кластер, вместе намного быстрее, чем по отдельности.
ВВЕДЕНИЕ………………………………………………………………….3
ГЛАВА 1.ОПИСАНИЕ КЛАСТЕРНЫХ СИСТЕМ И ХАРАКТЕРИСТИКА БИБЛИОТЕК ПАРАЛЛЕЛИЗМ………………….4
1.1. ТИПЫ КЛАСТЕРНЫХ СИСТЕМ……………………………...……..4
1.2. ПОПУЛЯРНЫЕ БИБЛИОТЕКИ ПАРАЛЛЕЛИЗМА.
АНАЛОГИ PVM…………………………………………………..……….7
1.3. ОПИСАНИЕ СИСТЕМЫ PVM……………………………………...13
ГЛАВА 2. ОРГАНИЗАЦИЯ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ…….16
2.1. ОПИСАНИЕ ОБОРОДУВАНИЯ И ПРОГРАММНОГО
ОБЕСПЕЧЕНИЯ………………………………………………………......16
2.2. УСТАНОВКА И НАСТРОЙКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ КЛАСТЕРА………………………………………………………………....17
2.3. ГИПОТЕЗА ГОЛЬДБАХА…………………………………………....21
2.4. ПРОЦЕСС КОМПИЛЯЦИИ СОБСТВЕННОЙ ПРОГРАММЫ ДЛЯ РАБОТЫ С PVM…………………………………...……………………....22
2.5. ВЫПОЛНЕНИЕ ПРОГРАММЫ…………………………………......23
ЗАКЛЮЧЕНИЕ…………………………………………………………….26
СПИСОК ЛИТЕРАТУРЫ………………………………
№ |
N |
Время, с. |
1 |
50000 |
1,49 |
2 |
100000 |
5,23 |
3 |
250000 |
30,43 |
4 |
500000 |
143,39 |
Как видно из таблицы с увеличением числа N время, которое затрачено на выполнение алгоритма, весьма ощутимо увеличивается, что вызывает некоторые неудобства. Числа 10000, 50000 вычисляются быстро, поэтому их тестирование на кластере не имеет смысла, так как даже 1 узел отлично справляется с поставленной задачей.
После этого программа была запущена на всех узлах кластера:
Таблица 2 - Выполнение программы на всех узлах кластера.
№ |
N |
Время, с. |
1 |
100000 |
4,69 |
2 |
250000 |
23,67 |
3 |
500000 |
112,53 |
Как видно из таблицы, производительность в вычислениях с крупными числами выросла примерно на 12%, что немного. Дело в том, что на одном узле кластера происходит большое количество вычислений, так как имеется всего два узла в кластере, и программа распараллелена всего на две подзадачи.
Для того, чтобы программа работала быстрее, нужно добавить в кластер узлов и еще сильнее распараллелить задачу, то есть разбить ее на большее количество параллельных подзадач, чтобы иметь возможность использовать в процессе подсчета большее количество узлов, на которых происходит малое количество вычислений. Чем меньше вычислений на одном узле, тем быстрее работает программа.
Таким образом, тест программы Гипотеза Гольдбаха показал, что процессорное время работы кластера над данной задачей уменьшается, отсюда можно сделать вполне обоснованный вывод, что кластерная система работает быстрее, чем один компьютер. Производительность кластерной системы растет с увеличением количества узлов в ней.
ЗАКЛЮЧЕНИЕ.
В ходе работы были изучены основные принципы построения распределенных вычислительных систем, была установлена и система PVM, завершена настройка RSH, а также изучены принципы параллельного программирования с использованием основных функций PVM.
СПИСОК ЛИТЕРАТУРЫ.
ПРИЛОЖЕНИЕ А
Листинг программы Гипотеза Гольдбаха.
Текст родительской программы master.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include </usr/share/pvm3/include/pvm3.
#include "/home/master/gold/tags.h"
#include "/home/master/gold/commons.h"
int main()
{
clock_t time;
int mytid;
int gold_tid;
int golds[NUM_SLAVES]; //массив для хранения данных ID задач с gold
int items[SIZE]; // данные для обработки
int result, i, kp;
int results[NUM_SLAVES];
time = clock();
mytid = pvm_mytid();
for(i = 0; i < SIZE; i++) //делаем массив
items[i] = i;
result = pvm_spawn("gold", (char**)0, PvmTaskDefault, "", 1, &gold_tid);
for(i = 0; i < NUM_SLAVES; i++)
{
pvm_initsend(PvmDataDefault);
pvm_pkint(items + i*DATA_SIZE, DATA_SIZE, 1);
pvm_send(golds[i], MSG_DATA);
}
/* получаем результат от программ slave */
for(i = 0; i < NUM_SLAVES; i++)
{
int bufid, bytes, type, source;
int slave_no;
//получаем информацию о сообщении
pvm_bufinfo(bufid, &bytes, &type, &source);
// получаем номер slave, которая послала данное сообщение
gold_no = get_gold_no(golds, source);
// распаковываем результат в правильную позицию
pvm_upkint(results + gold_no, 1, 1);
}
// находим окончательный результат
kp = 0;
for(i = 0; i < NUM_SLAVES; i++)
kp += results[i];
time = clock() - time;
printf("Time = %f sec.", (double)time/CLOCKS_PER_SEC);
//выходим из PVM
pvm_exit();
exit(EXIT_SUCCESS);
} // конец main()
Листинг дочерней программы gold.c:
#include <stdio.h>
#include "commons.h"
int main (void)
{
int p[SIZE/2];
int kp;
int i, j, k;
int mytid, parent_tid;
mytid = pvm_mytid();
parent_tid = pvm_parent();
pvm_recv(parent_tid, MSG_DATA);
pvm_upkint(items, DATA_SIZE, 1);
kp = 0;
p[0]=1;
kp++;
for(i=3; i<SIZE; i+=2) {
for(j=1; j<kp; j++) if (i%p[j]==0) break;
if (j==kp) {p[kp] = i; kp++;}
}
for(i=2; i<=SIZE; i+=2) {
for(j=0; j<kp; j++) {
for(k=j; k<kp; k++) {
if (p[j]+p[k]==i) {
items=kp;
break;
}
}
if (k<kp) break;
}
if (j==kp) printf("Исключения = %d\n", i);
}
pvm_pkint(items, DATA_SIZE, 1);
pvm_send(golds[i], MSG_DATA);
getchar();
return 0;
}
Информация о работе Параллельные вычисления с использованием библиотеки PVM