libgmp (GMP) を使用して、次のように保存された非常に長い整数を操作しmpz_t
ます。
mpz_t
変数は、動的に割り当ておよび再割り当てされた空間で、符号と大きさを使用して整数を表します。
だから私mpz_t
はポインターのようなものだと思います。
mpz_t
MPI 経由でデータを含む変数の配列を送信するにはどうすればよいですか?
libgmp (GMP) を使用して、次のように保存された非常に長い整数を操作しmpz_t
ます。
mpz_t
変数は、動的に割り当ておよび再割り当てされた空間で、符号と大きさを使用して整数を表します。
だから私mpz_t
はポインターのようなものだと思います。
mpz_t
MPI 経由でデータを含む変数の配列を送信するにはどうすればよいですか?
と を使用mpz_import()
しmpz_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);