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>
birconnect()
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!
Ad boşlukları için boşluk bırakın! – Jeff
“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
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. –