Уровень распределения MPI - PullRequest
       16

Уровень распределения MPI

5 голосов
/ 30 сентября 2011

Я использовал MPI для написания слоя распространения. Допустим, у нас есть n источников данных и k потребителей данных. В моем подходе каждый из n процессов MPI считывает данные, а затем распределяет их одному (или нескольким) из k потребителей данных (других процессов MPI) заданным образом (логика).

Так что это кажется очень общим, и мой вопрос, что-то подобное уже сделано?

Это кажется простым, но это может быть очень сложно. Допустим, что распределение проверяет, кто из потребителей данных готов к работе (динамическое распределение работы). Он может распространять данные в соответствии с заданным алгоритмом на основе данных. Есть много возможностей, и я, как и каждый из нас, не хочу изобретать велосипед.

1 Ответ

1 голос
/ 07 октября 2011

Насколько я знаю, для него нет универсальной реализации, кроме самого MPI API.Вы должны использовать правильные функции в соответствии с ограничениями задачи.

Если вы пытаетесь создать простую синхронизированную очередь заданий / данных n-производителей-и-потребителей, то, конечно, уже есть многореализации (просто Google, и вы должны получить несколько).

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

Все это в стороне, вот одна из реализаций, которая приходит на ум, которая, кажется, отвечает всем вашим требованиям.:
Создайте синхронизированную очередь, производители помещают данные в один конец, потребители получают их издругой (выбирайте все виды поведения для очереди по мере необходимости - ограничен ли размер очереди, добавляется ли элемент в полный блок очереди или нет, удаляется ли элемент из пустого блока очереди или происходит сбой и т. д.).
Предполагая, что данные содержат некоторый флаг, который сообщает потребителям, предназначены ли эти данные для всех или только для одного из них, потребители просматривают и либо удаляют элемент, либо оставляют его там и просто отмечают, что они уже сделали это (либосохранение его идентификатора локально или путем изменения флага в самих данных).
Если вы не хотите, чтобы один блок коллективных данных блокировался до тех пор, пока все с ним не разбираются, вы можете использовать 2 очереди, по одной для каждого типаданные, и потребители будут получать данные из одной из очередей одновременно (либо каждый раз выбирая другую очередь, произвольно выбирая очередь, назначая приоритет одной из очередей, либо по некоторому принятому порядку, который выводится из данных (например,сначала самый низкий идентификатор)).

Извините за длинный ответ, и я надеюсь, что это поможет:)

...