2015-10-13 2 views
2

У меня есть массив структуры 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?

ответ

3

Вы должны изменить масштаб для типа МПИ в случае 1.

Степень такого типа является размер, используемый, чтобы знать, где найти следующий элемент отправки/ПРИЕМ/записи/чтения операции.

Основная функция MPI_Type_create_resized. В вашем случае степень типа МПИ в случае 1, должны быть такими же, как степень типа МПИ в случае 2.

Так что вы должны сделать что-то вроде этого:

/* Temporary type */ 
MPI_Type_create_struct(2, count, displ, types, &mpi_cell_aligned_temp); 
/* Compute new extent */ 
MPI_Type_size(mpi_cell_aligned_temp,&size_double); 
extent = offsetof(Cell, velocity)+size_double; 
/* Create new type with new extent */ 
MPI_Type_create_resized(mpi_cell_aligned_temp,0, extent,&mpi_cell_aligned_temp); 
+0

Я использую SizeOf (мобильный) как степень, и я сделал эту работу. Спасибо – Amxx