2013-09-27 4 views
4

Основные типы данных MPI соответствуют типам данных основного языка, за исключением MPI_BYTE и MPI_PACKED. Мой вопрос заключается в том, что полезно использовать эти базовые типы данных MPI? Или, что то же самое, почему плохо использовать типы данных языка хоста?Какая польза от MPI Datatype?

Я прочитал учебник Уильяма Gropp и т.д. В слайде 31 «Почему Datatypes», он говорит:

  • Поскольку все данные помечены типом, реализация MPI может поддерживать связь между процессами на машинах с очень различные представления памяти и длины элементарных типов данных (гетерогенная связь).
  • Указание приложений, ориентированных на расположение данных в памяти
    • уменьшает память-память копий в реализации
    • позволяет использовать специальное оборудование (разброс/собирать) при наличии

Я не понимаю объяснения. Во-первых, если элементарные типы данных различны, я не понимаю, почему использование типов данных MPI может решить эту проблему, поскольку базовые типы данных MPI соответствуют базовому типу языка хоста (элементарные типы данных). Во-вторых, почему это ориентированное на приложения расположение данных в памяти имеет два преимущества?

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

ответ

2

Короткий ответ заключается в том, что эта система добавляет уровень сильного ввода в MPI.

Долгий ответ заключается в том, что целью типов данных MPI является указание функциям MPI, с которыми они работают. Так, например, если вы отправляете int из машины little-endian в big-endian, тогда MPI может выполнить преобразование порядка байтов для вас. Еще одно общее преимущество заключается в том, что MPI знает, насколько велика MPI_DOUBLE, поэтому вам не нужно иметь множество операторов sizeof.

Обратите внимание, что типы данных MPI являются тегами, а не фактическими типами данных. Другими словами, вы используете

double d; 

НЕ

MPI_DOUBLE d; 
+0

У меня нет идеи последнего примера. Предположим, что 'd' является переменной, которая будет отправлена ​​из одного процесса в другой. Когда мы определяем 'd', мы обязательно используем' MPI_DOUBLE d', а не 'double d', правильно? – user2196452

+0

Вы используете 'double d' в своей программе. Посмотрите на прототип, скажем, MPI_Send. Обратите внимание, что в качестве отправляемого буфера требуется 'void *'. Он также запрашивает тип MPI_Datatype, чтобы сообщить ему, что находится в буфере. Вот где вы кладете MPI_DOUBLE. – Adam

+0

Я понимаю, что вы имеете в виду. Другими словами, мы можем использовать либо «double d;», либо «MPI_DOUBLE d;» в программе (если компилятор не жалуется). Есть ли у вас представление о двух преимуществах, а именно: копирование mem-to-mem и использование специального оборудования? – user2196452

2

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

Поскольку данный тип данных MPI не требуется ссылаться на один и тот же элементарный тип на двух разных машинах. MPI_INT может быть int на одной машине и long с другой. Это особенно полезно в C++, начиная с the C++ standard doesn't specify byte size for the various integral types, поэтому int может иметь больше бит на одной машине, чем на другой.

Во-вторых, почему эта ориентированная на приложения макет данных в памяти имеет два упомянутых преимущества?

Посмотрите на аргументы MPI_Send(). Он получает void* к началу данных и количеству отправляемых элементов. Он предполагает, что элементы выстраиваются последовательно в памяти один за другим и имеют один и тот же тип. Во всех случаях, кроме самых удачливых случаев, это будет неверно в вашем приложении. Даже если у вас просто есть простой массив структур (где элементы структуры не все одинаковы), единственный способ отправить эти структуры без определяемых пользователем типов данных MPI - это скопировать первый элемент из каждой структуры в отдельный массив, отправить его, а затем скопировать второй элемент из каждой структуры в другой массив, отправить его и т. д. Производные типы данных MPI позволяют напрямую извлекать данные из того места, где они есть, без переупорядочения или копирования.

Я не уверен, что второй пункт должен упоминать.

Смежные вопросы