Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Распараллелить программу на ~20 компьютеров Pascal

Ответить
Настройки темы
Теория - Распараллелить программу на ~20 компьютеров Pascal

Аватара для Pavluha

Старожил


Сообщения: 165
Благодарности: 7


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте. Имеются в наличии ~20 компьютеров приблизительно одинаковой мощности, соединённые между собой в локальную сеть 100 мбит/с фул дуплекс. К примеру, я написал программу на Free Pacal, которая выполняет очень сложную задачу, но при этом эту задачу можно распараллелить (этот код для упрощения можно вынести в отдельную функцию). Вот принцип параллелизации:

1. Выбираем главный компьютер, который будет только обрабатывать результаты и выполнять код, который нельзя распараллелить;
2. Главный компьютер отсылает остальным задание (саму функцию и данные для её работы, при этом данные распределяются между всеми компьютерами);
3. Рабочие компьютеры отправляют результаты на главный компьютер;
4. Программа на главном компьютере продолжает работу.

Теперь вопрос: как реализовать.

Отправлено: 18:50, 15-09-2013

 

Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Напоминает обычную работу с распределенной обработкой данных (SQL сервер + клиент-приложение).

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:09, 15-09-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 2029
Благодарности: 704

Профиль | Отправить PM | Цитировать


Pavluha, не совсем понятен вопрос. Пишите, грубо говоря, две программы. Отдельно клиентскую часть, отдельно серверную. Потом, если захотите, сможете объединить эти части в одном исполняемом файле. Вас интересует как серверная часть будет запускать клиентские? К примеру, по ssh. Для простоты можно исходить из того, что программа установлена на все компьютеры сети. Как организовать взаимодействие? При помощи AF_INET гнезд (sockets).
Или я неправильно понял, что именно Вас интересует?

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.


Отправлено: 22:20, 15-09-2013 | #3


Аватара для Pavluha

Старожил


Сообщения: 165
Благодарности: 7

Профиль | Отправить PM | Цитировать


всё вы правильно поняли. было бы очень хорошо, чтобы распараллелизация приблизитель выглядела так:

Код: Выделить весь код
program prog;
uses paralell_mod;
var i:integer;
a,b:array[1..100000]of integer;

function myfunc(x,y:integer):integer;
begin
 myfunc:=x*y;
end;
begin
for i:=1 to 100000 do begin a[i]:=random(100); b[i]:=random(1000) end;

for i:=1 to 100000 do
 parallel(myfunc,a,b);
end.

Отправлено: 23:23, 15-09-2013 | #4


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Pavluha, самое простое, что приходит на ум "как реализовать ?" Через сетевой протокол. В любом случае это клиент-серверное приложение, и для его работы необходимо "клиент-серверное "окружение. Т.е. набор необходимых процедур и механизмов, которые проведут инициализацию каналов связи, зарегистрируются на сервере и будут вести прием/передачу данных.
В теории ...
Возникает вопрос о необходимости "передачи функции". Что под этим подразумевается? Я думаю проще вынести все необходимые функции на сторону клиента и с серверам просто указывать, какую функцию расчета следует запустить, и какие данные подать на вход.

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

----
Приведенный пример не корректен.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:52, 15-09-2013 | #5


Аватара для Pavluha

Старожил


Сообщения: 165
Благодарности: 7

Профиль | Отправить PM | Цитировать


Цитата lxa85:
Приведенный пример не корректен. »
да, пример я очень плохой привёл. тогда попробую объяснить по-другому: у меня, допустим, имеется некая большая программа со сложным кодом. и мне надо её распараллелить, при этом как можно быстрее. принимая во внимание задержку (пинг) в локальной сети, надо отправлять данные компьютерам большими кусками (чтобы всё-таки распараллелизация имела успех).

Цитата lxa85:
Pavluha, самое простое, что приходит на ум "как реализовать ?" Через сетевой протокол. В любом случае это клиент-серверное приложение, и для его работы необходимо "клиент-серверное "окружение. Т.е. набор необходимых процедур и механизмов, которые проведут инициализацию каналов связи, зарегистрируются на сервере и будут вести прием/передачу данных. »
абсолютно верно, однако, к сожалению, из всех языков программирования хорошо я знаю только паскаль, а на нём такого рода приложение написать очень трудно. можно попробовать все нужные для работы функции вынести в dll, а её можно и на с++ написать...

Цитата lxa85:
Возникает вопрос о необходимости "передачи функции". Что под этим подразумевается? Я думаю проще вынести все необходимые функции на сторону клиента и с серверам просто указывать, какую функцию расчета следует запустить, и какие данные подать на вход. »
если было бы всё так просто, я бы тему эту не создавал. дело в том, что клиент не знает, какую функцию ему нужно запустить (к примеру, написал новую, исправил ошибки и т.п.). не бегать же мне по всем компьютерам с флешкой, чтобы на каждый закинуть нужную функцию.

под этим я подразумеваю вот что: выполняется программа на главном компьютере, как только встречает код (для упрощения функцию, легче реализовать), который нужно распараллелить, она отсылает в нескомпилированном виде всем компьютерам эту функцию (на рабочих компьютерах она скомпилируется клиентской программой) и присылает сразу же массив данных, которые нужно подставить в функцию, чтобы она дала ответ. в это время главный компьютер ждёт, когда хотя бы 1 из компьютеров выполнит этот код и вернёт массив значений, и тогда даёт так сказать "следующую порцию". когда все данные розданы, идёт ожидание ответа от каждого компьютера. когда все ответы получены, главный компьютер анализирует полученные данные и продолжает работу (а рабочим компьютерам говорит "отбой").

как-то так.

Цитата lxa85:
К вопросу архитектуры проекта.
По логике вещей, хорошо бы сделать "асинхронный ввод/вывод информации". Т.е. запускать нить (?) на инициализацию клиента, одновременно с этим подготавливая пакет данных для второго и т.к.
Как это делать и как достигается такая производительность я честно сказать не знаю.
Поэтому сервер - в первую очередь диспетчер задач, и искать информацию надо в этой области. »
насчёт асинхронного ввода/вывода:

Код: Выделить весь код
while (есть данные для распараллелизации) do
 begin
  for i:=1 to n do {n-число компьютеров}
   if r[i]=0 then работает, ничего ему не давать 
    else if r[i]=1 then begin дать задание end
  else if r[i]=2 then begin считать результаты, при возможности дать ещё задание end
  else if r[i]=3 then отправляется решение, ничего не давать 
   else begin ошибка при выполнении на уд. компьютере, дать еще раз задание end
 end;
где в массиве r будет содержаться состояния работы программы. тут асинхронной должна быть только функция отправки задания и приёма решений.

Последний раз редактировалось Pavluha, 16-09-2013 в 17:02. Причина: добавлено


Отправлено: 16:48, 16-09-2013 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Распараллелить программу на ~20 компьютеров Pascal

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
7 / 2008 R2 - [решено] Установка Windows 7 на 20 компьютеров. byStep Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista 22 26-05-2013 15:59
Разное - Помогите написать программу! Turbo Pascal 7.0 MeeF Тест-форум 2 08-12-2011 01:02
Установка - установка системы на 20 компьютеров vlasoft Microsoft Windows 2000/XP 2 10-10-2011 19:01
Разное - [Pascal] помогите написать программу rom6520 Программирование и базы данных 6 22-01-2011 19:54
Разное - Pascal помогите пожалуйста написать программу Azamt Программирование и базы данных 1 21-01-2011 17:49




 
Переход