代码之家  ›  专栏  ›  技术社区  ›  Dimitrios Desyllas

多重广播BIGNUM

  •  0
  • Dimitrios Desyllas  · 技术社区  · 7 年前

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

    我试图做的是通过MPI发送一个OpenSSL BIGNUM。但我的问题是,每个BIGNUM可能没有相同的大小。所以我想知道如何通知接收进程我的数据长度。

    到目前为止,我认为是广播的大小首先作为 MPI_INT MPI_BYTE 大堆但是,当我尝试接收大小和BigNum时,这些如何不会出问题呢?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Zulan    7 年前

    首先广播大小,然后广播数据是正确的做法。在这种情况下,订购不是问题。集体通信无法相互超越。即使是点对点消息也能保证消息 禁止超车 对于一对发送方和接收方。