OberonCore https://forum.oberoncore.ru/ |
|
oo2c->H20->MPICH + BB-LINUX https://forum.oberoncore.ru/viewtopic.php?f=34&t=5036 |
Страница 1 из 1 |
Автор: | Иван Денисов [ Пятница, 21 Март, 2014 22:28 ] | ||
Заголовок сообщения: | oo2c->H20->MPICH + BB-LINUX | ||
Сделал важный для себя эксперимент. С помощью 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 суперкомпьютерах.
|
Автор: | Илья Ермаков [ Суббота, 22 Март, 2014 01:15 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Хм, как интересно, я был уверен, что MPI используется только для Фортрана и Си и требует спец. препроцессора (т.е. он - не просто библиотека, а что-то вводит в код ещё на этапе компиляции). |
Автор: | Иван Денисов [ Суббота, 22 Март, 2014 06:15 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Илья Ермаков писал(а): Хм, как интересно, я был уверен, что MPI используется только для Фортрана и Си и требует спец. препроцессора (т.е. он - не просто библиотека, а что-то вводит в код ещё на этапе компиляции). Тоже так поначалу думал, но потом мне кто-то на словах сказали, что это просто библиотека по большому счету (либо коллега из лабы, либо друг с физтеха), потом я нашел в документации (сейчас с ходу не нашел где), что компиляторы (mpicc и т.п.) — просто обертки над обычными компиляторами и применяют какие-то флаги (видимо, чтобы компилятор не перемудрил с оптимизацией), а потом нашел статью кадра, который на FreePascal проделывал такой фокус. |
Автор: | Иван Денисов [ Воскресенье, 23 Март, 2014 23:09 ] | ||
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX | ||
Попробовал задачку посложнее сделать, распределенное вычисление суммы массива (для утяжеления расчета перед суммированием применяется произвольная процедура). Блокирующий прием и передача также нормально работают. Получается примерно в три раза быстрее сделать расчет на 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.
|
Автор: | Роман М. [ Понедельник, 24 Март, 2014 11:08 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Иван, автор проекта BUGS, Andrew Thomas, как-то интересовался параллельным вычислениями. Стоит сообщить также о своих успехах в списке рассылки BlackBox. |
Автор: | Роман М. [ Понедельник, 15 Сентябрь, 2014 14:02 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
В тему сообщения http://forum.oberoncore.ru/viewtopic.php?f=127&p=89013#p89013 Иван Денисов писал(а): Мой доклад: http://molpit.com/files/592_oberon.pdf Так что-то интереснее hello world получилось вычислять? |
Автор: | Иван Денисов [ Понедельник, 15 Сентябрь, 2014 15:21 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Роман М. писал(а): В тему сообщения http://forum.oberoncore.ru/viewtopic.php?f=127&p=89013#p89013 Иван Денисов писал(а): Мой доклад: http://molpit.com/files/592_oberon.pdf Так что-то интереснее hello world получилось вычислять? На локальной машине с MPI да, выложу своё видео на днях и тут опубликую компонент для этого. А на кластере пока в режиме тестирования, особо ничего интересного не сделал, но планирую в ближайшее время. Буду тут писать, что получается. |
Автор: | Иван Денисов [ Понедельник, 15 Сентябрь, 2014 15:21 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Роман М. писал(а): В тему сообщения http://forum.oberoncore.ru/viewtopic.php?f=127&p=89013#p89013 Иван Денисов писал(а): Мой доклад: http://molpit.com/files/592_oberon.pdf Так что-то интереснее hello world получилось вычислять? На локальной машине с MPI да, выложу своё видео на днях и тут опубликую компонент для этого. А на кластере пока в режиме тестирования, особо ничего интересного не сделал, но планирую в ближайшее время. Буду тут писать, что получается. |
Автор: | Роман М. [ Понедельник, 15 Сентябрь, 2014 15:33 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Ну, понятно, публиковать только когда готово. Интересно в каком направлении понадобились параллельные вычисления. Есть, допустим, нейросети, параметры которых можно вычислять параллельно. Даже чипы такие выпускаются. |
Автор: | Иван Денисов [ Понедельник, 15 Сентябрь, 2014 15:41 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Роман М. писал(а): Ну, понятно, публиковать только когда готово. Интересно в каком направлении понадобились параллельные вычисления. Есть, допустим, нейросети, параметры которых можно вычислять параллельно. Даже чипы такие выпускаются. Да, про чипы SyNAPSE IBM я слышал замечательную новость. У меня задача другая, расчет многоуровневой самосборки, динамика многих тел. Это важно для развития биологических моделей. Может быть ты слышал что-нибудь про Coarse-Grained Molecular Dynamics методы. Я работаю над их следующей продвинутой версией |
Автор: | Иван Денисов [ Вторник, 29 Сентябрь, 2015 11:53 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Публикую черновой вариант высокоуровневой обертки над MPICH2: download/file.php?id=5486 |
Автор: | Роман М. [ Четверг, 01 Октябрь, 2015 23:20 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Иван Денисов писал(а): Публикую черновой вариант высокоуровневой обертки над MPICH2: download/file.php?id=5486 Внёс исправления. Вложение: Стоит проверить изменения, сравнивая с F9. |
Автор: | Иван Денисов [ Суббота, 03 Октябрь, 2015 21:55 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Роман М. писал(а): Внёс исправления. Стоит проверить изменения, сравнивая с F9. Спасибо, Роман. Я учел все твои правки. |
Автор: | Иван Денисов [ Воскресенье, 04 Октябрь, 2015 17:08 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Завел для компонента хранилище: 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 |
Автор: | Иван Денисов [ Среда, 12 Февраль, 2020 06:56 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Актуализация ссылок Завел для компонента хранилище: https://gitlab.molpit.org/idenisov/Robust Добавил вот такой hook на каждое событие загрузки: http://hook.molpit.org/?name=Robust&rep ... r-List.odc Программа на сервере сжимает компонент и выкладывает по адресу: http://comp.molpit.org/idenisov/Robust.txt Описание на сайте: https://blackbox.oberon.org/extension/Robust |
Автор: | arlean1 [ Среда, 11 Март, 2020 23:09 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Кто-то пытался под Windows собрать проект с MPICH - Работает? |
Автор: | Иван Денисов [ Четверг, 12 Март, 2020 06:43 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Я не пробовал MPICH для Windows. Посмотрите MultiBUGS используют MS-MPI https://github.com/MultiBUGS/MultiBUGS |
Автор: | arlean1 [ Четверг, 12 Март, 2020 08:20 ] |
Заголовок сообщения: | Re: oo2c->H20->MPICH + BB-LINUX |
Спасибо! |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |