Yeremya doğru - MPI_Type_create_struct buraya gitmenin yoludur.
MPI'nin bir dil kütüphanesi değil, dilin içine yerleştirildiğini hatırlamak önemlidir; Dolayısıyla, bir yapının kendi kendini serileştirmek için neye benzediğini "göremez". Bu yüzden karmaşık veri türleri göndermek için, düzenini açıkça tanımlamanız gerekir. Serileştirme için yerel desteğe sahip bir dilde, bir dizi MPI sarıcısı, bundan faydalanarak faydalanabilir; Örneğin, mpi4py, karmaşık veri türlerini şeffaf bir şekilde göndermek için python'un pickle kullanımını kullanır; ama C’de kollarınızı yukarı kaldırmanız ve kendiniz yapmalısınız. senin yapısı için
, bu şuna benzer: Jonathan Dursi cevabı doğru olmasına rağmen
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <stddef.h>
typedef struct car_s {
int shifts;
int topSpeed;
} car;
int main(int argc, char **argv) {
const int tag = 13;
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (size < 2) {
fprintf(stderr,"Requires at least two processes.\n");
exit(-1);
}
/* create a type for struct car */
const int nitems=2;
int blocklengths[2] = {1,1};
MPI_Datatype types[2] = {MPI_INT, MPI_INT};
MPI_Datatype mpi_car_type;
MPI_Aint offsets[2];
offsets[0] = offsetof(car, shifts);
offsets[1] = offsetof(car, topSpeed);
MPI_Type_create_struct(nitems, blocklengths, offsets, types, &mpi_car_type);
MPI_Type_commit(&mpi_car_type);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
car send;
send.shifts = 4;
send.topSpeed = 100;
const int dest = 1;
MPI_Send(&send, 1, mpi_car_type, dest, tag, MPI_COMM_WORLD);
printf("Rank %d: sent structure car\n", rank);
}
if (rank == 1) {
MPI_Status status;
const int src=0;
car recv;
MPI_Recv(&recv, 1, mpi_car_type, src, tag, MPI_COMM_WORLD, &status);
printf("Rank %d: Received: shifts = %d topSpeed = %d\n", rank,
recv.shifts, recv.topSpeed);
}
MPI_Type_free(&mpi_car_type);
MPI_Finalize();
return 0;
}
Çok kapsamlı ve hızlı yanıtınız için teşekkür ederiz. Gerçekten onu takdir ederim. Beni tamamen örttün. (Ancak derhal'u en iyi nedene dahil etmeyi unuttuğunuzu düşünüyorum, aksi takdirde derleyici hata verir ..) –
kstratis
Haklısınız - offsetof() için gereklidir. Kodu uygun şekilde güncelledim. –