2010-05-02 5 views
5

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

При каких обстоятельствах это будет работать, чтобы просто передать структуру, используя предопределенный тип данных 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); 

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

+1

Я хотел бы воспользоваться этой возможностью, чтобы сказать, что MPI не является строгим требованием, используйте буферы протокола Google. http://code.google.com/apis/protocolbuffers/ – Stephen

+0

вы не должны беспокоиться о дополнении, sizeof сообщает правильное значение, включая пробел – Anycorn

+1

да, но это может меняться в зависимости от архитектуры ... – hanno

ответ

8

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

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

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

+0

Спасибо. Еще один вопрос: есть ли преимущество в производительности от использования MPI_BYTE? Или, есть ли накладные расходы, когда я передаю структуру с собственным типом данных MPI? Я думаю о чем-то вроде MPI, копирующем данные в другой буфер в маленьких кусках и т. Д. – hanno

+0

Это, вероятно, зависит от реализации, и я бы предположил, что любое увеличение производительности, которое вы получили бы от выполнения проверки/преобразования представления, является массовым затмевается общей стоимостью передачи сообщения в первую очередь. Тем не менее, может быть интересным экспериментом сравнить время, затрачиваемое на отправку большой полезной нагрузки (тыс.) Структурированных типов, а не нетипизированных. – suszterpatt

3

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

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

+1

Я не понимаю аргумента об ремонтопригодности. В приведенном выше сегменте кода я могу изменить структуру без необходимости делать что-либо еще. Если я делаю это правильно, используя 'MPI_Type_create_struct', мне нужно изменить не менее 4 строк кода ... – hanno

+0

@hanno, см. Ответ @ suszterpatt для аргумента об ремонтопригодности, лучше объяснил, чем мне удалось. –