MPi множественное вещание BIGNUM - PullRequest
0 голосов
/ 26 января 2019

У меня есть следующий фрагмент кода:

int MPIbcastBigNum(BIGNUM *num, int rank, char* purpoce){
    int size = BN_num_bytes(num);
    unsigned char *message = OPENSSL_malloc(size);

    if(!BN_bn2bin(num, message)) {
     fprintf(stderr, "RANK %d: Fail to allocate an array for key bytes \"%s\" \n", rank, purpoce);
     fflush(stderr);
     OPENSSL_free(message);
     return -1;    
    }

    //Do the actual Broadcast && Debug
    printf("RANK %d: Broaccasting bignum for purpoce \"%s\" \n", rank, purpoce);
    fflush(stdout);
    int value = MPI_Bcast(message, size, MPI_BYTE, rank, MPI_COMM_WORLD);
    switch(value) {
        case MPI_ERR_COMM:
         fprintf(stderr, "RANK %d: COMMUNICATIPN ERROR on BIGNUM sending for purpoce \"%s\" \n", rank, purpoce);
         fflush(stderr);
         OPENSSL_free(message);
         return -1;

        case MPI_ERR_COUNT:
         fprintf(stderr, "RANK %d: Invalid Size Count on BIGNUM sending for purpoce \"%s\" \n", rank, purpoce);
         fflush(stderr);
         OPENSSL_free(message);
         return -1;

        case MPI_ERR_TYPE:
         fprintf(stderr, "RANK %d: Invalid Data Type on BIGNUM sending for purpoce \"%s\" \n", rank, purpoce);
         fflush(stderr);
         OPENSSL_free(message);
         return -1;

        case MPI_ERR_BUFFER:
         fprintf(stderr, "RANK %d: Invalid Buffer on BIGNUM sending for purpoce \"%s\" \n", rank, purpoce);
         fflush(stderr);
         OPENSSL_free(message);
         return -1;

        default:
          printf("RANK %d: ALL OK on BIGNUM sending on purpoce \"%s\" \n", rank, purpoce);
          fflush(stdout);
    }

    //Cleanups
    OPENSSL_free(message);
    return 0;
}

Я пытаюсь отправить OpenSSL BIGNUM через MPI.Но моя проблема в том, что каждый BIGNUM может иметь разный размер.Поэтому я хотел знать, чтобы уведомить принимающие процессы о длине моих данных.

До сих пор я думал, что сначала нужно передать размер как MPI_INT, а затем передать фактические данные как n-размерный MPI_BYTEмассив.Но как они не выйдут из строя, когда я попытаюсь получить и размер, и BigNum?

1 Ответ

0 голосов
/ 26 января 2019

Передача сначала размера, а затем данных - правильная вещь. Заказ не проблема в этом случае. Коллективные коммуникации не могут обогнать друг друга. Даже точечные сообщения гарантируют, что сообщения не обгоняют для пары отправителей и получателей.

...