Переносимость типов данных openMPI

FAQ #20 говорит:

Начиная с версии 1.1, Open MPI требует, чтобы размер типов данных C, C++ и Fortran был одинаковым на всех платформах в рамках одного параллельного приложения, за исключением типов, представленных MPI_BOOL и MPI_LOGICAL — различия в размерах этих типов между процессами. правильно обрабатываются. Различия между порядком байтов между процессами в одном задании MPI корректно и автоматически обрабатываются.

До версии 1.1 Open MPI не включал никакой поддержки размера данных или разнородности байтов.

Означает ли это, что MPI_UNSIGNED_LONG должен быть либо 32-битным на всех хостах, либо 64-битным на всех хостах? Мой кластер состоит из 32-битных и 64-битных серверов Linux. Как лучше всего обеспечить, чтобы long и unsigned long имели одинаковый размер на всех хостах? Может быть, мне следует использовать только int и только «long long»? Это 32 и 64 бита соответственно на всех хостах. Можно ли иметь непостоянный размер данных, пока он не используется?

Спасибо.


person pic11    schedule 23.08.2011    source источник


Ответы (2)


Следует отметить, что MPI 1.1 немного устарел. Если вам нужно использовать MPI 1.1, то я не уверен, но если вы можете использовать MPI 2, посмотрите раздел 3.3 Стандарт MPI 2.2. Насколько я понимаю, не требуется, чтобы, например, MPI_UNSIGNED_LONG был одинакового размера (одинаковое количество байтов) на всех хостах. Для операций отправки/получения типы данных MPI не определены как определенные по размеру; они определены как соответствующие определенному типу данных в C или Fortran. Так, например, MPI_UNSIGNED_LONG соответствует unsigned long int в C (таблица 3.2). Поскольку C не гарантирует какого-либо определенного размера (только то, что в C99 он составляет не менее 32 бит) для unsigned long int, то же самое делает и MPI.

В подтверждение этого у нас есть прямая цитата со страницы 38 стандарта:

[...] Если отправитель и получатель выполняются в разных средах, то десять реальных значений, извлеченных из буфера отправки, будут преобразованы в представление для вещественных чисел на сайте получателя, прежде чем они будут сохранены в приемном буфере. Хотя количество реальных элементов, извлеченных из буфера отправки, равно количеству реальных элементов, хранящихся в буфере приема, количество сохраненных байтов не обязательно равно количеству загруженных байтов. Например, отправитель может использовать четырехбайтное представление, а получатель — восьмибайтное представление для действительных чисел.

Размеры, определенные в таблице 13.2 на стр. 433, действительны только для представлений данных «external32» (для совместимости файлов) и, насколько я могу судить, недействительны в других местах.

person Quantumboredom    schedule 23.08.2011
comment
Официальный FAQ говорит Начиная с версии 1.1, так что вы должны применить и к версии 1.1. Обратите внимание, что в часто задаваемых вопросах также говорится: До версии 1.1 Open MPI не включал никакой поддержки размера данных или разнородности байтов. Я думаю, это означает, что размер данных тоже может быть разнородным. Я приведу небольшой пример, чтобы подтвердить это, но на 99% уверен, что это правда, и поэтому отмечу ваш ответ как принятый. - person pic11; 24.08.2011

Типы данных OpenMPI должны быть одинаковыми независимо от архитектуры. Например, MPI_UNSIGNED_LONG определяется как 32-битный, а MPI_UNSIGNED_LONG_LONG — как 64-битный (см., например, здесь: http://www.mpi-forum.org/docs/mpi-2.2/mpi22-report.pdf, стр. 433. MPI_UNSIGNED_LONG определяется как 4 байта).

Спецификация MPI дополнительно содержит MPI_INT64_T и друзей, так что никаких предположений не требуется.

person Anteru    schedule 23.08.2011
comment
Означает ли это, что инструкция по форсированию неверна? boost.org/doc/libs/1_47_0/doc/ html/mpi/tutorial.html singed long int на моей платформе составляет 8 байт (GCC на 64-разрядной версии Linux), но MPI_LONG следует использовать с 32-битными целыми числами со знаком. - person pic11; 24.08.2011
comment
Никогда не использовал Boost.MPI, только базовый MPI. Я предполагаю (ЗДЕСЬ УГАДАЮ!), что если вы передаете длинное (64-битное) значение, и оно передается как MPI_LONG, гарантированно будет передано только 32-битное значение. Это определенно имело бы какой-то смысл и объяснило бы материал со страницы 38, цитируемый Quantumboredom. Должно быть достаточно легко попробовать ;) - person Anteru; 24.08.2011
comment
Извините, я думаю, вы ошиблись. Типы данных MPI зависят от платформы, чтобы отражать типы данных C, но MPI выполняет преобразование представления автоматически. В любом случае, я ценю ваш вклад. - person pic11; 24.08.2011
comment
Да, но это в значительной степени означает, что если вы введете 64-битную длину на x64, вы получите 32-битную длину на машине x86, поэтому вам определенно следует использовать только размерные типы. - person Anteru; 24.08.2011
comment
Размерные типы хороши, но вы не видите их в mpi-2. Похоже, это новая функция в mpi-2.2. - person pic11; 24.08.2011