একটি এমপিআই টাইপম্যাপ প্রদর্শন করুন


101

type mapMPI গুরুত্বপূর্ণ কিন্তু বিভ্রান্তি ধারণা। আমি আমার জন্য একটি টাইপ মানচিত্র প্রদর্শন বা মুদ্রণ করতে চাই একটি রুটিন

উদাহরণস্বরূপ (এমপিআই -3 স্ট্যান্ডার্ড থেকে নেওয়া),

 MPI_TYPE_CREATE_RESIZED(MPI_INT, -3, 9, type1) 

টাইপম্যাপে ফলাফল

{(lb_marker, -3), (int, 0), (ub_marker, 6)}.

এই ধরণের আবার ব্যবহার করুন:

MPI_TYPE_CONTIGUOUS(2, type1, type2) 

এবং টাইপম্যাপটি হল

{(lb_marker, -3), (int, 0), (int,9), (ub_marker, 15)}

আমি টাইপম্যাপটি স্বয়ংক্রিয়ভাবে প্রদর্শনের জন্য একটি উপায় চাই।

অবশ্যই এক ব্যবহার করতে পারে MPI_Type_get_contentsএবং MPI_Type_get_envelopeএবং যাও recursively আঘাত ধরনের বিল্ট ইন পর্যন্ত নামা। এটি বরং একটি বিশাল ব্যথা এবং আমি ভাবতাম আমার জন্য এটি করার জন্য কোনও সরঞ্জামের 20 বছর উপস্থিত থাকবে।

কিছু সরঞ্জাম যা প্রতিশ্রুতিশীল তবে বেশ কার্যকর নয়:

  • আমি ২০০১ সাল থেকে এখানে এমপিআইম্যাপটি পেয়েছি । প্রথমত, এটি আধুনিক Tcl / TK এর জন্য আপডেট করা দরকার, কিছু মেমরির ত্রুটিগুলি সমাধান করার জন্য প্যাচ করা হয়েছে এবং এটি করার পরে; আপনি একটি প্রতিক্রিয়াহীন GUI পান। পরিবর্তে, আমি একটি লাইব্রেরি / রুটিন খুঁজছি যা আমি রান সময়ে কল করতে পারি।

  • MPIDU_Datatype_deubgএকটি MPICH নির্দিষ্ট অভ্যন্তরীণ টাইপ-ডাম্পিং রুটিন। এটি প্রকারের মানচিত্রটি প্রদর্শন করে না (এটি ডেটালুপ উপস্থাপনা প্রদর্শন করে, আবার বন্ধ করে)

  • এক্সপিএমআই নামে একটি ডিবাগার ছিল যা তার বৈশিষ্ট্যগুলির মধ্যে এমপিআই টাইপ ম্যাপ প্রদর্শন করার ক্ষমতা তালিকাভুক্ত করে। এই ডিবাগারটি LAM-MPI নির্দিষ্ট বলে মনে হয় এবং get_contents / get_envelope ব্যবহার করে না।


1
আমি কি আপনাকে সঠিকভাবে পেয়েছি: স্থানীয়ভাবে সংজ্ঞায়িত হয়ে MPI_Datatypeআপনি এমন একটি ফাংশন সন্ধান করেন যা ফর্মের একটি স্ট্রিং ফেরত দেয় যা {(type, displacement), (type, displacement), ..}ডাটাটাইপের কাঠামোর বর্ণনা দেয়?
ফিলিপ

আপনি এটা পেয়েছেন. প্রশ্নটি আরও পরিষ্কার হওয়ার জন্য আপডেট করব।
রব ল্যাথাম

1
এটি দেখুন: [লিঙ্ক] [1] আমরা আপনাকে এখনও একটি সমাধান খুঁজে পেতে সক্ষম করেছি বা কিছু প্রসঙ্গে আপনি স্নিপেট কোড উদাহরণ পোস্ট করতে পারেন? [১]: এমপিআই- ফার্মাম.আর
এমপিআই

যদি আপনি / উত্তর পেয়ে থাকেন তবে আমি এটির প্রশংসা করব যদি আপনি উত্তর হিসাবে নিজের গবেষণা ফলাফল পোস্ট করেন।
লিরান ফানারো

দু'বছর পরে এবং কোনও পূর্ব-বিদ্যমান সমাধান নেই। এটি কুলুঙ্গি যথেষ্ট যে আমি অনুমান করি যে আমাকে এটি নিজে লিখতে হবে এবং সেইভাবে প্রশ্নের উত্তর দিতে হবে।
রব লাথাম

উত্তর:


2

যেমন রব ল্যাথাম বলেছিলেন, ভাল প্রাক-বিদ্যমান সমাধান নেই। টিম দ্বারা প্রদত্ত লিঙ্কগুলির সাহায্যে আমি গিথুব এ উপলব্ধ এই ফাংশনটি তৈরি করেছি । আমি আপনার উদাহরণটি নিয়মিত + পুনরায় আকারের পরীক্ষার জন্য নিয়েছি ( এখানে ) এবং আউটপুট

contiguous + resize
"(LB, -3), (MPI_INT, 0), (MPI_INT, 9), (UB, 15)"

এই ফাংশনটির সাথে আপনার কেবল প্রয়োজন printMapDatatype(mydatatype)। আমি আশা করি এটিই আপনি অনুসন্ধান করেছিলেন।

এখানে কেবল ফাংশনটি রয়েছে:

MPI_Aint printdatatype( MPI_Datatype datatype, MPI_Aint prevExtentTot ) { 
    int *array_of_ints; 
    MPI_Aint *array_of_adds; 
    MPI_Datatype *array_of_dtypes; 
    int num_ints, num_adds, num_dtypes, combiner; 
    int i, j; 


    MPI_Type_get_envelope( datatype, &num_ints, &num_adds, &num_dtypes, &combiner ); 

    array_of_ints = (int *) malloc( num_ints * sizeof(int) ); 
    array_of_adds = (MPI_Aint *) malloc( num_adds * sizeof(MPI_Aint) ); 
    array_of_dtypes = (MPI_Datatype *) malloc( num_dtypes * sizeof(MPI_Datatype) );

    MPI_Aint extent, subExtent;
    MPI_Type_extent(datatype, &extent);

    switch (combiner) { 
    case MPI_COMBINER_NAMED: 
        // To print the specific type, we can match against the predefined forms.

        if (datatype == MPI_BYTE)                   printf( "(MPI_BYTE, %ld)", prevExtentTot);
        else if (datatype == MPI_LB)                printf( "(MPI_LB, %ld)", prevExtentTot);
        else if (datatype == MPI_PACKED)            printf( "(MPI_PACKED, %ld)", prevExtentTot);
        else if (datatype == MPI_UB)                printf( "(MPI_UB, %ld)", prevExtentTot);
        else if (datatype == MPI_CHAR)              printf( "(MPI_CHAR, %ld)", prevExtentTot);
        else if (datatype == MPI_DOUBLE)            printf( "(MPI_DOUBLE, %ld)", prevExtentTot);
        else if (datatype == MPI_FLOAT)             printf( "(MPI_FLOAT, %ld)", prevExtentTot);
        else if (datatype == MPI_INT)               printf( "(MPI_INT, %ld)", prevExtentTot );
        else if (datatype == MPI_LONG)              printf( "(MPI_LONG, %ld)", prevExtentTot);
        else if (datatype == MPI_LONG_DOUBLE)       printf( "(MPI_LONG_DOUBLE, %ld)", prevExtentTot);
        else if (datatype == MPI_LONG_LONG)         printf( "(MPI_LONG_LONG, %ld)", prevExtentTot);
        else if (datatype == MPI_LONG_LONG_INT)     printf( "(MPI_LONG_LONG_INT, %ld)", prevExtentTot);
        else if (datatype == MPI_SHORT)             printf( "(MPI_SHORT, %ld)", prevExtentTot);
        else if (datatype == MPI_SIGNED_CHAR)       printf( "(MPI_SIGNED_CHAR, %ld)", prevExtentTot);
        else if (datatype == MPI_UNSIGNED)          printf( "(MPI_UNSIGNED, %ld)", prevExtentTot);
        else if (datatype == MPI_UNSIGNED_CHAR)     printf( "(MPI_UNSIGNED_CHAR, %ld)", prevExtentTot);
        else if (datatype == MPI_UNSIGNED_LONG)     printf( "(MPI_UNSIGNED_LONG, %ld)", prevExtentTot);
        else if (datatype == MPI_UNSIGNED_LONG_LONG)printf( "(MPI_UNSIGNED_LONG_LONG, %ld)", prevExtentTot);
        else if (datatype == MPI_UNSIGNED_SHORT)    printf( "(MPI_UNSIGNED_SHORT, %ld)", prevExtentTot);
        else if (datatype == MPI_WCHAR)             printf( "(MPI_WCHAR, %ld)", prevExtentTot);

        free( array_of_ints ); 
        free( array_of_adds ); 
        free( array_of_dtypes );

        return prevExtentTot;
        break;
    case MPI_COMBINER_DUP:
        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes ); 

        printdatatype( array_of_dtypes[0], prevExtentTot);

        printf(", \n");

        break;
    case MPI_COMBINER_CONTIGUOUS:
        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes ); 

        MPI_Type_extent(array_of_dtypes[0], &subExtent); // no need to do in loop because same type

        for (i=0; i < array_of_ints[0]; i++) { 
            prevExtentTot = printdatatype( array_of_dtypes[0], prevExtentTot);
            prevExtentTot += subExtent;
            printf(", ");
        }

        break;
    case MPI_COMBINER_VECTOR:
        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes ); 

        MPI_Type_extent(array_of_dtypes[0], &subExtent); // no need to do in loop because same type

        printf("[");
        for (i = 0; i < array_of_ints[0]; i++) { //count
            printf( "BL : %d - ", array_of_ints[1]);
            for (j = 0; j < array_of_ints[2]; j++) { // stride
                if (j < array_of_ints[1]) { // if in blocklength
                    prevExtentTot = printdatatype( array_of_dtypes[0], prevExtentTot);
                    printf(", ");
                }
                prevExtentTot += subExtent;

            }
        }
        printf("], ");

        break;
    case MPI_COMBINER_HVECTOR:
    case MPI_COMBINER_HVECTOR_INTEGER:{
        MPI_Aint backupPrevExtent = prevExtentTot;

        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes ); 

        MPI_Type_extent(array_of_dtypes[0], &subExtent); // no need to do in loop because same type

        printf("[");
        for (i = 0; i < array_of_ints[0]; i++) { //count
            printf( "BL : %d - ", array_of_ints[1]);
            for (j = 0; j < array_of_ints[1]; j++) { // blocklength
                prevExtentTot = printdatatype( array_of_dtypes[0], prevExtentTot);
                printf(", ");
                prevExtentTot += subExtent;
            }
            prevExtentTot = backupPrevExtent + array_of_adds[0]; // + stride un byte
        }
        printf("], ");

        break;
    }
    case MPI_COMBINER_INDEXED:{
        MPI_Aint tmpPrevExtent;
        int count, blocklength;
        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes ); 

        MPI_Type_extent(array_of_dtypes[0], &subExtent); // no need to do in loop because same type

        printf("<");
        count = array_of_ints[0];
        for (i = 0; i < count; i++) { // count
            blocklength = array_of_ints[i + 1]; // array of blocklength
            tmpPrevExtent = prevExtentTot;
            tmpPrevExtent += array_of_ints[count + 1 + i] * subExtent; // + displacement * size of block
            printf( "BL : %d - ", blocklength);
            for (j = 0; j < blocklength; j++) { // blocklength
                tmpPrevExtent = printdatatype( array_of_dtypes[0], tmpPrevExtent);
                printf(", ");
                tmpPrevExtent += subExtent;
            }
        }
        printf(">, ");

        prevExtentTot = tmpPrevExtent;

        break;
    }
    case MPI_COMBINER_HINDEXED:
    case MPI_COMBINER_HINDEXED_INTEGER:{
        MPI_Aint tmpPrevExtent;
        int count, blocklength;
        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes ); 

        MPI_Type_extent(array_of_dtypes[0], &subExtent); // no need to do in loop because same type

        printf("<");
        count = array_of_ints[0];
        for (i = 0; i < count; i++) { // count
            blocklength = array_of_ints[i + 1]; // array of blocklength
            tmpPrevExtent = prevExtentTot;
            tmpPrevExtent += array_of_adds[i]; // + displacement in byte
            printf( "BL : %d - ", blocklength);
            for (j = 0; j < blocklength; j++) {
                tmpPrevExtent = printdatatype( array_of_dtypes[0], tmpPrevExtent);
                printf(", ");
                tmpPrevExtent += subExtent;
            }
        }
        printf(">, ");

        prevExtentTot = tmpPrevExtent;

        break;
    }
    case MPI_COMBINER_INDEXED_BLOCK:{
        MPI_Aint tmpPrevExtent;
        int count;
        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes ); 

        MPI_Type_extent(array_of_dtypes[0], &subExtent); // no need to do in loop because same type

        printf("<");
        count = array_of_ints[0];
        for (i = 0; i < count; i++) { // count
            tmpPrevExtent = prevExtentTot;
            tmpPrevExtent += array_of_ints[i + 2] * subExtent; // + displacement * size of block
            printf( "BL : %d - ", array_of_ints[i + 1]);
            for (j = 0; j < array_of_ints[1]; j++) { // blocklength
                tmpPrevExtent = printdatatype( array_of_dtypes[0], tmpPrevExtent);
                printf(", ");
                tmpPrevExtent += subExtent;
            }
        }
        printf(">, ");

        prevExtentTot = tmpPrevExtent;

        break;
    }
    case MPI_COMBINER_STRUCT: 
    case MPI_COMBINER_STRUCT_INTEGER:{
        MPI_Aint tmpPrevExtent;
        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes ); 

        printf( "{"); 
        for (i = 0; i < array_of_ints[0]; i++) { // count
            tmpPrevExtent = prevExtentTot + array_of_adds[i]; // origin + displacement
            printf( "BL : %d - ", array_of_ints[i + 1]);
            tmpPrevExtent = printdatatype( array_of_dtypes[i], tmpPrevExtent);
            tmpPrevExtent += subExtent;
            printf(", ");
        }
        printf("}, ");

        prevExtentTot = tmpPrevExtent;

        break;
    }
    case MPI_COMBINER_SUBARRAY:
        // I don't know what is interresting to display here...
        printf("... subarray not handled ...");
        break;
    case MPI_COMBINER_DARRAY:
        // Same
        printf("... darray not handled ...");
        break;
    case MPI_COMBINER_RESIZED:
        MPI_Type_get_contents( datatype, num_ints, num_adds, num_dtypes, array_of_ints, array_of_adds, array_of_dtypes );

        prevExtentTot = printdatatype( array_of_dtypes[0], prevExtentTot);

        printf(", \n");

        break;
    default: 
        printf( "Unrecognized combiner type\n" ); 
    } 

    free( array_of_ints ); 
    free( array_of_adds ); 
    free( array_of_dtypes );

    return prevExtentTot;
}

void printMapDatatype(MPI_Datatype datatype) {
    MPI_Aint lb, ub;
    MPI_Type_lb(datatype, &lb);
    MPI_Type_ub(datatype, &ub);

    printf("\"(LB, %ld), ", lb);
    printdatatype(datatype, 0);
    printf("(UB, %ld)\"\n", ub);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.