OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 05 Декабрь, 2019 23:42

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 15:23 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2466
Здравствуйте уважаемые участники форума. Несколько лет стараюсь следить за новостями и разбираться по мере сил со средой BlackBox. Написал программу, которая требует много ресурсов процессора. У меня двуядерный и хотелось бы загружать оба камня вычислениями, а не только один. С потоками и ядром Active BlackBox, пока не разбирался.
Подскажите с чего начать?
Как заставить программу работать на двух процессорах?
Есть ли доступный пример?
Как заложить масштабируемость в программу, на случай, если появится больше процессоров?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 15:50 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9161
Откуда: Россия, Орёл
Нужно в первую очередь понять характер задач, которые Вы собираетесь решать.

Расскажите, пожалуйста.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 17:20 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2466
1. Решаю задачу взаимодействие многих тел. Объект - система тел. Одна процедура вычисляет все силы в системе (тут больше всего операций), вторая сдвигает тела, после того как все силы вычислены, + разные сервисные операции, вывести во вьюшку, записать в файл, записать картинку на диск, отчитаться в Лог.

Этап вычисления сил отлично распараллеливается (в голове пока :) ). Раздаем объект разным процессорам (методам работающим на разных процессорах) и говорим, что один считает первую половину тел системы, второй - вторую. Потом они записывают результат назад в объект и запускается следующая процедура (перемещение). И так далее.

Сейчас я почти в реальном времени считаю 200 заряженных шариков, а необходимо больше. Решил записывать bmp и потом собирать их в avi, чтобы смотреть, что получается, но этот процесс хочется ускорить.

2. Обучаю нейросеть. Там примерно то же самое можно сделать. Следующая итерация объекта зависит от состояния объекта на предыдущем шаге, а значит можно разбить на независимые вычисления.

Мне бы помог такой инструмент: клоны методов для разных процессоров. Скажем вот такой абстрактный код:

Код:
MODULE GasDinamic;
IMPORT CpuMaster;

TYPE
   Body = RECORD
      f, .... : REAL;
   END;
   System = POINTER TO ARRAY OF Body;

VAR
   gas: System;

PROCEDURE (sys: System) Count (a, b: INTEGER), NEW;
VAR i: INTEGER;
BEGIN
   FOR i:=a TO b-1 DO
      sys[i].body.f := F(sys); (* где F нигде не зависит от sys[*].body.f *)
   END
END Count;

PROCEDURE (sys: System) Step(cpu: INTEGER), NEW;
VAR n,i: INTEGER;
BEGIN
   n:=CpuMaster.HowMuch; (* Определяем сколько процессоров *)
   FOR i:=0 TO n-1 DO
      CpuMaster.Exec(sys.Count(LEN(sys)/n*i,LEN(sys)/n*(i+1)), i); (* выполнить процедуру на i процессоре *)
   END;
   CpuMaster.Wait;    (* теперь ждем пока посчитает каждый свою порцию и продолжаем работу. *)
   ...

END Step;

...

BEGIN
   NEW(gas, 100);
   ...

END GasDinamic.


Как такой CpuMaster написать? Или есть проще решение? Я не специалист в программировании.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 17:33 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9161
Откуда: Россия, Орёл
Для Вашей задачи однозначно нужно запускать отдельные процессы (отдельные Блэкбоксы). Ведущий ББ раздаёт остальным задания и собирает ответы. Тогда Вы сможете не только несколько процессоров использовать, но и несколько машин.

Наладьте взаимодействие через CommStreams, по протоколу TCP. На одной машине это делается через loopback-адрес localhost (= 127.0.0.1).

В подсистеме Comm есть документация и пример клиента и сервера.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 17:42 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2466
Спасибо за оперативность, такой совет - именно то, что мне было нужно! Отпишусь в этом топике, когда что-то получится с TCP, раз начал такую тему.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 17:55 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Наладьте взаимодействие через CommStreams, по протоколу TCP. На одной машине это делается через loopback-адрес localhost (= 127.0.0.1).

А не станет ли такая связь бутылочным горлышком? Может лучше общую память использовать (memory-mapped file)?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 18:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9161
Откуда: Россия, Орёл
Нормальный подход - сделать свой модуль с Send - Recv нужных типов. Под него зафигачить CommStreams.

Понадобится оптимизировать - заменить реализацию.

Всегда надо найти способ отложить оптимизации и усложнения на потом. Главное, чтобы оптимизации оставались всегда возможными. (Впрочем, обратное обычно получается вследствие нарушения "разделяй и властвуй". Вот в .NET/Java не разделили ООП и динамическую память - и хоть ап стену убейся...)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 18:28 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8209
Откуда: Троицк, Москва
Илья Ермаков писал(а):
однозначно нужно запускать отдельные процессы (отдельные Блэкбоксы). Ведущий ББ раздаёт остальным задания и собирает ответы.
Ну, кажется, подход, о котором "столько лет говорили большевики", наконец, побеждает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 19:04 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 159
Откуда: Питер
Может, имеет смысл критические куски программы написать в XDS'е и затем использовать в ББ при помощи DLL? А то ведь возня с несколькими экземплярами ББ, как мне кажется, не лучший путь для оптимизации программы по скорости.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 19:22 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9161
Откуда: Россия, Орёл
Коллеги, да какая хоть к лешему оптимизация...
Что оптимизировать, если ещё нет не только потребности в оптимизации, но даже самого оптимизируемого объекта??


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 21:48 

Зарегистрирован: Четверг, 03 Август, 2006 16:28
Сообщения: 182
GameHunter писал(а):
Может, имеет смысл критические куски программы написать в XDS'е и затем использовать в ББ при помощи DLL? А то ведь возня с несколькими экземплярами ББ, как мне кажется, не лучший путь для оптимизации программы по скорости.

Кстати, XDS на "числодробительных" задачах может иметь ощутимое преимущество перед BB. Я как-то делал программу для кластерного анализа довольно большого объема данных (обработка одной порции занимала несколько суток). Разница в скорости между XDS и BB была около 2.5 раз.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 08 Октябрь, 2009 23:00 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2318
Откуда: Россия, Томск
XDS поддерживает multithreading, так что каждый поток выполнения на свой процессор - и вперёд.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Октябрь, 2009 07:26 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8209
Откуда: Троицк, Москва
Sergo писал(а):
... Я как-то делал программу для кластерного анализа довольно большого объема данных (обработка одной порции занимала несколько суток). Разница в скорости между XDS и BB была около 2.5 раз.
Надо бы почаще упоминать о проектах, сделанных на Оберонах, "чтобы народ знал" (С)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Октябрь, 2009 09:39 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2466
Думаю сделать модули приема и передачи объекта, а реализацию пока сделать по TCP. возни с ядрами не должно быть, поскольку BlackBox умеет сам тебя запускать, и запуск второго ядра можно включить в программу, и, на сколько я понимаю, дальше операционная система сама разберется какому процессору отдавать операции ядер? С оперативной памятью работать не умею, поэтому эксперименты с общей оперативной памятью пока отложу. Думаю что мой объект не станет узким местом, поскольку он не очень большой порядка нескольких тысяч real, но благодарю за совет, это может пригодится в будущем, и может еще кто будет читать ветку.
Большой плюс что, развитие в сторону работы с сетевым протоколом, дает возможнось масштабирования. При достойной задаче, могут пустить на суперкомпьютер посчитать, а он у нас в универе работает по TCP. Про XDS, у него какая лицензия? Для студентов бесплатная? Если нет, то пока не вариант и как то не в духе BlackBox'а использовать сторонние библиотеки, хотя пришлось прикурить exe'шник ffmpeg, чтобы он картинки собирал в видеофайл.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 09 Октябрь, 2009 09:51 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8209
Откуда: Троицк, Москва
divan писал(а):
При достойной задаче, могут пустить на суперкомпьютер посчитать, а он у нас в универе работает по TCP. Про XDS, у него какая лицензия?
TCP уже давно стандарт на такого рода "суперкомпах" (чего в них такого уж супер, не очень понятно).

XDS бесплатный, только без исходников.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 10 Октябрь, 2009 00:25 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
>> в реальном времени считаю 200 заряженных шариков

У меня на втором курсе галактика из 200 звёзд довольно шустро крутилась на 286 компьютере. Лет шесть назад крутилась галактика из 5000 звёзд на Pentium 4 с использованием SSE (правда, чтоб задействовать SSE пришлось на ассемблере писать, ускорение получалось в 8 раз чем без SSE). Поэтому возникает вопрос. Вам сколько тел надо обсчитывать? Если меньше пяти тысяч, то может Вам на самом деле распараллеливания не надо, а просто нужно подумать над алгоритмом как следует?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 10 Октябрь, 2009 06:20 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2318
Откуда: Россия, Томск
divan писал(а):
как то не в духе BlackBox'а использовать сторонние библиотеки
Ничего себе заявленьице. : ) Стандартные контролы, окна и меню уже не считаются? : ) Они из виндовой библиотеки взяты, а не на ББ написаны.
А если поддержку разных форматов изображений делать - тоже самому писать? Или лучше FreeImage.dll задействовать?
Свой код иметь, конечно, лучше во многих случаях, но не во всех.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Октябрь, 2009 12:23 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2466
По TCP отправлять можно только BYTES, как я понял, значит REAL нужно в BYTES преобразовывать. Подскажите, как это сделать? Ведь один REAL занимает 4 BYTES.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Октябрь, 2009 14:54 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8209
Откуда: Троицк, Москва
divan писал(а):
Ведь один REAL занимает 4 BYTES.
8.

Смотрите исходник модуля Stores:
PROCEDURE (VAR wr: Writer) WriteReal* (x: REAL), NEW;

Сделайте аналог Stores.Writer|Reader над TCP.

(Давно уж пора сделать бы ...)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Октябрь, 2009 10:57 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Не надо над TCP делать read/write мапперы навроде Stores.Reader/Writer. Это просто не эффективно, например, если выполнено два вызова WriteByte, то значит по сети надо переслать 1 байт, а потом переслать ещё 1 байт? Нет, здесь паттерн carrier-rider-mapper не применим. Сеть - это не carrier. По сети надо передавать пакеты сообщений (то есть даже не по одному сообщению, а по целой пачке сообщений за раз). Потоковый протокол TCP был изобретён по ошибке. Сейчас уже это поняли и от него начинают отказываются в пользу других протоколов согласно которым по сети течёт не поток байтов, а едут достаточно большого размера сообщения (что-то вроде UDP, но только с гарантированной доставкой, и сообщения произвольного размера).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB