LINUX.ORG.RU

увеличения стека для каждого из параллельных процессов


0

0

Привет, Уважаемые.

Имеется проблема следующего вида. Есть программа на Fortran 90 + mpich. Раньше компилилась Intel Fortranом 7.x со статической линковкой и все было круто. Но с некоторых пор 7 компилятор перестал устраивать и пришлось перейти на 8.x . После перехода возникли проблемы с нехваткой размера стека во время выполнения.

Обычно в этом случае советуют под линуксом увеличить лимиты на размер стека командой ulimit -s unlimited. Все отлично, эта команда помогает, если запускаем однопроцессорный расчет. Но как быть при запуске процессов через mpirun?? Задание вышеуказанной команды не помогает увеличить стек для всех запущенных процессов ;(((

У кого есть идеи? Буду счастлив услышать голос истины ;)

denlu[dog]yandex.ru


Ограничение задается где-то в стартовых скриптах. Посмотри на всех узлах скрипты .bashrc .cshrc .tcshrc /etc/bash.bashrc /etc/csh.login /etc/profile .bash_profile -- какие оболочки используются? -- и поудаляй ulumut -s (или какие аналоги в других шеллах).

Die-Hard ★★★★★
()
Ответ на: комментарий от Murr

Murr (12.01.2005 17:02:06)

> Ну стандартные ограничения на стек можно увеличить и вручную...

Из просесса через setrlimit?

А как это на Фортране сделать? Очевидно, system не поможет...

Die-Hard ★★★★★
()
Ответ на: комментарий от Murr

Касаемо обертки

пробовал написать такой скрипт:

script:

ulimit -s unlimited ; ./myprogram argument

Обычно я запускаю параллельную программу так: mpirun -np 3 ./myprogram argument

Со скриптом пробовал запускать так: mpirun -np 3 ./script но неудачно. Запускается только 1 процесс, а не три, как должно быть

denlu
() автор топика
Ответ на: комментарий от denlu

2denlu:

Попробуй в своем

~/.bashrc поставить последней командой ulimit -s unlimited

~/.cshrc поставить последней командой limit stacksize unlimited

~/.tcshrc поставить последней командой limit stacksize unlimited

на всех узлах (если кластер).

Хотя, скорее всего, не поможет.

Die-Hard ★★★★★
()
Ответ на: комментарий от denlu

Попробуй сделать наоборот - запустить mpirun из скрипта
в котором выставляется ulimit -s ...
по идее мягкие лимиты наследуются дочерним процессом. См пример:

------ test-limit --------
#/bin/sh
ulimit -s
ulimit -s 10000
./test-ulimit-slave
./test-ulimit-slave
./test-ulimit-slave
./test-ulimit-slave
-------------------------


----- test-ulimit-slave -------
#/bin/sh
ulimit -s
------------------------------------

ss@toshiba:/tmp$ ./test-ulimit
unlimited
10000
10000
10000
10000
ss@toshiba:/tmp$ ./test-ulimit
unlimited
10000
10000
10000
10000
ss@toshiba:/tmp$

То бишь пишешь скрипт
#/bin/sh
ulimit -s unlimited
mpirun -np {bla-bla-bla}
и вуаля ...

sS ★★★★★
()
Ответ на: комментарий от sS

sS (12.01.2005 18:41:31):

> запустить mpirun из скрипта в котором выставляется ulimit -s

Он же написал, что не получается!

mpirun стартует процессы на разных узлах!

Die-Hard ★★★★★
()
Ответ на: комментарий от sS

sS (12.01.2005 18:43:42):

Обычно home шарится на кластер через NFS, так что реально править придется только *rc на различных кластерах (их может быть >1!)

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

>mpirun стартует процессы на разных узлах!

Да я все время забываю что еще есть на свете костыли типа mpirun и FORTRAN ;)

Кстати неMPI программы то же самый lam умеет пущать через lamexec

А как это делает MPICH нужно лезть на кластер и смотреть ... давно я забыл про такую глупость :) К хорошему слишком быстро привыкаешь ;) (имеется ввиду MOSIX)

sS ★★★★★
()
Ответ на: комментарий от sS

к сожалению, этот вариант не работает. Я проверял просто из оболочки -- сначала задавал команду ulimit -s unlimited, а потом следующей командой пускал mpirun -np 3 ./myprog args. (Заодно, может, кто подскажет, как из программы узнать размер стека -- хотя бы на C. Соединить С с Fortran'ом как-нибудь смогу ;)) )

Может, кто-нибудь знает, что конкретно делает mpirun при запуске параллельных процессов? Я не слишком хорошо разбираюсь во внутренностях библиотеки mpich, но кажется, что при запуске параллельных процессов используется либо rsh, либо ssh (в зависимости от опций при компиляции mpich). Может, можно как-нибудь установить лимиты для всех сессий rsh и ssh? (Сорри, если говорю глупость..)

denlu
() автор топика
Ответ на: комментарий от denlu

А что вообще делает mpirun? (давно, блин, было) Просто распространяет код по сети и запускает? Запускает просто через ssh или из контекста сервера на удаленной машине?

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

Murr ★★
()
Ответ на: комментарий от denlu

denlu (13.01.2005 10:16:45):

> как из программы узнать размер стека

Используемый стек: man getrusage в районе ru_isrss

ОГРАНИЧЕНИЕ на стек: man getrlimit

> Соединить С с Fortran'ом как-нибудь смогу

Тогда прямо из программы (до MPI_Init) убери ограничение вызовом setrlimit

> при запуске параллельных процессов используется либо rsh, либо ssh

Верно, если на кластере

> Может, можно как-нибудь установить лимиты для всех сессий rsh и ssh?

Я ж тебе советовал, как это можно ПОПРОБОВАТЬ сделать. Не получается, или не пробовал?

Die-Hard ★★★★★
()
Ответ на: комментарий от Murr

2Murr:

> Запускает просто через ssh

Есть варианты.

Обычно через ssh или rsh. А потом процессы коннектятся к серверу. Но можно посвистеть, и все будет иначе -- я что-то припоминаю, но не интересовался деталями.

> ...там вроде есть некие rc файлы, но ведь ssh их в отдельном bash скрипте выполнит.

Почему? ssh пускает программы из-под оболочки, которая, вообще говоря, сначала rc файлы прочитает.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.