Я следовал коду Джонатана отсюда ( MPI_Bcast динамический 2d массив ), чтобы MPI_Bcast динамически размещенный 2d массив структур. Структура выглядит следующим образом:
typedef struct {
char num[MAX];
int neg;
} bignum;
Поскольку это не нативный тип данных, я использовал MPI_Type_create_struct для фиксации этого типа данных.
Я опускаю код здесь, потому что он работает на другом проекте, который я делал.
Метод, который я использовал для динамического создания («непрерывного?») Массива, вызывается:
bignum **matrix = creatematrix(DIMMAX,DIMMAX);
, который реализован как:
bignum ** creatematrix (int num_rows, int num_cols){
int i;
bignum *one_d = (bignum*)malloc (num_rows * num_cols * sizeof (bignum));
bignum **two_d = (bignum**)malloc (num_rows * sizeof (bignum *));
for (i = 0; i < num_rows; i++)
two_d[i] = &(one_d[i*num_cols]);//one_d + (i * num_cols);
return two_d;
}
Теперь я получу ввод и сохраню его внутри matrix и вызову MPI_Bcast как:
MPI_Bcast(&(matrix[0][0]), DIMMAX*DIMMAX, Bignum, 0, MPI_COMM_WORLD);
Кажется, что нет ошибки сегментации, но проблема в том, что транслируется только первая строка ( matrix [0] ). Все остальные ряды, кроме корня, имеют данные только для первой строки. Остальные ряды остаются нетронутыми.
Похоже, есть нечто большее, чем выделение непрерывного блока памяти. Я что-то пропустил, что сделало трансляцию неудачной?
EDIT:
Я наткнулся на странный обходной путь, используя вложенные структуры. Может кто-нибудь объяснить, почему этот метод работает, в то время как предыдущий не работает?
typedef struct {
char num[MAX];
int neg;
} bignum;
typedef struct {
bignum elements[DIMMAX];
} row;
int main(/*int argc,char *argv[]*/){
int dim, my_rank, comm_sz;
int i,j,k; //iterators
bignum global_sum = {{0},0};
row *matrix = (row*)malloc(sizeof(row)*DIMMAX);
row *tempmatrix = (row*)malloc(sizeof(row)*DIMMAX);
MPI_Init(NULL,NULL);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
//CREATE DERIVED DATATYPE Bignum
MPI_Datatype Bignum;
MPI_Datatype type[4] = {MPI_LB, MPI_CHAR, MPI_INT, MPI_UB};
int blocklen[4] = {1,MAX,1,1};
MPI_Aint disp[4];
//get offsets
MPI_Get_address(&global_sum, disp);
MPI_Get_address(&global_sum.num, disp+1);
MPI_Get_address(&global_sum.neg, disp+2);
//MPI_Get_address(&local_sum+1, disp+3);
int base;
base = disp[0];
for (i=0;i<3;i++){
disp[i] -= base;
}
disp[3] = disp[2]+4; //int
MPI_Type_create_struct(4,blocklen,disp,type,&Bignum);
MPI_Type_commit(&Bignum);
//CREATE DERIVED DATATYPE BignumRow
MPI_Datatype BignumRow;
MPI_Datatype type2[3] = {MPI_LB, Bignum, MPI_UB};
int blocklen2[3] = {1,DIMMAX,1};
MPI_Aint disp2[3] = {0,0,DIMMAX*(MAX+4)};
MPI_Type_create_struct(3,blocklen2,disp2,type2,&BignumRow);
MPI_Type_commit(&BignumRow);
MPI_Bcast(&dim, 1, MPI_INTEGER, 0, MPI_COMM_WORLD);
MPI_Bcast(matrix, dim, BignumRow, 0, MPI_COMM_WORLD);