Теги MPI отключены - PullRequest
       1

Теги MPI отключены

2 голосов
/ 14 февраля 2012

Я пишу решение проблем с рюкзаком, используя MPI.Точное оптимальное значение для упаковки отправляется в виде тега в сообщении.Тем не менее, программа сломалась с «MPI_ERR_TAG: недопустимый тег».всякий раз, когда выполняется.После некоторого чтения документации MPI показалось, что теги должны быть неотрицательными и меньше константы MPI_TAG_UB.При проверке MPI_TAG_UB я обнаружил, что он был установлен на ноль, что делает все теги недействительными.Почему это может быть?Нужно ли мне как-то самостоятельно устанавливать это значение?

В приложении приведен небольшой фрагмент кода, который печатает «MPI_TAG_UB = 0» и прерывает работу в моей системе.

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

struct P {
    char choices[64];
    int next_choice;
};

typedef struct P Packing;

int main(int argc,char** argv) {
    int rank;
    MPI_Datatype PACKING_TYPE;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);

    /*Defines a new MPI datatype tag for Packings.*/
    int field_count = 2;
    int field_lengths[2] = {64,1};
    MPI_Aint field_offsets[2];
    field_offsets[0] = 0;
    field_offsets[1] = 64;
    MPI_Datatype field_types[2] = {MPI_CHAR,MPI_INT};
    MPI_Type_struct(field_count,field_lengths,
        field_offsets,field_types,&PACKING_TYPE);
    MPI_Type_commit(&PACKING_TYPE);

    int tag = 1;
    if (rank == 0) {
        Packing pack;
        printf("MPI_TAG_UB = %d\n",MPI_TAG_UB);
        if(MPI_TAG_UB == 0) {
            fprintf(stderr,"Tags disabled!\n");
            abort();
        }
        MPI_Send(&pack,1,PACKING_TYPE,1,tag,MPI_COMM_WORLD);
        puts("Process 0 sent message.");
    }

    if (rank == 1) {
        Packing pack;
        MPI_Status status;
        MPI_Recv(&pack,1,PACKING_TYPE,MPI_ANY_SOURCE,
                MPI_ANY_TAG,MPI_COMM_WORLD,&status);
        puts("Process 1 recieved message.");
    }

    MPI_Type_free(&PACKING_TYPE);
    MPI_Finalize();
    return 0;
}

1 Ответ

4 голосов
/ 15 февраля 2012

MPI_TAG_UB - это не собственно определенное значение, а ключ запроса среды .К сожалению, вам нужно еще одно косвенное обращение.Чтобы проверить это, вы можете использовать:

MPI_Aint* tag_ub_ptr;
MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &tag_ub_ptr, &flag);
printf("TAG_UB is %d\n", *tag_ub_ptr);

Кроме того, оно гарантированно должно быть не менее 32767 и включительно.

Я бы не рекомендовал использовать тег в качестве фактического значения данных.Это не то, для чего он предназначен, и злоупотребление этим способом может стоить вам некоторых оптимизаций, которые иначе могла бы сделать реализация.Вы можете использовать PACK / UNPACK или производные типы данных для отправки упаковки и получения оптимального значения.

...