【问题标题】:Send array of mpz_t over mpi通过 mpi 发送 mpz_t 数组
【发布时间】:2014-04-17 20:45:26
【问题描述】:

我使用 libgmp (GMP) 处理非常长的整数,存储为 mpz_t: http://gmplib.org/manual/Integer-Internals.html#Integer-Internals

mpz_t 变量在动态分配和重新分配的空间中使用符号和大小表示整数。

所以我认为mpz_t 就像指针。

如何通过 MPI 发送带有数据的 mpz_t 变量数组?

【问题讨论】:

    标签: data-structures mpi gmp


    【解决方案1】:

    使用mpz_import() and mpz_export()mpz_t 和例如char 数组,然后您可以通过 MPI 发送/接收。注意正确设置与字节顺序等相关的参数。

    【讨论】:

    • 如何导出mpz_ts 的数组?
    • 我不知道是否有内置支持,所以你可能需要分配一个足够大的数组来容纳所有数字,然后反复调用mpz_export() 和逐渐填满阵列。如果有办法在 C 中创建内存流,您也可以使用 mpz_out_raw() and mpz_inp_raw()
    • 我刚刚发现我必须传递两个数组 - 第一个是 export 的输出,第二个是 export 返回的 counts 数组!
    • @osgx:我忘了考虑这个。另一种解决方案是将计数与导出数据交错:前四个字节包含一个代表第一个计数的int,然后跟随代表第一个数字的那么多字节,然后是代表第二个计数的另外四个字节,等等。
    【解决方案2】:

    代码如下:

    unsigned long *buf, *t; // pointers for ulong array for storing gmp data
    unsigned long count, countc; // sizes of data and element sizes array 
    unsigned long size = array_size; // size of array
    size_t *bc,*tc; // pointers for size_t array to store element sizes;
    
    buf=(unsigned long*)malloc(sizeof(unsigned long)*(size*limb_per_element));
    bc=(size_t*)malloc(sizeof(size_t)*(size));
    
    if(rank==SENDER_RANK) {
        t=buf;
        tc=bc;
        for(int i;i<size;i++) {
            mpz_export(t,tc,1,sizeof(unsigned long),0,0, ARRAY(i));
            t+=*tc;
        tc++;
        }
        count=t-buf;
        countc=tc-bc;
        MPI_Send(&count, 1, MPI_UNSIGNED_LONG, 0, 0, MPI_COMM_WORLD);
        MPI_Send(&countc, 1, MPI_UNSIGNED_LONG, 0, 0, MPI_COMM_WORLD);
        MPI_Send(bc, countc*(sizeof(size_t)), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
        MPI_Send(buf, count, MPI_UNSIGNED_LONG, 0, 0, MPI_COMM_WORLD);
    } else {
        status=MPI_Recv(&count, 1, MPI_UNSIGNED_LONG, SENDER_RANK, 0, MPI_COMM_WORLD, NULL); 
        status=MPI_Recv(&countc, 1, MPI_UNSIGNED_LONG, SENDER_RANK, 0, MPI_COMM_WORLD, NULL); 
        t=buf;
        tc=bc;
        status=MPI_Recv(bc, countc*(sizeof(size_t)), MPI_CHAR, SENDER_RANK, 0, MPI_COMM_WORLD, NULL); 
        status=MPI_Recv(buf, count, MPI_UNSIGNED_LONG, SENDER_RANK, 0, MPI_COMM_WORLD, NULL); 
        for(int i; i<size; i++) {
            mpz_import(ARRAY(i),*tc,1,sizeof(unsigned long),0,0, t);
            t+=*tc;
            tc++;
        }
    }
    free(buf);
    free(bc);
    

    【讨论】:

    • 据我了解,这不适用于负整数。 mpz_export 不导出整数的符号。
    猜你喜欢
    • 2016-05-07
    • 2011-08-19
    • 1970-01-01
    • 2014-08-01
    • 2012-03-19
    • 2012-11-26
    相关资源
    最近更新 更多