OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 21 Январь, 2018 09:53

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Пятница, 21 Март, 2014 22:28 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Сделал важный для себя эксперимент.

С помощью oo2c на Ubuntu получил H20, получил последние привязки к библиотеке для распределенных вычислений mpich.so, подправил их немного, написал на Linux-версии Блэкбокса простую программу.

И, о чудо, все заработало. Проверил как вариант запуска с помощью ELF библиотеки (описание) так и с помощью загрузчика.

Код:
dia@hp:~/oberon/bb-freenix/MPI$ mpiexec.mpich2 -n 5 ./blackboxc
Hello world from process 0 of 5
Hello world from process 1 of 5
Hello world from process 2 of 5
Hello world from process 3 of 5
Hello world from process 4 of 5


Вот исходный код.
Код:
MODULE Init;

   IMPORT SYSTEM, Kernel, Log, LinLog, Mpi := MpiMpi;

   VAR
      res, rank, size: INTEGER;

   PROCEDURE Init;
   BEGIN
      LinLog.Open;
      res := Mpi.MPI_Init(SYSTEM.ADR(Kernel.bootInfo.argc), SYSTEM.ADR(Kernel.bootInfo.argv));
      IF res = Mpi.MPI_SUCCESS THEN
         res := Mpi.MPI_Comm_size(Mpi.MPI_COMM_WORLD, SYSTEM.ADR(size));
         res := Mpi.MPI_Comm_rank(Mpi.MPI_COMM_WORLD, SYSTEM.ADR(rank));
         Log.String("Hello world from process");
         Log.Int(rank); Log.String(" of"); Log.Int(size); Log.Ln;
      END;
      res := Mpi.MPI_Finalize();
   END Init;
BEGIN
   Init;
   Kernel.Quit(0)
END Init.


Это позволяет запускать программы ББ на кластерах с неприличным числом узлов и ядер, особо не парясь организацией своего механизма сообщений. Библиотека mpich используется на 9 из Top 10 суперкомпьютерах.


Вложения:
mpi_demo.png
mpi_demo.png [ 289.47 КБ | Просмотров: 4115 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Суббота, 22 Март, 2014 01:15 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8915
Откуда: Россия, Орёл
Хм, как интересно, я был уверен, что MPI используется только для Фортрана и Си и требует спец. препроцессора (т.е. он - не просто библиотека, а что-то вводит в код ещё на этапе компиляции).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Суббота, 22 Март, 2014 06:15 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Илья Ермаков писал(а):
Хм, как интересно, я был уверен, что MPI используется только для Фортрана и Си и требует спец. препроцессора (т.е. он - не просто библиотека, а что-то вводит в код ещё на этапе компиляции).

Тоже так поначалу думал, но потом мне кто-то на словах сказали, что это просто библиотека по большому счету (либо коллега из лабы, либо друг с физтеха), потом я нашел в документации (сейчас с ходу не нашел где), что компиляторы (mpicc и т.п.) — просто обертки над обычными компиляторами и применяют какие-то флаги (видимо, чтобы компилятор не перемудрил с оптимизацией), а потом нашел статью кадра, который на FreePascal проделывал такой фокус.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Воскресенье, 23 Март, 2014 23:09 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Попробовал задачку посложнее сделать, распределенное вычисление суммы массива (для утяжеления расчета перед суммированием применяется произвольная процедура). Блокирующий прием и передача также нормально работают. Получается примерно в три раза быстрее сделать расчет на 4-х ядрах.

Код:
dia@hp:~/oberon/bb-freenix/MPI$ time mpiexec.mpich2 -n 1 ./blackboxc
Process 0 / 1
Total: 655520136.8390013

real   1m26.015s
user   1m25.872s
sys   0m0.020s
dia@hp:~/oberon/bb-freenix/MPI$ time mpiexec.mpich2 -n 2 ./blackboxc
Process 0 / 2
Process 1 / 2
Process 1 sum is 327760068.4224058
Process 0 sum is 327760068.4224058
Total: 655520136.8448116

real   0m43.154s
user   1m26.192s
sys   0m0.008s
dia@hp:~/oberon/bb-freenix/MPI$ time mpiexec.mpich2 -n 3 ./blackboxc
Process 2 / 3
Process 0 / 3
Process 1 / 3
Process 2 sum is 218508460.3361039
Process 0 sum is 218505838.2555565
Process 1 sum is 218505838.2555565
Total: 655520136.847217

real   0m36.934s
user   1m50.220s
sys   0m0.280s
dia@hp:~/oberon/bb-freenix/MPI$ time mpiexec.mpich2 -n 4 ./blackboxc
Process 0 / 4
Process 1 / 4
Process 3 / 4
Process 2 / 4
Process 3 sum is 163880034.2117313
Process 1 sum is 163880034.2117313
Process 2 sum is 163880034.2117313
Process 0 sum is 163880034.2117313
Total: 655520136.8469253

real   0m30.281s
user   1m54.208s
sys   0m0.096s


Вот так выглядит код модуля. К сообщению приложил сборку, которую использовал, и наброски заголовочных файлов к MPI.
Код:
MODULE Init;

   IMPORT SYSTEM, Kernel, Log, Math, LinLog, Strings, ObxRandom, Mpi := MpiMpi;

   VAR
      res, myrank, size: INTEGER;
      sizeStr, rankStr: ARRAY 8 OF CHAR;
      status: Mpi.MPI_Status;
      
   PROCEDURE F (a: REAL): REAL;
   VAR i, j: INTEGER; res: REAL;
   BEGIN
      res := 0;
      FOR i := 0 TO 1000 DO
         res := res + Math.Sin(a) + Math.Cos(a * 0.9) / (Math.Sin(a * 0.9) + Math.Cos(a))
      END;
      RETURN res
   END F;

   PROCEDURE SumSin (a: ARRAY OF REAL): REAL;
   CONST
      bal = 4; (* Балланс, количество процессов, до которого нулевой процесс участвует в расчетах (всегда > 1) *)
   VAR
      i, p, bite, rest, shift: INTEGER;  sum, sum_ext: REAL; sumStr: ARRAY 64 OF CHAR;
   BEGIN
      (* Проверяем есть ли необходимость параллелить процесс суммирования *)
      IF (size > 1) & (LEN(a) > 1000) THEN
         (* Разбиваем массив в зависимости от того, участвует нулевой процесс в расчетах или нет *)
         IF size <= bal THEN
            shift := 0;
            bite := LEN(a) DIV size;
            rest := bite + LEN(a) MOD size
         ELSE
            shift := -1;
            bite := LEN(a) DIV (size - 1);
            rest := bite + LEN(a) MOD (size - 1)
         END;
         
         IF myrank = 0 THEN
            (* Отправляем данные остальным процессам *)
            IF size > 2 THEN
               FOR p := 1 TO size - 2 DO
                  res := Mpi.MPI_Send(SYSTEM.ADR(a[bite * (p + shift)]), bite, Mpi.MPI_DOUBLE, p, 1, Mpi.MPI_COMM_WORLD);
               END;
               res := Mpi.MPI_Send(SYSTEM.ADR(a[LEN(a) - rest]), rest, Mpi.MPI_DOUBLE, size - 1, 1, Mpi.MPI_COMM_WORLD)
            ELSE
               res := Mpi.MPI_Send(SYSTEM.ADR(a[bite]), rest, Mpi.MPI_DOUBLE, 1, 1, Mpi.MPI_COMM_WORLD);
            END;
            
            sum := 0;
            IF size <= bal THEN
               FOR i:=0 TO bite - 1 DO
                  sum := sum + F(a[i])
               END;
               Strings.RealToString(sum, sumStr);
               Log.String("Process " + rankStr + " sum is " + sumStr + 0AX);
            END;
            
            (* Собираем результаты расчетов *)
            FOR p := 1 TO size - 1 DO
               res := Mpi.MPI_Recv(SYSTEM.ADR(sum_ext), 1, Mpi.MPI_DOUBLE, p, 2, Mpi.MPI_COMM_WORLD, SYSTEM.ADR(status));
               sum := sum + sum_ext
            END

         ELSIF myrank = size - 1 THEN
            (* Вычисления последнего процесса, в случае двух - второго *)
            res := Mpi.MPI_Recv(SYSTEM.ADR(a), rest, Mpi.MPI_DOUBLE, 0, 1, Mpi.MPI_COMM_WORLD, SYSTEM.ADR(status));
            sum := 0;
            FOR i:=0 TO rest - 1 DO
               sum := sum + F(a[i])
            END;
            Strings.RealToString(sum, sumStr);
            Log.String("Process " + rankStr + " sum is " + sumStr + 0AX);
            res := Mpi.MPI_Send(SYSTEM.ADR(sum), 1, Mpi.MPI_DOUBLE, 0, 2, Mpi.MPI_COMM_WORLD)
         ELSE
            (* Вычисления остальных процессов *)
            res := Mpi.MPI_Recv(SYSTEM.ADR(a), bite, Mpi.MPI_DOUBLE, 0, 1, Mpi.MPI_COMM_WORLD, SYSTEM.ADR(status));
            sum := 0;
            FOR i:=0 TO bite - 1 DO
               sum := sum + F(a[i])
            END;
            Strings.RealToString(sum, sumStr);
            Log.String("Process " + rankStr + " sum is " + sumStr + 0AX);
            res := Mpi.MPI_Send(SYSTEM.ADR(sum), 1, Mpi.MPI_DOUBLE, 0, 2, Mpi.MPI_COMM_WORLD)
         END
      ELSE
         (* Суммируем без использования распределенных вычислений *)
         sum := 0;
         FOR i:=0 TO LEN(a) - 1 DO
            sum := sum + F(a[i])
         END
      END;
      RETURN sum
   END SumSin;

   

   PROCEDURE Init*;
   VAR a: ARRAY 10000 OF INTEGER; b: ARRAY 500000 OF REAL;  i, sum: INTEGER; sum2: REAL; sumStr: ARRAY 64 OF CHAR;
   BEGIN
      LinLog.Open;
      res := Mpi.MPI_Init(SYSTEM.ADR(Kernel.bootInfo.argc), SYSTEM.ADR(Kernel.bootInfo.argv));
      res := Mpi.MPI_Comm_size(Mpi.MPI_COMM_WORLD, SYSTEM.ADR(size));
      res := Mpi.MPI_Comm_rank(Mpi.MPI_COMM_WORLD, SYSTEM.ADR(myrank));
      Strings.IntToString(size, sizeStr);
      Strings.IntToString(myrank, rankStr);
      Log.String("Process " + rankStr + " / " + sizeStr + 0AX);
      
      
      
      IF myrank = 0 THEN
         FOR i :=0 TO LEN(b) - 1 DO
            b[i] := 0.987981723;
         END;
      END;
      
      sum2 := SumSin(b);
      
      IF myrank = 0 THEN
         Strings.RealToString(sum2, sumStr);
         Log.String("Total: " + sumStr + 0AX);
      END;
      
      res := Mpi.MPI_Finalize()
   END Init;
   
BEGIN
   Init;
   Kernel.Quit(0)
END Init.


Вложения:
Linux_GUI_MPI.7z [1.91 МБ]
Скачиваний: 129
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Понедельник, 24 Март, 2014 11:08 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1158
Откуда: Tel-Aviv
Иван, автор проекта BUGS, Andrew Thomas, как-то интересовался параллельным вычислениями. Стоит сообщить также о своих успехах в списке рассылки BlackBox.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Понедельник, 15 Сентябрь, 2014 14:02 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1158
Откуда: Tel-Aviv
В тему сообщения http://forum.oberoncore.ru/viewtopic.php?f=127&p=89013#p89013
Иван Денисов писал(а):

Так что-то интереснее hello world получилось вычислять?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Понедельник, 15 Сентябрь, 2014 15:21 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Роман М. писал(а):
В тему сообщения http://forum.oberoncore.ru/viewtopic.php?f=127&p=89013#p89013
Иван Денисов писал(а):

Так что-то интереснее hello world получилось вычислять?

На локальной машине с MPI да, выложу своё видео на днях и тут опубликую компонент для этого. А на кластере пока в режиме тестирования, особо ничего интересного не сделал, но планирую в ближайшее время. Буду тут писать, что получается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Понедельник, 15 Сентябрь, 2014 15:21 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Роман М. писал(а):
В тему сообщения http://forum.oberoncore.ru/viewtopic.php?f=127&p=89013#p89013
Иван Денисов писал(а):

Так что-то интереснее hello world получилось вычислять?

На локальной машине с MPI да, выложу своё видео на днях и тут опубликую компонент для этого. А на кластере пока в режиме тестирования, особо ничего интересного не сделал, но планирую в ближайшее время. Буду тут писать, что получается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Понедельник, 15 Сентябрь, 2014 15:33 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1158
Откуда: Tel-Aviv
Ну, понятно, публиковать только когда готово. Интересно в каком направлении понадобились параллельные вычисления. Есть, допустим, нейросети, параметры которых можно вычислять параллельно. Даже чипы такие выпускаются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Понедельник, 15 Сентябрь, 2014 15:41 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Роман М. писал(а):
Ну, понятно, публиковать только когда готово. Интересно в каком направлении понадобились параллельные вычисления. Есть, допустим, нейросети, параметры которых можно вычислять параллельно. Даже чипы такие выпускаются.

Да, про чипы SyNAPSE IBM я слышал замечательную новость. У меня задача другая, расчет многоуровневой самосборки, динамика многих тел. Это важно для развития биологических моделей. Может быть ты слышал что-нибудь про Coarse-Grained Molecular Dynamics методы. Я работаю над их следующей продвинутой версией :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Вторник, 29 Сентябрь, 2015 11:53 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Публикую черновой вариант высокоуровневой обертки над MPICH2: download/file.php?id=5486


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Четверг, 01 Октябрь, 2015 23:20 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1158
Откуда: Tel-Aviv
Иван Денисов писал(а):
Публикую черновой вариант высокоуровневой обертки над MPICH2: download/file.php?id=5486

Внёс исправления.
Вложение:
Quick-Start.odc [14.93 КБ]
Скачиваний: 80

Стоит проверить изменения, сравнивая с F9.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Суббота, 03 Октябрь, 2015 21:55 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Роман М. писал(а):
Внёс исправления. Стоит проверить изменения, сравнивая с F9.

Спасибо, Роман. Я учел все твои правки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: oo2c->H20->MPICH + BB-LINUX
СообщениеДобавлено: Воскресенье, 04 Октябрь, 2015 17:08 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2004
Откуда: Красноярск
Завел для компонента хранилище:
http://gitlab.molpit.com/idenisov/Robust
Добавил вот такой hook на каждое событие загрузки:
http://molpit.com/hooks/comp.php?name=R ... r-List.odc
Программа на сервере сжимает компонент и выкладывает по адресу:
http://comp.molpit.com/idenisov/Robust.txt


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


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

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


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

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