2012-02-14 6 views
2

私はMPIを使ってナップザック問題ソルバーを書いています。梱包の矯正最適値は、メッセージのタグとして送信されます。しかし、プログラムは "MPI_ERR_TAG:無効なタグ"で悩んでいました。いつでも実行できます。 MPIドキュメントをある程度読んだら、タグは負でなく、定数MPI_TAG_UBより小さくなければならないように見えました。 MPI_TAG_UBの検査では、ゼロに設定されているため、すべてのタグが無効になっていました。なぜこれができますか?私は何とかこの値を設定する必要がありますか?MPIタグが無効になっています

「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; 
} 

答えて

3

MPI_TAG_UB実際に定義された値そのものではなく、環境照会キー。それを確認するには、使用することができます:

MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &tag_ub, &flag); 

はさらに、少なくとも32767とも包括的であることが保証されます。

タグを実際のデータ値として使用することはお勧めしません。これは意図されたものではなく、この方法を悪用すると、実装が他の方法で行うことのできる最適化が必要になることがあります。 PACK/UNPACKまたは導出されたデータ型を使用して、パッキングと最適値を送信できます。

関連する問題