Я пишу решение проблем с рюкзаком, используя 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;
}