2012-06-11 6 views
1

Мне нужно написать программу MPI, которая должна запускать несколько процессов на разных узлах кластера. Это мой пример кода.Как прервать программу MPI, которая разветвила другие процессы

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

int main(int argc, char *argv[]) { 
    int rank, size, nodenamesize; 
    char nodename[100]; 

    MPI_Init(&argc, &argv); 

    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Get_processor_name(nodename, &nodenamesize); 

    printf("Hello world! I am %d of %d running on %s\n", rank, size, nodename); 

    if (rank == 0) { 
     system("./Longwait&"); 
    } else if (rank == 1) { 
     system("./AnotherLongWait&"); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

Он успешно запускает процессы, но приложение MPI не завершается. Он ждет даже после вызова MPI_Finalize() ;.

с каким кодом? Что мне нужно сделать, чтобы программа MPI должна была запускать некоторые другие приложения, но ничего не ждать.

Спасибо, С уважением, Robo.

+0

Рассматривали ли вы использование системных вызовов 'fork',' execve' и 'waitpid' (следовательно, исключая библиотечную функцию' system') и связывались с вашими процессами '* LongWait', используя, например, 'pipe'-s, возможно, с' poll'? –

+0

Да, я тоже пробовал fork & execl .. Если его обычные процессы создаются, то родительский выход завершается так, как ожидалось. но здесь, с MPI, родительский процесс MPI не выходит, пока не будут убиты как «Longwait», так и «AnotherLongWait». – RoboAlex

+0

Вам необходимо, чтобы родительский процесс MPI продолжался до тех пор, пока работает ваш «LongWait». Вы не можете называть 'MPI_Finalize' раньше. –

ответ

2

Причина задержки - механизм, который использует Open MPI для обеспечения перенаправления ввода-вывода. Совет: используйте system("ls -l /proc/self/fd"); или system("lsof -c lsof");, чтобы узнать, сколько файловых дескрипторов открыто в дочерних процессах, порожденных system(3). Эти дескрипторы открываются как Longwait, так и AnotherLongWait, что заставляет их работать во время ожидания.

Вот простой пример с двумя очень простыми версиями выборочных Longwait:

Версия 1: Спит 1 минута

#include <unistd.h> 

int main (void) 
{ 
    sleep(60); 
    return 0; 
} 

Если вы икру эту программу с system("./Longwait&"); вам придется ждать его, чтобы перед тем, как закончить до mpirun/mpiexec.

Version 2: Слепо закрывает первые 20 дескрипторы перед сном

#include <unistd.h> 

int main (void) 
{ 
    int i; 

    for (i = 0; i < 20; i++) 
     close(i); 
    sleep(60); 
    return 0; 
} 

Если вы икрой этой программы, как и прежде, mpirun/mpiexec исполняемые завершатся вскоре после выхода из программы MPI без ожидания.

Теперь это не Настоящее решение - случайное закрытие открытых файловых дескрипторов может иметь непредсказуемые эффекты. Выяснить, какие дескрипторы должны быть закрыты, нелегко и не переносимо. Я бы вообще не советовал делать то, что вы делаете в своем коде. Кроме того, Open MPI не поддерживает надежную поддержку процессов с системами с интерфейсом InfiniBand (system(3) использует fork(2) за кулисами).

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