У меня 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 (). Как я должен изменить код?
Спасибо!
Вывести на экран текущее значение переменной 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
скорее всего перепутано.
Вы уверены, что правильно компилируете свой код?
Ваша проблема в том, что 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
объект, а затем перейти к соответствующей функции.