параллельный цикл в C ++ с использованием MPI - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь сделать мой цикл for параллельным в c ++.Итерации полностью независимы.Ниже приведена аналогичная программа, которая фиксирует идею задачи.

class A{

    // create experiment 
    // perform experiment
    // append results to file 
    // reset the experiment 

};

main {

    // open a file 

    // instance class
    A a;
    int N = 10000;

    for ( int i = 0; i <= N; i++ ){
        a.do_something()
    }

    // close file
    // return
}

Каждая итерация будет просто печатать свои данные в выходной файл, порядок этого также не важен.Поскольку a.do_something() является длинным, я бы хотел сделать его параллельным.Я установил MPI и теперь немного знаком с его основным использованием.

Моя логика заключается в разделении диапазона N на разделы в зависимости от количества доступных процессоров.Я ищу некоторую помощь в том, как перенести мою серийную версию в параллель с MPI.Моя попытка:

class A{

    // create experiment 
    // perform experiment
    // append results to file 
    // reset the experiment 

};

main {

    // open a file 

    // instance class
    A a;


    // initialise the MPI 
    int ierr = MPI_Init(&argc, &argv);
    int procid, numprocs;

    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &procid);
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

    // partition = (job size) over (processors). 
    unsigned int partition = N / numprocs;


    int N = 10000;

    for ( int i = 0; i <= N; i++ ){
        a.do_something()
    }



    ierr = MPI_Finalize();
    // close file
    // return
}

Но я действительно изо всех сил пытаюсь разбить цикл for и не знаю, как продолжить.

Это просто дважды запустит последовательный код (на моем 2машина).Я хочу разделить цикл for на N/2 фрагментов и сделать так, чтобы каждый поток занимался разными фрагментами.

Нужно ли мне сохранять ядро ​​для передачи заданий другим ядрам?Могу ли я перебрать разделы?У меня есть поиск в Интернете, и мне не повезло.Какие-либо предложения?

1 Ответ

0 голосов
/ 25 сентября 2018

когда начинается часть кода MPI, думайте о ней как о независимых программах, работающих на процессоре.Это означает, что написанный вами цикл выполняется независимо на обоих процессорах.Способ его разделения, например, будет

for ( int i = rank*partition; i <= rank*partition+partition; i++ )

{
    a.do_something()
}

Кроме того, объявите N перед использованием: -)

...