У меня есть массив структуры C, которые я хотел бы, чтобы заполнить чтение файла (параллельно, используя set_view и так далее)Добавить отступы в структуру MPI
typedef struct
{
char type;
double value;
double velocity;
} Cell;
Моя проблема заключается в том, что какой-то файл (type1) будет иметь только type
и value
(в со скоростью случае должен быть оставлены на O, а в каком-то другом файле (type2) у меня есть как type
, value
и velocity
Таким образом, при чтении n
блоков в моем файле, я 'либо чтение nx 9 бит (case1), либо nx 17 бит ((case2) который я должен положить в буфер с хорошим выравниванием.
Я начал с mpi_cell_aligned
типа
MPI_Datatype mpi_cell_aligned;
int count[] = { 1, 1, 1 };
MPI_Aint displ[] = { offsetof(Cell, type), offsetof(Cell, value), offsetof(Cell, velocity) };
MPI_Datatype types[] = { MPI_CHAR, MPI_DOUBLE, MPI_DOUBLE };
switch(type)
{
case 1: MPI_Type_create_struct(2, count, displ, types, &mpi_cell_aligned); break;
case 2: MPI_Type_create_struct(3, count, displ, types, &mpi_cell_aligned); break;
}
MPI_Type_commit(&mpi_cell_aligned);
И с помощью MPI_Type_contiguous
я построил mpi_cell_packed
типа с 9/17 представляют непрерывные биты (Ui формат в двоичный файл).
Моя проблема заключается в том, чтобы писать в буфер, я пытаюсь создать векторный тип, содержащий несколько mpi_cell_aligned
. В случае 2 это легко, так как каждый тип находится рядом с другим, но в случае 1 мне приходится учитывать отступы между моими типами, которые соответствуют длине 1 двойной.
К сожалению, шаг, заданный MPI_Type_Vector
, должен измеряться в количестве структур, а не в байтах. Я тем временем не могу просто описать свой вектор, используя MPI_BYTE
, так как моя структура ячейки не заполнена (выравнивание между символом и первым двойным).
Как я могу создать соответствующий тип данных MPI, который будет правильно представлять массив Cell в случае 1?
Я использую SizeOf (мобильный) как степень, и я сделал эту работу. Спасибо – Amxx