2013-10-16 16 views
1

Hmm, Bonjour, everyone.I obtenir ces erreurs lors de l'exécution programme parallèle wiht MPI et OpenMP sous Linux,MPI_Comm_size Segmentation fault

[node65:03788] *** Process received signal *** 
[node65:03788] Signal: Segmentation fault (11) 
[node65:03788] Signal code: Address not mapped (1) 
[node65:03788] Failing at address: 0x44000098 
[node65:03788] [ 0] /lib64/libpthread.so.0 [0x2b663e446c00] 
[node65:03788] [ 1] /public/share/mpi/openmpi- 1.4.5//lib/libmpi.so.0(MPI_Comm_size+0x60) [0x2b663d694360] 
[node65:03788] [ 2] fdtd_3D_xyzPML_MPI_OpenMP(main+0xaa) [0x42479a] 
[node65:03788] [ 3] /lib64/libc.so.6(__libc_start_main+0xf4) [0x2b663e56f184] 
[node65:03788] [ 4] fdtd_3D_xyzPML_MPI_OpenMP(_ZNSt8ios_base4InitD1Ev+0x39) [0x405d79] 
[node65:03788] *** End of error message *** 
----------------------------------------------------------------------------- 
mpirun noticed that process rank 2 with PID 3787 on node node65 exited on signal 11 (Segmentation fault). 
----------------------------------------------------------------------------- 

Après analyse, je les fichiers de base, je reçois le message suivant:

[Thread debugging using libthread_db enabled] 
[New Thread 47310344057648 (LWP 26962)] 
[New Thread 1075841344 (LWP 26966)] 
[New Thread 1077942592 (LWP 26967)] 

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 47310344057648 (LWP 26962)] 
0x00002b074afb3360 in PMPI_Comm_size() from /public/share/mpi/openmpi-1.4.5//lib/libmpi.so.0 

ce qui les cause? Merci pour votre aide

le code (test.cpp) est la suivante, et vous pouvez essayer:

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

int main(int argc, char* argv[]) 
{ 
int nprocs = 1; //the number of processes 
int myrank = 0; 
int provide; 

MPI_Init_thread(&argc,&argv,MPI_THREAD_FUNNELED,&provide); 
if (MPI_THREAD_FUNNELED != provide) 
{ 
    printf ("%d != required %d", MPI_THREAD_FUNNELED, provide); 
    return 0; 
} 

MPI_Comm_size(MPI_COMM_WORLD,&nprocs); 
MPI_Comm_rank(MPI_COMM_WORLD,&myrank); 

int num_threads = 1;  //Openmp 
omp_set_dynamic(1); 
num_threads = 16; 
omp_set_num_threads(num_threads); 

#pragma omp parallel 
{ 
    printf ("%d omp thread from %d mpi process\n", omp_get_thread_num(), myrank); 

} 
MPI_Finalize(); 

} 
+0

Pourriez-vous nous montrer le code qui provoque le segfault? Vous devrez peut-être compiler votre programme avec le débogage enablead et l'exécuter dans un débogueur comme 'mpirun -np 2 xterm -e gdb -ex exécuter parallel_program'. –

+0

Merci pour l'aide, je ne sais pas quel code cause cela, et je pense qu'il a quelque chose avec MPI_Comm_size. Et je suis désolé que le code source soit trop long pour vous montrer. Addtional, le code peut s'exécuter dans Windows. Après avoir changé le run_environment en Linux, j'utilise makefile pour remplir mon code et il n'y a rien de mal, quand il exécute "mpirun -np 8 parallel_program", il a des erreurs ci-dessus. – kenan

+0

Montrez-nous les parties pertinentes de votre fonction 'main', y compris comment vous initialisez MPI et comment appelez-vous' MPI_Comm_size'. –

Répondre

1

Eh bien, ce qui est probablement pas grand-chose, ou même un peu d'une réponse boiteux, mais j'ai eu ce problème en mélangeant différentes installations MPI (un OpenMPI et un MVAPICH2 pour être précis).

Voici quelques petites choses à vérifier

  • contre quelle version de MPI vous avez lié
ldd <application> | grep -i mpi 
    libmpi.so.1 => /usr/lib64/mpi/gcc/openmpi/lib64/libmpi.so.1 (0x00007f90c03cc000) 
  • quelle version de MPI est chargée dynamiquement
echo $LD_LIBRARY_PATH | tr : "\n" | grep -i mpi 
/usr/lib64/mpi/gcc/openmpi/lib64 
  • si vous remplacez cette charge dynamique (cette variable doit être vide, sauf si vous savez ce que vous faites)
echo $LD_PRELOAD 

Si c'est tout OK, vous devez vérifier que chaque bibliothèque à laquelle vous étiez lié et qui dépend de MPI était également liée à la même version. Si aucune autre bibliothèque n'est liée à MPI, rien ne doit apparaître.

ldd <application> | sed "s/^\s*\(.*=> \)\?//;s/ (0x[0-9a-fA-F]*)$//" | xargs -L 1 ldd | grep -i mpi 

Si quelque chose suspect ne se présentent, par exemple libmpich.so.3 => /usr/lib64/mpi/gcc/MVAPICH2/1.8.1/lib/libmpich.so.3 par exemple, vous devez supprimer les -L 1 et remplacer grep quelque chose à visualiser (rien? Ou less, ou vim - ...), puis la recherche pour cette ligne suspecte.