LINUX.ORG.RU

Shared Memory & Lam - MPI


0

0

Господа,

пишу программу для кластера с немеренным аппетитом на память -- одному процессу надо 1.5Гб памяти (правда read only). На кластере 2 процессора на нод, но памяти только 2Гб на нод. В результате один процессор вроде как должен простаивать (памяти на два процесса на нод не хватает).

Хочется загрузить эти 1.5Гб в память и расшерить ее между двумя процессами (оба процесса только читают -- ничего не пишут). Поиск в сети на тему shared memory and MPI дает много общих слов и очень мало конкретных реккомендаций.

Может кто сталкивался и знает где почитать?

заранее спасибо

anonymous

Занимаюсь немного схожей проблемой.

Но не совсем понятно условие :)

Во-первых, что за коммуникационная среда?

Например, на InfiniBand существует RDMA (Remote Direct Memory Access), поддерживаемый большинством реализаций MPI. Тогда расшарить память от 3 нодов по четырем процессорам достаточно тривиально с помощью MPI (правда, два проца все равно будут простаивать).

Если процессы читают данные более-менее регулярно, смело делай своп побольше и расшаривай память через mmap -- все остальное сделает операционка.

Очевидно, в остальных случаях шареная память тебе не поможет; кластер, все ж, не SMP (и даже не NUMA).

MPI2 дает возможность "сэмулировать" шареную память по сети, особенно эффективно при наличии RDMA.

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

> смело делай своп побольше и расшаривай память через mmap -- все остальное сделает операционка.

Пардон, там и расшаривать ничего не надо -- просто malloc (или mmap PRIVATE).

Все ж, не понимаю условия. Че расшаривать-то надо?

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

Среда - кластер из обычных Linux машин, используется lam реализация MPI. Железо - двухпроцессорные машины, мне не нужно, чтобы процессы на разных машинах делили память, а только те процессы, которые работают на одной и той же машине имели доступ к одной и той же памяти. Чтобы получилось, что процесса 2, они занимают оба процессора на ноде, но память у них "одна". Мне даже кажется, что в принципе достаточно для этой задачи использовать threads, просто интересно как это сделать именно средствами MPI.

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

LX (27.09.2004 22:38:12):

Понятно!

> одному процессу надо 1.5Гб памяти (правда read only). На кластере 2 процессора на нод, но памяти только 2Гб на нод.

Т.е., у них должно быть 1.5Гб общих данных, так?

> Мне даже кажется, что в принципе достаточно для этой задачи использовать threads,

Правильно! Но я бы предпочел расшарить данные через mmap с MAP_SHARED а потом отфоркнуть второй процесс. Например, в самом начале программы:

#define MB 1000*1024

size_t length=1500*MB; void *ptr=NULL;

...

ptr=mmap (0, length, PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS, 0, 0);

...fork()...

Все, имеем 2 процесса с изолированными адресными пространствами, но ptr указывает на общую память. Так работать проще, чем с тредами.

Но: если сами по себе процессы толстые, то могут не влезть вдвоем в оставшиеся пол-гига. Тогда имеет смысл изпользовать треды.

> просто интересно как это сделать именно средствами MPI.

Нет ни малейшего смысла этого делать. Много причин; основные -- менее эффективно и менее портабильно.

Я сейчас как раз решаю обратную задачу: переписываю MPI вызовы во врапперах на передачу через шареную память (для SMP).

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

В общем треды. Посмотрим что получится, в принципе меня не ждут какието шибко сильные изменения в коде, прорвемся :)

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

LX (*) (28.09.2004 20:05:27):

> В общем треды.

Учти, с тредами потом трудно будет переползти на Нуму, если понадобится. И программировать на тредах ГОРАЗДО сложнее (глобальные переменные вообше нельзя пользовать (а стэк-то -- не резиновый!), отлаживаться сложнее (чуть что -- все грохается) и т.д).

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