MPI C как получить доступ к структуре / переменным другого ранга - PullRequest
0 голосов
/ 07 февраля 2019

Итак, если у меня есть код C, работающий с MPI, и такая структура:

typedef struct Node{
    int succ;
    int pred;
    int has_token;
    char state;
}node;

может ли ранг получить доступ к другому узлу ранга?
Например, у меня есть:

//What i want:
if(rank==0){
    //so rank 0.state               lets say i want rank 2.state
    if(currentRankNode.state=='I' && someOtherRankNode.state=='S'){
        //do_smth
    }
}

И вопрос в том, чем заменить someOtherRankNode, чтобы получить, например, узел ранга 2, а затем состояние?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

С той небольшой информацией, которую вы здесь используете, я думаю, что вы спрашиваете, как посмотреть в память другого MPI-процесса (то есть посмотреть на текущее состояние процесса с помощью rank == 2).

По умолчанию области памяти процессов MPI полностью разделены операционной системой, даже если они работают на том же физическом компьютере.Вам придется синхронизировать знания о состоянии посредством отправки и получения сообщений.В более новых версиях MPI вы можете использовать такие функции, как MPI Windows: https://www.mpich.org/static/docs/v3.2/www3/MPI_Win_allocate_shared.html,, хотя это несколько сложнее.

0 голосов
/ 08 февраля 2019

Нет, по крайней мере, вам нужна одна подпрограмма связи, такая как MPI_Send, MPI_BCast, MPI_AllGather, чтобы отправить someOtherRankNode.state на rank == 0.Например:

#include <stdio.h>
#include <mpi.h>

int main(void)
{
    char rank_0_state;
    char rank_1_state;

    MPI_Init(NULL, NULL);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    if (world_size != 2)
        return 1;

    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    if (rank == 0)
        rank_0_state = 'I';

    if (rank == 1)
        rank_1_state = 'S';


    if (rank == 0) {
        MPI_Status status;
        MPI_Recv(&rank_1_state, 1, MPI_BYTE, 1, 0, MPI_COMM_WORLD, &status);
    }
    if (rank == 1)
        MPI_Send(&rank_1_state, 1, MPI_BYTE, 0, 0, MPI_COMM_WORLD);

    if (rank == 0) {
        if (rank_0_state == 'I' && rank_1_state == 'S') {
            printf("I am rank 0 receiving the right value from rank 1\n");
        }
    }

    MPI_Finalize();

    return 0;
}

Попробуйте использовать MPI_Type_struct для правильной отправки этой структуры между процессами.

0 голосов
/ 08 февраля 2019

Я нашел ответ в похожем вопросе, поэтому я опубликую его здесь для всех, у кого в будущем возникнет тот же вопрос.

В MPI каждый процесс (или ранг) имеет свою собственную память, и поэтомукогда он изменяет значения с помощью операций загрузки / сохранения, он не влияет на значение переменной другого процесса (или ранга).Единственный способ обновить удаленные значения - это отправить сообщения, что вы делаете с помощью вызова comm.bcast ().Это отправляет локальное значение msg из ранга 1 во все другие ранги.До этого момента для ранга 0 нет возможности узнать, что происходит на ранге 1.

...