Могу ли я объявить таблицу битов? - PullRequest
1 голос
/ 18 октября 2011

Я создаю приложение MPI. Чтобы уменьшить размер передаваемых сообщений, я имею в виду иметь таблицы «битов» для представления bool таблиц (поскольку значение bool может принимать только одно из двух значений: true или false ). Это важно в моем случае, так как коммуникация является основным узким местом производительности в моем приложении.

Можно ли создать такую ​​таблицу? Существует ли этот тип данных в MPI API?

Ответы [ 4 ]

4 голосов
/ 18 октября 2011

В C ++ std :: bitset или boost :: dynamic_bitset может быть полезно для управления количеством битов.Выберите позже, если размер набора не фиксирован.AFAIK MPI использует MPI_Send и MPI_Rec для межпроцессного взаимодействия.То, как вы сериализуете свои выходные данные и отправляете их через эти интерфейсы, является другим вопросом, так как Boost.Serialization не поддерживает ни один из этих двух типов.

1 голос
/ 18 октября 2011

Краткий ответ - нет, самый короткий тип данных MPI - MPI_BYTE, вы не можете создать тип, который будет немного. (У привязок Фортрана есть MPI_LOGICAL, который соответствует локальному логическому типу, но почти всегда соответствует целому или, может быть, байту, а не биту).

Теперь это не обязательно проблема; если бы у вас был битовый массив, вы могли бы просто округлить до следующего целого числа байтов, отправить его и просто проигнорировать последние несколько битов. (это в значительной степени то, что вы должны сделать при создании таблицы в любом случае). Но у меня есть несколько вопросов.

Насколько велики ваши сообщения? А что у тебя за сеть? Вы уверены ограничены ли пропускная способность, а не задержка?

Если ваши сообщения малы (скажем, под МБ), то, скорее всего, у вас преобладает задержка сообщений, а не пропускная способность, и уменьшение размера сообщений не поможет. (Вы можете оценить это, используя тесты pingpong - скажем, в тестах Intel MPI - чтобы увидеть, в каких размерах отключается ваша эффективная пропускная способность). Если вы находитесь в этом режиме, то это, скорее всего, ухудшит, а не улучшит, так как обмен данными не ускорится, но дополнительные затраты на индексацию в битовый массив, вероятно, замедлят ситуацию.

С другой стороны, если вы отправляете большие сообщения (например, размером в МБ) и / или у вас ограниченный объем памяти, это может быть хорошо.

1 голос
/ 18 октября 2011

Исходя из тега в исходном вопросе, я предполагаю, что вы используете смесь Fortran и C ++.Привязка MPI для Fortran имеет тип данных MPI_LOGICAL, который вы можете легко использовать в своих вызовах при передаче сообщений.Я не знаю такого типа для привязки MPI C.Как предполагает PlasmaHH, отправка целых чисел может работать в этом случае.

https://computing.llnl.gov/tutorials/mpi/#Derived_Data_Types

0 голосов
/ 21 октября 2011

Я бы перевел ваши биты в массив целых чисел.

Я отвечу по поводу языка FORTRAN. Вы можете использовать встроенные битовые операции для перемещения битов вперед и назад.

Также, чтобы уточнить, вы не должны использовать тип FORTRAN LOGICAL, так как это 4-байтовая переменная, как и обычные целые числа. Используйте эти функции:

BIT_SIZE(I)
IBCLR(I, POS) ! Set to 0 in variable I at position POS
IBSET(I, POS) ! Set to 1 in variable I at position POS
BTEST(I, POS) ! To test if bit at POS is 1

Тогда сделайте нормальный перевод любого типа, с которым вы имеете дело. Вы можете добавить теги в сообщение MPI, чтобы получатель знал, что это переменная, которая должна обрабатываться побитово. Это должно ограничить ваше общение, но также требует упаковки данных и распаковки. В любом случае вы также можете просто перенести все свои таблицы BOOL в эту схему.

Но следует заметить, что ваши BOOL-таблицы должны быть очень большими, чтобы увидеть какой-либо эффект, насколько велики мы говорим?

...