2013-12-11 7 views
3

Я должен реализовать программу MPI. Существуют некоторые глобальные переменные (4 массива чисел с плавающей запятой и другие 6 одиночных переменных с плавающей запятой), которые сначала инициализируются основными данными, считывающими процесс из файла. Затем я вызываю MPI_Init и, пока процесс ранга 0 ждет результатов, другие процессы (ранг 1,2,3,4) работают на массивах и т. Д. Проблема в том, что эти массивы, похоже, больше не инициализируются, все установлено в 0. Я попытался переместить глобальную переменную внутри основной функции, но результат тот же. Когда вызывается MPI_Init(), все процессы создаются с помощью fork right? Итак, у каждого есть копия отца, так почему они не видят не инициализированные массивы?MPI и глобальные переменные

ответ

7

Боюсь, вы неправильно поняли.

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

Я не уверен, что стандарт MPI даже требует, чтобы процесс 0 имел значения для переменных, которые были объявлены и инициализированы до вызова mpi_init, то есть до того, как процесс 0 действительно существует.

Независимо от того, будет ли это делать или нет, вам придется писать код, чтобы получить значения в переменных в адресном пространстве других процессов. Одним из способов сделать это будет то, что процесс 0 отправит значения другим процессам, по одному или с помощью широковещательной передачи. Другим способом было бы для всех процессов считывать значения из входных файлов; если вы выберете этот вариант, не задумывайтесь над ресурсами ввода-вывода.

Попутно, я не думаю, что для реализации MPI для создания процессов с помощью разворачивания при вызове mpi_init, forking чаще используется для создания потоков. Я думаю, что большинство реализаций MPI фактически создают процессы при вызове mpiexec, вызов mpi_init - это формальность, которая объявляет, что ваша программа начинает свои параллельные вычисления.

+0

Ваш ответ был действительно полезен. Я должен реализовать это упражнение в качестве небольшого проекта для параллельного программирования, и учитель хочет, чтобы мы использовали mpi (возможно, это был лучший openmp) ... программа должна вычислить общий объем 100 сфер, одинаково распределенных по трем направлениям x, y, z и учитывая их лучи и используя алгоритм Монте-Карло (приближение). Все эти данные вставляются в 4 разных массива в начале, и я думал, что каждый процесс должен иметь их копию ... ОК, я буду использовать трансляцию. Спасибо ... ты был очень добр ко мне. –

+0

Итак, лучшим решением является то, что процесс 0 инициализирует массив, а затем он bcas их другим, не так ли? Я афрай, это пустая трата времени для параллельных вычислений ... –

+2

Это может быть пустой тратой времени для параллельного компьютера, но полезно использовать свое время, когда вы узнаете о предмете. –

6

Когда вызывается MPI_Init(), все процессы создаются с помощью функции fork right?

Неправильно.

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

+0

Итак, лучшим решением является то, что процесс 0 инициализирует массив, а затем он bcas их другим, не так ли? Я афрай, это пустая трата времени для параллельных вычислений ... –

3

Как говорят другие ответы, это не то, как работает MPI. Данные уникальны для каждого процесса и должны быть явно переданы между процессами с использованием API, доступного в спецификации MPI.

Однако существуют модели программирования, которые допускают такое поведение. Если, скажем, параллельных вычислений, вы имеете в виду несколько ядер на одном процессоре, вам может быть лучше, если вы используете что-то вроде OpenMP для обмена данными между потоками.

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

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

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

+0

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

+0

еще один вопрос: все процессы/ранги должны создавать разные случайные числа с плавающей запятой между min и max (заданные мной), но если я запускаю mpirun -np 5 ./program, все процессы/ранги генерируют одинаковое случайное число ... как может избежать этого? –

+0

Это действительно нужно задать как отдельный вопрос. В любом случае это не относится к MPI. –

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