2015-05-13 13 views
5

Bir paralel programlama dersi için MPI kullanarak bir proje yazıyordum ve connect() işlevlerimden birini seçmeye karar verdim. Ama ne zaman mpirun programında (Linux ve OS X Open MPI'nin son sürümlerini kullanarak), connect() işlevinden, connect()main(); Ayrıca, main() çıktısının bazıları görüntülenmeyecekti.connect() adlı işlev, MPI C programının çalışmasını nasıl engeller?

Bu konuyla basitleştirilmiş bir programdır:

#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; 
} 

ve çıkış:

[[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). 
-------------------------------------------------------------------------- 

keşfettim kadar, ilk etapta neyin yanlış olduğunu Yığın taşması sormak üzereydi işlevi yeniden adlandırmak bunu düzeltir. Şimdi merak ettiğim şey, connect() işlevinin isimlendirilmesinin programın düzgün çalışmasını engellemesinin nedenidir. mpirun/Open RTE ile de bir sorun olabilir mi?

Olası potansiyel müşteriler:

  • Orada <sys/socket.h> bir connect() fonksiyon, ama henüz MPI başlık dosyaları belirtilen bulamadım.
  • Ayrıca <mpi.h> numaralı "ompi/mpi/cxx/intracomm.h" numaralı Connect() (büyük harf C ile) bir işlev var, ancak C/C++ durumunda önemli olduğunu düşündüm ve C++ sınıfının bir yöntemi gibi görünüyor.

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

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

Not main! 

cevap

7

I: Ben normal bir gibi bir program yürütme çalışırsanız OS X üzerinde çalışan, ancak Linux üzerinde zaman

  • , çalışıyor aradığınız MPI işlevlerinden birinin de connect() sistem çağrısını çağırdığını tahmin eder. Ancak ELF'nin yürütülebilir dosyalarının semboller için düz bir ad alanı olduğundan, bunun yerine connect() numaranız aranıyor.

    Mac OS'de sorun meydana gelmiyor çünkü Mach-O kitaplıklarının iki düzeyli bir ad alanı var, bu nedenle farklı kitaplıklardaki simgeler birbiriyle çakışmıyor.

    Eğer işlevinizi statik yaparsanız, büyük olasılıkla sorundan da kaçınabilirsiniz.

  • +0

    Ad boşlukları için boşluk bırakın! – Jeff

    +0

    “main()” işlevinin çağrılmadığını varsaymıştım, ancak bu öneri incelendikten sonra her zaman çağrılmış gibi görünüyor; En az ilk sorunlu olanı tanımlamak için MPI işlevlerinden önce ve daha fazla 'printf()' ekleyeceğim. Ayrıca, statik öneri çalışır. Connect() 'sistem çağrısının gerçekten arandığını veya ad alanı çakışmasını başka şekilde tanımlayıp teşhis etmediğini araştırmanın bir yolu var mı? – chrstphrchvz

    +2

    Açık MPI'nin yazarlarından biri olarak, + dirseklerin cevaplarının doğru olduğunu onaylayacağım: Açık MPI, bağlantı (2) sistem çağrısından yararlanıyor. Connect (2) (muhtemelen MPI_Init'in bir parçası olarak) adlı bir genel işleve sahip olduğunuzda, linker bağlanmaya (2) değil, * connect() işlevinizi çağırmaya son verecektir. Kötü şeyler oradan olur. –