MPI_type_index может увеличить нагрузку на связь

#parallel-processing #mpi #hpc

#параллельная обработка #mpi #hpc

Вопрос:

недавно я работаю над реализацией параллельных методов LBM. Я обнаружил, что при реализации MPI_index перед выполнением потоковой части это может даже вызвать дополнительные издержки связи. Например, когда я пытаюсь использовать MPI_type_index для определения нового MPI_type, он копирует определенную часть из домена, который распределен произвольно, или номер блока относительно мал, это может вызвать дополнительные издержки.

Поэтому я бы спросил опытного программиста параллельного программирования, правильно ли я понимаю?

Ответ №1:

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

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

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

Чтобы подробнее остановиться на комментарии Джонатана Дурси. Типы данных MPI сами по себе не требуют затрат на сетевую связь. Это упаковка и распаковка данных, которые выполняются до или после операции обмена данными, из-за которой возникают накладные расходы. Типы данных MPI — это, по сути, рецепты того, как данные должны считываться из памяти или записываться в память при построении или деконструировании сообщения. При надлежащем сетевом оборудовании, которое понимает собранные операции чтения и разрозненные операции записи, и реализации MPI, которая может соответствующим образом программировать это оборудование, можно было бы преобразовать инструкции внутри типа данных MPI в набор векторов чтения или записи, а затем поручить сетевому адаптеру выполнить тяжелую работу по упаковке и распаковке. Если сеть не поддерживает такие операции или реализация MPI не знает, как перенести эту операцию на аппаратное обеспечение, упаковка должна выполняться программным обеспечением, и обычно для этого используется промежуточный буфер. Вот откуда берутся накладные расходы. Как уже отметил Джонатан Дурси, процедуры упаковки / распаковки типов данных в MPI чрезвычайно оптимизированы и обычно выполняют свою работу максимально эффективно (просто взгляните на открытый исходный код MPI, чтобы увидеть, в какой степени они настраиваются для наилучшего использования кэша). Поэтому, если вашему алгоритму требуется индексированный тип данных или любой другой тип данных с пробелами между элементами данных, просто создайте соответствующий тип данных MPI и используйте его.

Примером сетевого соединения, поддерживающего такие операции, является InfiniBand. Каждый запрос на отправку или операцию предоставляется со списком так называемых элементов рассеяния / сбора (SGEES). Я не углублялся так глубоко в различные реализации MPI и не знаю, могут ли они использовать SGES, чтобы пропустить фазу упаковки программного обеспечения. Однако это, вероятно, не будет работать очень хорошо с огромным количеством разрозненных элементов данных.

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

Комментарии:

1. Также, стоит отметить @Lbj_x, что дело не в том, что MPI_Type_indexed (или что-то еще) увеличивает накладные расходы; это делает расположение памяти. (потенциально) дороже собрать, скажем, 10 двойных файлов, которые разбросаны по нескольким страницам, чем получить 10 двойных файлов, которые хранятся последовательно. Но если это данные, которые вы должны отправить, то так оно и есть, и вам в любом случае придется оплатить эти расходы. Типы данных MPI, вероятно, выполнят эту работу по крайней мере так же хорошо и действенно, как все, что вы пишете самостоятельно.