Linux Inside
77
το Use Default Information. Επιλέγουμε ως Include path το
/mirror/mpiuser/mpich2-install/include, ως Library name το
mpich και ως Library search path το /mirror/mpiuser/mpich2-
install/lib. Θα πρέπει στο MPI compile command να ορίσουμε
το mpicc -fopenmp και στο MPI link command το mpicc
–fopenmp, ώστε να μπορεί το MPI να μεταγλωττίσει τον κώδι-
κα OpenMP και να παράγει το αντίστοιχο εκτελέσιμο. Πατάμε
Next, μετά Finish και το έργο λογισμικού είναι έτοιμο να δε-
χθεί τον κώδικα. Κάνουμε δεξί κλικ πάνω στο όνομα του έρ-
γου στην Όψη Project Explorer και επιλέγουμε New > Source
Folder στο τοπικό μενού. Δίνουμε όνομα src στο φάκελο και
πατάμε Finish. Κάνουμε δεξί κλικ πάνω στο φάκελο src και
επιλέγουμε New, Source File από το τοπικό μενού. Δίνουμε
όνομα MPIOpenMP-pi.c στο νέο αρχείο κώδικα και πατάμε
Finish. Στο συντάκτη που ανοίγει γράφουμε τον ακόλουθο κώ-
δικα [4]:
#include <stdio.h>
#include “mpi.h”
#include <omp.h>
/* ορισμός μέγιστου πλήθους διαστημάτων υπολογισμού
*/
#define NBIN 100000
/* ορισμός μέγιστου πλήθους νημάτων */
#define MAX_THREADS 8
int main(int argc,char **argv) {
int rank; /*....................... ταυτότητα διεργασίας */
int nbin; /*....................... πλήθος διαστημάτων
υπολογισμού */
int nproc; /*...................... πλήθος διεργασιών */
int nthreads; /*................... πλήθος νημάτων */
int tid; /*........................ ταυτότητα νήματος */
double step; /*.................... βήμα υπολογισμού */
double sum[MAX_THREADS] = {0.0}; /* διάνυσμα
επιμέρους αθροισμάτων */
double pi = 0.0; /*................ επιμέρους τιμή π διεργασίας
*/
double pig; /*..................... συγκεντρωτική τιμή του π */
/* εκκίνηση του MPI */
/* παράμετροι: λήψη παραμέτρων από το περιβάλλον
κλήσης */
MPI_Init(&argc, &argv);
/* εύρεση της ταυτότητας διεργασίας */
/* παράμετροι: περιβάλλον MPI, ταυτότητα διεργασίας */
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
/* εύρεση αριθμού διεργασιών */
/* παράμετροι: περιβάλλον MPI, πλήθος διεργασιών */
MPI_Comm_size(MPI_COMM_WORLD, &nproc);
/* υπολογισμός του πλήθους διαστημάτων
υπολογισμού με βάση το πλήθος διεργασιών */
nbin = NBIN / nproc;
/* υπολογισμός του βήματος υπολογισμού */
step = 1.0 / (nbin * nproc);
/* ορισμός του αριθμού νημάτων */
omp_set_num_threads(4);
#pragma omp parallel private(tid) /* αρχή παράλληλου
κώδικα νήματος */
{
int i; /* μετρητής */
double x; /* η εκάστοτε τιμή του χ */
/* εύρεση πλήθους νημάτων */
nthreads = omp_get_num_threads();
/* εύρεση ταυτότητας νήματος */
tid = omp_get_thread_num();
/* υλοποίηση επιμέρους υπολογισμών νήματος */
for (i = nbin * rank + tid; i < nbin * (rank + 1); i +=
nthreads) {
/* υπολογισμός του χ για κάθε διάστημα */
x = (i + 0.5) * step;
/* υπολογισμός επιμέρους αθροίσματος κάθε
διαστήματος */
sum[tid] += 4.0 / (1.0 + x * x);
}
/* εμφάνιση επιμέρους αποτελεσμάτων νήματος
*/
printf(“Διεργασία=%d, νήμα=%d, επιμέρους
άθροισμα=%e.\n”, rank, tid, sum[tid]);
} /* τέλος παράλληλου κώδικα νήματος */
/* υπολογισμός επιμέρους τιμής του π για τη διεργασία
*/
for (tid=0; tid<nthreads; tid++)
pi += sum[tid] * step;
/* άθροιση των επιμέρους τιμών του π από όλες τις
διεργασίες σε μία τελική */
MPI_Allreduce(&pi,&pig,1,MPI_DOUBLE,MPI_SUM,MPI_
COMM_WORLD);
/* εμφάνιση του αποτελέσματος μόνο από τη
διεργασία-συντονιστή */
if (rank==0)
printf(“π = %0.10f\n”,pig);
/* τερματισμός του MPI */
MPI_Finalize();
/* επιστροφή κωδικού επιτυχούς εκτέλεσης στο
περιβάλλον κλήσης */
return 0;
}
Μετά τη μεταγλώττιση και την παραγωγή του εκτελέσιμου
κώδικα (πατώντας Ctrl+B), και εφόσον εκτελείται ο διαχειρι-
στής εργασιών του MPI και ο Διαχειριστής Πόρων του Eclipse
PTP (όπως περιγράφηκε παραπάνω), η εκτέλεση γίνεται ακο-
λουθώντας τα ίδια βήματα με αυτά που απαιτούνται για την
εκτέλεση κώδικα MPI. Στο μενού Run επιλέγουμε Run
Configurations, κάνουμε διπλό κλικ στο Parallel Application
και ορίζουμε τέσσερις διεργασίες. Στην καρτέλα Application
του ίδιου διαλόγου εντοπίζουμε με το πλήκτρο Browse τη θέ-
ση του Application Program στη θέση
/mirror/mpiuser/workspace/MPIOpenMP-
pi/Debug/MPIOpenMP-pi και πατάμε το Run. Τα αποτελέσμα-
τα εμφανίζονται στην Όψη Console.
•
Linux Labs – Εclipse + PTP
Σύνδεσμοι:
[1] Ιστότοπος του Eclipse PTP:
http://www.eclipse.org/ptp
[2] Εγκατάσταση Java σε Ubuntu:
https://help.ubuntu.com/community/Java
[3] Ιστότοπος λήψεων του Eclipse:
http://www.eclipse.org/downloads/
[4] Κώδικας από το μάθημα «Scientific Computing and Visualization»
του Καθηγητή Aiichiro Nakano του University of Southern
California: http://cacs.usc.edu/education/cs596/06HMD.pdf