Я создаю новый производный тип данных для MPI для отправки данных из структуры Counter, и вы знали, что создание нового типа в MPI болезненно и сложно, потому что мне нужна помощь, если я на правильном пути и спасибо?
typedef struct Counter{
int range1,range2,range3,range4;
double preset1 ,preset2 ,preset3 ,preset4;
} countType;
MPI_Datatype createRecType()
{
// Set-up the arguments for the type constructor
MPI_Datatype new_type;
int count = 2;
int blocklens[] = { 4, 4 };
MPI_Aint indices[4];
indices[0] = 0;
MPI_Type_extent( MPI_DOUBLE, &indices[1] );
indices[1] *= 4; // There are 2 doubles
MPI_Datatype old_types[] = { MPI_INT ,MPI_DOUBLE};
// Call the data type constructor
MPI_Type_struct(count, blocklens, indices, old_types, &new_type);
MPI_Type_commit(&new_type);
return new_type;
}
Если я угадал, то посмотрим https://computing.llnl.gov/tutorials/mpi/#Derived_Data_Types и раздел «Примеры: тип производных данных». Он представляет, как описать «частицу», определяемую как:
typedef struct {
float x, y, z;
float velocity;
int n, type;
} Particle;
так что MPI может обрабатывать их массив. Весь соответствующий фрагмент кода:
/* Setup description of the 4 MPI_FLOAT fields x, y, z, velocity */
offsets[0] = 0;
oldtypes[0] = MPI_FLOAT;
blockcounts[0] = 4;
/* Setup description of the 2 MPI_INT fields n, type */
/* Need to first figure offset by getting size of MPI_FLOAT */
MPI_Type_extent(MPI_FLOAT, &extent);
offsets[1] = 4 * extent;
oldtypes[1] = MPI_INT;
blockcounts[1] = 2;
/* Now define structured type and commit it */
MPI_Type_struct(2, blockcounts, offsets, oldtypes, &particletype);
MPI_Type_commit(&particletype);
Ваш код, кажется, следует за всем этим. Если у вас нет опечаток, ваш код выглядит нормально. Но я не могу этого гарантировать, если не попробую скомпилировать и запустить его
Одно точно, ваш indices
слишком велик [2] будет достаточно. Но если оно будет больше, ничего плохого не будет. count
говорит 2, поэтому MPI не будет читать эти дополнительные элементы из этого массива.
Других решений пока нет …