MPI: Как запустить три функции, которые будут выполняться в разных потоках

У меня 3 функции и 4 ядра. Я хочу выполнить каждую функцию в новом потоке, используя MPI и C ++
Я пишу это

int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
size--;
if (rank == 0)
{
Thread1();
}
else
{
if(rank == 1)
{
Thread2();
}
else
{
Thread3();
}
}
MPI_Finalize();

Но он выполняет только Thread1 (). Как я должен изменить код?

Спасибо!

2

Решение

Вывести на экран текущее значение переменной size (возможно, не уменьшая его), и вы найдете 1, То есть: «есть 1 процесс запущен «.

Скорее всего, вы скомпилировали код неправильно. Подумайте об использовании mpirun (или же mpiexec, в зависимости от вашей реализации MPI), т.е.

 mpirun -np 4 ./MyCompiledCode

-np Параметр указывает количество процессов, которые вы запустите (при этом ваш MPI_Comm_size будет 4, как вы ожидаете).


В настоящее время, однако, вы не используете ничего явно из-за C ++. Вы можете рассмотреть некоторые C ++ привязки MPI, такие как Boost.MPI.


Я немного поработал над код Вы предоставили. Я изменил это немного, производя этот за работой код MPI (я предоставил некоторые необходимые исправления заглавными буквами).

FYI:

  • компиляция (под gcc, mpich):

     $ mpicxx -c mpi1.cpp
    $ mpicxx -o mpi1 mpi1.o
    
  • выполнение

    $ mpirun -np 4 ./mpi1
    
  • выход

    size is 4
    size is 4
    size is 4
    2 function started.
    thread2
    3 function started.
    thread3
    3 function ended.
    2 function ended.
    size is 4
    1 function started.
    thread1
    1 function ended.
    

Быть в курсе, что stdout скорее всего перепутано.

Вы уверены, что правильно компилируете свой код?

6

Другие решения

Ваша проблема в том, что MPI не предоставляет способа ввода консольного ввода во многие процессы, а только в процесс с рангом 0, Из-за первых трех строк main:

int main(int argc, char *argv[]){

int oper;
std::cout << "Enter Size:";
std::cin >> oper;           // <------- The problem is right here

Operations* operations = new Operations(oper);
int rank, size;
MPI_Init(&argc, &argv);
int tid;
MPI_Comm_rank(MPI_COMM_WORLD, &tid);
switch(tid)
{

все процессы, кроме ранга 0 блокировать ожидание консольного ввода, который они не могут получить. Вы должны переписать начало вашего main функционировать следующим образом:

int main(int argc, char *argv[]){

int oper;

MPI_Init(&argc, &argv);
int tid;
MPI_Comm_rank(MPI_COMM_WORLD, &tid);

if (tid == 0) {
std::cout << "Enter Size:";
std::cin >> oper;
}
MPI_Bcast(&oper, 1, MPI_INT, 0, MPI_COMM_WORLD);

Operations* operations = new Operations(oper);
switch(tid)
{

Работает следующим образом: только ранг 0 отображает приглашение, а затем считывает ввод с консоли в oper, Затем трансляция стоимости oper из ранга 0 выполняется, чтобы все остальные процессы получили правильное значение, создайте Operations объект, а затем перейти к соответствующей функции.

2

По вопросам рекламы [email protected]