2014-09-23 2 views
1

У меня возникли проблемы с использованием pthreads в моей программе MPI. Моя программа отлично работает без привлечения pthreads. Но затем я решил выполнить параллельную операцию, и поэтому я создаю pthread, который делает следующее (MPI_Probe, MPI_Get_count и MPI_Recv). Моя программа не работает в MPI_Probe, и код ошибки не возвращается. Это, как я инициализировать среду MPIИспользование pthreads с MPICH

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided_threading_support); 

Предоставленный резьб поддержка «3», который я предполагаю, что это MPI_THREAD_SERIALIZED. Любые идеи о том, как я могу решить эту проблему?

+0

Оставьте свой код. – Jeff

ответ

-1

Если реализация MPI не желает, чтобы дать вам MPI_THREAD_MULTIPLE, есть три вещи, которые вы можете сделать:

  1. Получить новую реализацию MPI.
  2. Защитите вызовы MPI с критической секцией.
  3. Сократите это с помощью резьбонарезной вещи.

Я бы предложил # 3. Весь смысл MPI : параллелизм - если вы создаете несколько потоков для одного подпроцесса MPI, вы должны подумать, должны ли эти потоки быть независимыми подпроцессами для начала.

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

Хорошо, теперь, когда вы все это прочитали, пуанлинг: 3 is MPI_THREAD_MULTIPLE. Но серьезно. Пересмотрите свою архитектуру.

+1

Имеются допустимые варианты использования для объединения потоков (будь то pthreads, OpenMP или другие) с MPI (так называемый гибридный подход). Действительно, для многих кодов необходимо обеспечить хорошее сильное масштабирование до очень большого количества узлов, где сочетаются потоки на отдельных узлах/сокетах и ​​связь MPI между узлами. Это также полезно, когда у вас есть системы на основе ускорителей, где у вас может быть один ранг MPI на ускоритель и несколько ядер на ускоритель, поэтому имеет смысл иметь разные потоки, обрабатывающие MPI-связь и т. Д. – bcumming

2

Предоставленная поддержка резьбы - «3», которая, как я полагаю, MPI_THREAD_SERIALIZED.

Стандарт MPI определяет уровни поддержки нити как константы и только требует, чтобы их значения монотонные, т.е. MPI_THREAD_SINGLE < MPI_THREAD_FUNNELED < < MPI_THREAD_SERIALIZEDMPI_THREAD_MULTIPLE. Фактические числовые значения специфичны для реализации и никогда не должны использоваться или сравниваться.

Коммутационные вызовы MPI по умолчанию никогда не возвращают коды ошибок, кроме MPI_SUCCESS. Причиной этого является то, что MPI вызывает обработчик ошибок коммуникатора до вызова MPI, и все коммуникаторы изначально создаются с MPI_ERRORS_ARE_FATAL, установленными в качестве обработчика ошибок. Этот обработчик ошибок завершает работу программы и обычно печатает некоторую информацию для отладки, например. причина неудачи. И MPICH (и его бесчисленные варианты), и Open MPI дают довольно сложные отчеты о том, что привело к прекращению.

Чтобы включить пользовательскую ошибку обработки на коммуникаторе comm, вы должны сделать следующий вызов:

MPI_Comm_set_errhandler(comm, MPI_ERRORS_RETURN); 

Берегись коды ошибок возвращаются - их числовые значения также от конкретной реализации.

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