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!
Urrà per gli spazi dei nomi! – Jeff
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
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ì. –