kfoynt Δημοσ. 10 Οκτωβρίου 2014 Δημοσ. 10 Οκτωβρίου 2014 Καλησπέρα! Έχω ένα πρόγραμμα το οποίο τρέχω σε clusters με open MPI. Το πρόγραμμα είναι γραμμένο σε c++. Κάπου παίρνω ένα segmentation fault οπότε αποφάσισα σταδιακά να κάνω comment out διάφορες γραμμές του κώδικα για να βρω που είναι το πρόβλημα. Τελικά κατέληξα να κάνω comment όλο τον κώδικα εκτός από ένα απλό array declaration!!! Από κάτω είναι ο commented κώδικας: #include <mpi.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.14159265358979323846 /* pi */ int main(int argc, char **argv) { /* Cluster info */ int size_p, p; char hostname[128]; size_t len = 126; /* Maximum number of iterations */ int maxpdNCGitr = 100; /* Maximum number of iterations for pcg */ int maxpcgitr = 10000; /* mpi stuff below */ // MPI::Init ( argc, argv ); MPI_Init(&argc,&argv); MPI_Comm comm = MPI_COMM_WORLD; MPI_Comm_rank(comm,&p); // p = MPI::COMM_WORLD.Get_rank ( ); MPI_Comm_size(comm,&size_p); // size_p = MPI::COMM_WORLD.Get_size ( ); int N = pow(2,22); /* number of columns in matrix A */ int m = N*2; /* number of constraints */ int k = N/8; /* number of nonzeros in optimal solution */ /* Sizes of vectors in processors */ int n_p = N/size_p; int m_p = m/size_p; int k_p = k/size_p; printf("n_%d = %d \n", p, n_p); printf("m_%d = %d \n", p, m_p); printf("k_%d = %d \n", p, k_p); /* Allocate part of optimal solution for each processor */ double xopt_p[n_p]; MPI_Finalize(); exit(0); } Το πρόγραμμα τυπώνει τις τιμές n_p, m_p και k_p κανονικά, άσχετα από τον αριθμό των processors. και μόλις πηγαίνει στο array declaration double xopt_p[n_p]; μου πετάει segmentation fault. Για μικρές τιμές n_p (ή μικρές τιμές N) το πρόγραμμα δουλεύει μια χάρα. Το πρόβλημα εμφανίζεται όταν το n_p είναι μεγάλο, αλλά σίγουρα πολύ μικρότερο από το μέγιστο που επιτρέπει η μνήμη. Το output είναι αυτό: mpirun noticed that process rank 0 with PID 22446 on node eddie266 exited on signal 11 (Segmentation fault). ΒTW, το αρχείο είναι .cpp και χρησιμοποιώ τον compiler mpic++ και στο compilation δεν παίρνω κάποιο warning. Γνωρίζει κανείς με τι μπορεί να σχετίζεται αυτό το πρόβλημα? Ο κώδικας είναι υπερβολικά απλός και κάτι μου λέει ότι κάτι κάνω λάθος στο compilation? Γενικά δεν είμαι έμπειρος προγραμματιστής, applied maths κάνω, και μου είναι δύσκολο να φανταστώ τι μπορεί να φταίει.
ggeo1 Δημοσ. 10 Οκτωβρίου 2014 Δημοσ. 10 Οκτωβρίου 2014 (επεξεργασμένο) ΚαλησπεραΤο προβλημα δε σχετιζεται με το MPI.Αν αλλαξεις σε dynamic memory, double *xopt_p = new double [ n_p] λειτουργει μια χαρα χωρις errors.Τωρα ,ειπες οτι με τη μνημη εισαι οκ αλλα δεν ξερω γιατι σε βγαζει προβλημα.Edit::Ειναι προβλημα μνημης,εφοσον,εκτελωντας το προγραμμα σου ,το νουμερο για το n_p ειναι μεγαλο.Αν το πολλαπλασιασεις και με int ,ειναι αρκετα μεγαλο μεγεθοςΕπομενως,χρησιμοποιεις dynamic array για να εισαι ησυχος.Απλα,μη ξεχασεις να ελευθερωσεις τη μνημη μετα. Επεξ/σία 10 Οκτωβρίου 2014 από ggeo1
kfoynt Δημοσ. 10 Οκτωβρίου 2014 Μέλος Δημοσ. 10 Οκτωβρίου 2014 Ευχαριστώ, λύθηκε το πρόβλημα. Μπορείς να μου εξηγήσεις περιληπτικά γιατί συμβαίνει αυτό? Τι συμβαίνει με το dynamic array? Btw, παίρνω κάποια warnings από το cluster engine (?) [eddie329:27742] 1 more process has sent help message help-mpi-btl-base.txt / btl:no-nics [eddie329:27742] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages και στο .po file παίρνω -catch_rsh /local/gridengine/spool/eddie329/active_jobs/9476759.1/pe_hostfile /exports/applications/apps/intel/ClusterStudio2011/impi/4.0.1.007 eddie329:1 eddie354:1 startmpich2.sh: check for local mpd daemon (1 of 10) /exports/applications/gridengine/8.0.0e/bin/lx-amd64/qrsh -inherit -V eddie329 /exports/applications/apps/intel/ClusterStudio2011/impi/4.0.1.007/bin/mpd startmpich2.sh: check for local mpd daemon (2 of 10) startmpich2.sh: check for mpd daemons (1 of 10) /exports/applications/gridengine/8.0.0e/bin/lx-amd64/qrsh -inherit -V eddie354 /exports/applications/apps/intel/ClusterStudio2011/impi/4.0.1.007/bin/mpd -h eddie329 -p 48218 -n startmpich2.sh: check for mpd daemons (2 of 10) startmpich2.sh: got all 2 of 2 nodes -catch_rsh /exports/applications/apps/intel/ClusterStudio2011/impi/4.0.1.007 Παρόλα τα warnings, ο αλγόριθμος τρέχει κανονικά πάντως.
ggeo1 Δημοσ. 10 Οκτωβρίου 2014 Δημοσ. 10 Οκτωβρίου 2014 Κοιτα, οταν δεσμευεις μνημη αναλογως αν ειναι dynamic η static πηγαινει στο heap η στο stack (δεν εχω ασχοληθει κ με λεπτομερειες). Μπορεις να ψαξεις για heap or static allocation in c για περισσοτερες πληροφοριες. Τωρα,δυστυχως δεν εχω καθολου εμπειρια με mpi,οποτε δεν μπορω να σου απαντησω γι αυτο. Απο οτι καταλαβαινω ομως ,εχει να κανει με τη μνημη.Αυτα τα μηνυματα τα παιρνεις παντοτε;Αν εμφανιζονται μονο για μεγαλα νουμερα τοτε εχει να κανει σιγουρα με τη μνημη αλλιως δε γνωριζω.
kfoynt Δημοσ. 10 Οκτωβρίου 2014 Μέλος Δημοσ. 10 Οκτωβρίου 2014 Κοιτα, οταν δεσμευεις μνημη αναλογως αν ειναι dynamic η static πηγαινει στο heap η στο stack (δεν εχω ασχοληθει κ με λεπτομερειες). Μπορεις να ψαξεις για heap or static allocation in c για περισσοτερες πληροφοριες. Τωρα,δυστυχως δεν εχω καθολου εμπειρια με mpi,οποτε δεν μπορω να σου απαντησω γι αυτο. Απο οτι καταλαβαινω ομως ,εχει να κανει με τη μνημη.Αυτα τα μηνυματα τα παιρνεις παντοτε;Αν εμφανιζονται μονο για μεγαλα νουμερα τοτε εχει να κανει σιγουρα με τη μνημη αλλιως δε γνωριζω. Ok, βρήκα λύση ευτυχώς. Τελικά είναι κάποια standard info που παράγονται από το σύστημα. Όλα καλά. Ευχαριστώ για την βοήθεια!
brute-force Δημοσ. 13 Οκτωβρίου 2014 Δημοσ. 13 Οκτωβρίου 2014 Μεγάλος πονοκέφαλος το MPI, κανάλια στη Go και άγιος ο Θεός.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα