MPI - получить несколько целых чисел от задачи 0 (корень)

Я решаю эту проблему. Я реализую циклическое отображение, у меня 4 процессора, поэтому одна задача отображается на процессор 1 (корень), а затем три других являются рабочими. Я использую циклическое отображение, и у меня есть несколько целых чисел, например. 0-40. Я хочу от каждого работника получить (в этом случае это будет 10 целых чисел для каждого работника), сделать некоторый подсчет и сохранить его.

Я использую MPI_Send для отправки целых чисел из корня, но я не знаю, как умножить получение некоторых чисел из одного и того же процесса (корень). Также я отправляю int с размером буфера, фиксированным на 1, когда есть число, например. 12, это будет делать плохие вещи. Как проверить длину int?

Любой совет будет принят во внимание. Спасибо


mpi
person Waypoint    schedule 05.03.2011    source источник


Ответы (1)


Я предполагаю, что вы работаете на С++, хотя в вашем вопросе ничего не сказано. В любом случае, давайте посмотрим на аргументы MPI_Send:

MPI_SEND(buf, count, datatype, dest, tag, comm)

Второй аргумент указывает, сколько элементов данных вы хотите отправить. Этот вызов в основном означает, что "buf указывает на точку в памяти, где есть count значений, все они типа datatype, одно за другим: отправьте их". Это позволяет отправлять содержимое всего массива, например:

int values[10];
for (int i=0; i<10; i++)
    values[i] = i;
MPI_Send(values, 10, MPI_INTEGER, 1, 0, MPI_COMM_WORLD);

Это начнет чтение памяти в начале values и продолжит чтение, пока не будет прочитано 10 MPI_INTEGERs.

В вашем случае распределения чисел между процессами вы делаете это с помощью MPI_Send:

int values[40];
for (int i=0; i<40; i++)
    values[i] = i;
for (int i=1; i<4; i++)  // start at rank 1: don't send to ourselves
    MPI_Send(values+10*i, 10, MPI_INTEGER, i, 0, MPI_COMM_WORLD);

Однако это настолько распространенная операция в распределенных вычислениях, что MPI дает ей собственную функцию, MPI_Scatter. Scatter делает именно то, что вам нужно: он берет один массив и делит его поровну между всеми вызывающими его процессами. Это вызов коллективного общения, который несколько тема для продвинутых, так что если вы только изучаете MPI (что, похоже, так и есть), не стесняйтесь пропускать ее, пока не освоитесь с MPI_Send и MPI_Recv.

person suszterpatt    schedule 05.03.2011