我使用 libgmp (GMP) 处理非常长的整数,存储为mpz_t
:http ://gmplib.org/manual/Integer-Internals.html#Integer-Internals
mpz_t
变量在动态分配和重新分配的空间中使用符号和大小表示整数。
所以我认为mpz_t
就像指针。
如何mpz_t
通过 MPI 发送包含数据的变量数组?
我使用 libgmp (GMP) 处理非常长的整数,存储为mpz_t
:http ://gmplib.org/manual/Integer-Internals.html#Integer-Internals
mpz_t
变量在动态分配和重新分配的空间中使用符号和大小表示整数。
所以我认为mpz_t
就像指针。
如何mpz_t
通过 MPI 发送包含数据的变量数组?
使用mpz_import()
andmpz_export()
在和之间进行转换mpz_t
,例如char
数组,然后您可以通过 MPI 发送/接收。请注意正确获取与字节顺序等相关的参数。
这是代码:
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);