2015-05-13 16 views
5

Stavo scrivendo un progetto usando MPI per un corso di programmazione parallela e ho deciso di nominare una delle mie funzioni connect(). Ma ogni volta che ho provato a mpirun il programma (usando le versioni recenti di Open MPI su Linux e OS X), riceverei l'output dalla funzione connect(), anche se non avevo chiamato connect() da main(); inoltre, parte dell'output di main() non verrà visualizzato.In che modo la funzione named connect() impedisce l'esecuzione del programma MPI C?

Questo è un programma semplificato il problema:

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

void connect(); //function name breaks mpi 

int main(void) { 

    int comm_sz, my_rank; 
    MPI_Init(NULL, NULL); 
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
    printf("my_rank is %d\n", my_rank); 
    fflush(stdout); 
    MPI_Finalize(); 
    return EXIT_SUCCESS; 
} 

void connect() { 

    printf("\nNot main! \n"); 
    return; 
} 

e l'uscita:

[[email protected] ~]$ mpicc bad.c -Wall 
[[email protected] ~]$ mpirun -n 1 a.out 

Not main! 
-------------------------------------------------------------------------- 
orterun noticed that process rank 0 with PID 17245 on node host exited on signal 13 (Broken pipe). 
-------------------------------------------------------------------------- 

Stavo per chiedere su Stack Overflow che cosa era sbagliato, in primo luogo, fino a quando ho scoperto che rinominare la funzione lo corregge. Quindi quello di cui sono curioso ora è il motivo per cui nominare la funzione connect() impedisce al programma di funzionare correttamente. Potrebbe anche essere un problema con mpirun/Open RTE?

Possibili conduttori:

  • c'è una funzione connect() in <sys/socket.h>, ma non ho ancora trovato menzionato nei file di intestazione MPI.
  • C'è anche una funzione Connect() (con una C maiuscola) in "ompi/mpi/cxx/intracomm.h" che è inclusa indirettamente da <mpi.h>, ma ho pensato che il caso contava in C/C++ e sembra un metodo di una classe C++.
  • Se cerco di eseguire il programma come una normale, funziona quando viene eseguito su OS X, ma non su Linux:

mac:~ me$ ./a.out 
my_rank is 0 

vs

[[email protected] ~]$ ./a.out 

Not main! 

risposta

7

I indicherebbe che una delle funzioni MPI che chiamate chiama a sua volta la chiamata di sistema connect(). Ma poiché gli eseguibili ELF hanno uno spazio dei nomi piatto per i simboli, viene chiamato il tuo connect().

Il problema non si verifica in Mac OS perché le librerie Mach-O hanno uno spazio dei nomi a due livelli, quindi i simboli nelle diverse librerie non sono in conflitto tra loro.

Se si rende la funzione statica, probabilmente si eviterà anche il problema.

+0

Urrà per gli spazi dei nomi! – Jeff

+0

Avevo assunto che la funzione 'main()' non veniva chiamata, ma dopo aver esaminato questo suggerimento sembra essere sempre chiamato; Aggiungerò più 'printf()' prima e tra le funzioni MPI per identificare almeno il primo problema problematico. Inoltre, il suggerimento statico funziona. C'è un modo per indagare ulteriormente se la chiamata di sistema 'connect()' viene effettivamente chiamata, o altrimenti identifica il conflitto nello spazio dei nomi? – chrstphrchvz

+2

Come uno degli autori di Open MPI, confermo che la risposta fornita da + gomiti è corretta: Open MPI fa uso della chiamata di sistema connect (2). Quando hai una funzione pubblica chiamata connect (2) (probabilmente come parte di MPI_Init), il linker finirà per invocare * la tua funzione * connect() piuttosto che connect (2). Le cose brutte accadono da lì. –

Problemi correlati