Структуры MPI и C

Должен признаться, я был очень шокирован, чтобы узнать, сколько строк кода требуется для переноса одной C-структуры с MPI.

При каких обстоятельствах он будет работать, чтобы просто передать структуру с использованием предопределенного типа данных MPI_CHAR ? Рассмотрим следующий пример:

 struct particle { double x; double y; long i; }; struct particle p; MPI_Isend(&p, sizeof(particle), MPI_CHAR, tag, MPI_COMM_WORLD, &sendr); 

В моем случае все процессы работают по одной и той же архитектуре. Является ли заполнение единственным вопросом?

MPI_BYTE – это тип данных, который следует использовать при отправке нетипизированных данных, а не MPI_CHAR . Если две машины имеют одинаковую архитектуру, но используют различную кодировку символов, использование MPI_CHAR может испортить ваши данные. Отправка ваших данных как MPI_BYTE оставит двоичное представление таким, как оно есть, и не будет выполнять никакого преобразования представления.

Тем не менее, технически правильно отправить структуру таким образом, если (и только если) вы можете гарантировать, что представление данных будет одинаковым на концах отправки и получения. Тем не менее, это плохая практика программирования, поскольку она искажает цель вашего кода и вводит зависимость платформы.

Имейте в виду, что вам нужно только определить и зафиксировать тип данных один раз, в то время как вам, как правило, потребуется написать код для его отправки несколько раз. Уменьшение ясности всех ваших отправок, чтобы сохранить пару строк в одном определении, не является товаром.

Лично меня больше беспокоит понятность и ремонтопригодность, даже переносимость, чем заполнение. Если я отправляю структуру, мне нравится мой код, чтобы показать, что я отправляю структуру, а не последовательность байтов или символов. И я ожидаю, что мои коды будут работать на нескольких архитектурах, в нескольких поколениях языковых стандартов и компиляторов.

Я предполагаю, что все, что я говорю, это то, что, если стоит определить структуру (и вы, очевидно, это так), то стоит определить структуру. Сохранение нескольких строк (почти) шаблона не является большим аргументом против этого.