Параллельное программирование MPI - PullRequest
0 голосов
/ 20 марта 2011

У меня есть три пользовательские функции в программе симулятора Монте-Карло. В main() они вызываются с использованием соответствующих параметров.

Это последовательная программа.

Как мне преобразовать его в параллельную программу?

Шаги, которые я уже сделал для последовательной программы, чтобы сделать ее параллельной программой MPI являются:

#include <conio.h>
#include <stdio.h>
#include "mpi.h"

//Global Varibles Declared
#define a=4;
#define b=2;
#define c=4;
#define d=6;

function1(Parameter4, Parameter))
{ 
  // body of function
}

function2( parameter 1, parameter2)
{
  //body of function
}


int main(int argc, char *argv[]) 
{
  // Local Variables defined
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  function1(a, b);
  function2(c, d);
  MPI_Finalize ();
}

Теперь мои вопросы

Где мне указать

  1. Количество процессоров (например, при работе с 2, 4, 6, 8 процессорами)
  2. Методы отправки и получения
  3. Как посмотреть графики вывода с использованием разного количества процессоров.

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

Ответы [ 2 ]

0 голосов
/ 29 августа 2011
  1. Прежде всего, ваш пример кода не является допустимым кодом C. Строки #define должны выглядеть следующим образом:

    #define a 4
    
  2. Количество процессоров обычно указывается при запуске программы, что обычно делается с помощью

    mpiexec -np PROCS MPIPROG
    

    и т. П., Где PROCS - количество запускаемых задач MPI, а MPIPROG - имя скомпилированного исполняемого файла MPI. Существует также возможность порождать задачи MPI изнутри MPI, но это работает не везде, поэтому я бы не рекомендовал это делать. Преимущество указания количества задач во время выполнения состоит в том, что вы можете выбирать, сколько задач использовать в зависимости от платформы, на которой вы работаете.

  3. Send и Recv можно использовать в любом месте кода, после вызова MPI_Init и до вызова MPI_Finalize. Например, чтобы отправить целое число из задачи 0 в задачу 1, вы должны использовать что-то вроде

    int number;
    
    if (rank == 0) {
      /* compute the number on proc 0 */
      number = some_complex_function();
      /* send the number to proc 1 */
      MPI_Send(&number, 1, MPI_INT, 1, 42, MPI_COMM_WORLD);
    } else if (rank == 1) {
      /* receive the number from proc 0 */
      MPI_Recv(&number, 1, MPI_INT, 0, 42, MPI_COMM_WORLD, 0);
    }
    
    // now both procs can do something with the number
    

    Обратите внимание, что в этом случае Задача 1 должна будет ждать получения номера от задачи 0, поэтому в реальном приложении вам может потребоваться выполнить задачу 1, в то время как задача 0 вычисляет «some_complex_function».

0 голосов
/ 20 марта 2011

MPI - это протокол связи.Мы не можем помочь вам, не зная, с какой платформой / библиотекой вы работаете.Если вы знаете, с какой библиотекой вы работаете, есть вероятность, что в сети есть пример, показывающий, как с его помощью реализовать симуляции Монте-Карло.

...