Παράλληλη Επεξεργασία — Ιούλιος 2024 — ηλεκτρονική εξέταση και Θέματα 2–4¶
Μεταγραφή από τα IMG_0792, 168.png, file-2L7M4OnDrI5vh4P02UaVbsLd, IMG_20240702_190235, 53313733 και Screenshot_16 (Ιούλιος 2024).
IMG_0792.jpeg¶
Ερώτηση 2 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)
Ενότητα 2 (POSIX Threads / OpenMP)
Η αξιοποίηση έργων (tasks) στο OpenMP:
- [ ] Επιτρέπει τον υπολογισμό μεγαλύτερου όγκου έργου σε δοθέν υπολογιστικό σύστημα
- [ ] Δεν προσφέρει επιπλέον λειτουργία σε σχέση με την χρήση μόνο νημάτων
- [ ] Επιτρέπει την ευκολότερη έκφραση μεγαλύτερου εύρους αλγορίθμων με χρήση παραλληλίας
- [ ] Όλα τα παραπάνω
Σημείωση: η φωτογραφία περιέχει χειρόγραφες απαντήσεις φοιτητή.
168.png¶
9)Ατομικές εντολές μπορούμε να χρησιμοποιήσουμε:
Ερώτηση 6 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)
Ενότητα 1 (Γενικές ερωτήσεις) Ατομικές εντολές μπορούμε να χρησιμοποιήσουμε:
- [ ] a. Απευθείας σε μεταβλητές
- [ ] b. Για την υλοποίηση πιο σύνθετων δομών αμοιβαίου αποκλεισμού και συγχρονισμού
- [ ] Για το a. και το b.
- [ ] Ούτε το a. ούτε το b.
Σημείωση: η φωτογραφία περιέχει χειρόγραφες απαντήσεις φοιτητή.
file-2L7M4OnDrI5vh4P02UaVbsLd.png¶
Θέμα 2º (3 μονάδες)
Η παρακάτω συνάρτηση υπολογίζει και εκτυπώνει το μέγιστο στοιχείο ενός διανύσματος αλλά και τη θέση αυτού. Παραλληλοποιήστε τη συνάρτηση με χρήση του μοντέλου OpenMP. Περιγράψτε και αιτιολογήστε τη λύση σας.
void find_max_and_pos(int *A, int N) {
int max_val = A[0];
int max_pos = 0;
for (int i=1; i<N; i++) {
if (A[i] > max_val) {
max_val = A[i];
max_pos = i;
}
}
print("max value = %d at position %d\n", max_val, max_pos);
}
Σχετικές οδηγίες του OpenMP:
#pragma omp parallel
#pragma omp for
#pragma omp critical
IMG_20240702_190235.jpg¶
Τμήμα Μηχ. Η/Υ και Πληροφορικής, Πανεπιστήμιο Πατρών
Θέμα 3ο (3 μονάδες)
Ο παρακάτω κώδικας υπολογίζει το γινόμενο \(y=A*x\), όπου A μητρώο διάστασης NxN και x, y διανύσματα διάστασης \(N\), και εκτελείται σε ένα παράλληλο σύστημα κοινής μνήμης με 8 επεξεργαστικούς πυρήνες.
α. Εξηγήστε την παραλληλοποίηση του κώδικα και πόσα νήματα είναι ενεργά κατά την εκτέλεσή του.
β. Αναφέρετε πιθανά προβλήματα στον κώδικα.
γ. Τροποποιήστε τον κώδικα ώστε να τα λύσετε και αιτιολογήστε συνοπτικά τη λύση σας.
void matvec(double A[N][N], double x[N], double y[N], int N)
{
int i, j;
omp_set_nested(1);
omp_set_num_threads(8);
#pragma omp parallel for
for (i=0; i[δυσανάγνωστο]N; i++)
{
y[i] = 0.0;
#pragma omp parallel for
for (j=0; j[δυσανάγνωστο]N; j++)
{
y[i] += A[i][j] * x[j];
}
}
}
Σημείωση: ο τελεστής σύγκρισης στις δύο εντολές for δεν διακρίνεται καθαρά στη φωτογραφία.
Θέμα 4ο (2 μονάδες)
Ο παρακάτω σειριακός κώδικας αρχικοποιεί το διάνυσμα A διάστασης N και μετά υπολογίζει την ελάχιστη τιμή του. Θεωρείστε ότι η διάσταση N μπορεί να είναι αυθαίρετα μεγάλη.
Παραλληλοποιήστε τον κώδικα με χρήση του μοντέλου MPI.
/* Κώδικας */
#include <stdio.h> // printf
#include <math.h> // sqrt
#include <stdlib.h> // malloc
#define N (1024*1024)
extern float initialize(int i); // υλοποιημένη κάπου αλλού
int main (int argc, char **argv)
{
float *A;
A = (float *)malloc(N*sizeof(double));
for (int i = 0; i [δυσανάγνωστο] N; i++) A[i] = initialize(i);
float m = 1e10;
for (int i = 0; i [δυσανάγνωστο] N; i++)
if (A[i] [δυσανάγνωστο] m) m = A[i];
printf("min value=%f\n", m);
free(A);
return 0;
}
/* Βοηθητικά στοιχεία του MPI */
int MPI_Init(int *argc, char ***argv);
int MPI_Finalize();
int MPI_Comm_size(MPI_Comm comm, int *size);
int MPI_Comm_rank(MPI_Comm comm, int *rank);
int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status);
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm);
int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm);
int MPI_Allreduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
Constants: MPI_COMM_WORLD
Elementary Datatypes: MPI_CHAR, MPI_SHORT, MPI_INT, [δυσανάγνωστο], MPI_FLOAT, MPI_DOUBLE, [δυσανάγνωστο]
Reduction Operations: MPI_MAX, MPI_MIN, MPI_SUM, [δυσανάγνωστο]
Καλή επιτυχία!
53313733-82cf-42ce-b44c-4f017e5937dd.png¶
[Λείπει από τη φωτογραφία: η εκφώνηση πάνω από τον κώδικα· στο πάνω δεξιά άκρο υπάρχει κομμένη ένδειξη βαθμολογίας «[1,5]»]
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv)
{
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
double data=(double)rank;
double total=0.;
MPI_Bcast(&data, 1, MPI_DOUBLE, 2, MPI_COMM_WORLD);
MPI_Allreduce(&data, &total, 1, MPI_DOUBLE, MPI_PROD, MPI_COMM_WORLD);
if (rank == 1) printf("%lf\n", total);
MPI_Finalize();
return 0;
}
a. Τι τιμή εκτυπώνει ο παραπάνω κώδικας όταν εκτελεστεί με 4 διεργασίες (mpirun -n 4
b. Αιτιολογήστε την απάντησή σας.
[Σημείωση μεταγραφέα: στο αριστερό περιθώριο, δίπλα στη γραμμή του if, υπάρχει αχνή ένδειξη «[0,5]»· ενδέχεται να ανήκει σε άλλο ερώτημα της σελίδας.]
Screenshot_16.png¶
Θέμα 4º (1,5 μονάδες)
Δίνεται ο παρακάτω κώδικας MPI:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv)
{
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
double total = 0.0;
double local = rank+1.0;
MPI_Reduce(&local, &total, 1, MPI_DOUBLE, MPI_PROD, 0, MPI_COMM_WORLD);
if (rank == 0) printf("%lf\n", total);
MPI_Finalize();
return 0;
}
Σημείωση μεταγραφής: η λέξη MPI_PROD είναι με έντονη γραφή στο πρωτότυπο.
Τι τιμή εκτυπώνει ο παραπάνω κώδικας όταν εκτελεστεί με 5 διεργασίες (mpirun -n 5
Λύσεις (🟡 community)
Κατάσταση: 🟡 community Πηγή: χειρόγραφη λύση φοιτητή (φωτογραφία 168.png)
Προσοχή
Ο φοιτητής γράφει πρώτα «Ίσως β» και καταλήγει στο α· η τελική απάντηση α δεν έχει επιβεβαιωθεί.
Λύσεις — Παράλληλη Επεξεργασία — Ιούλιος 2024¶
168.png¶
9)Ατομικές εντολές μπορούμε να χρησιμοποιήσουμε:
Ερώτηση 6 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)
Ενότητα 1 (Γενικές ερωτήσεις) Ατομικές εντολές μπορούμε να χρησιμοποιήσουμε:
- [ ] a. Απευθείας σε μεταβλητές
- [ ] b. Για την υλοποίηση πιο σύνθετων δομών αμοιβαίου αποκλεισμού και συγχρονισμού
- [ ] Για το a. και το b.
- [ ] Ούτε το a. ούτε το b.
Ίσως β
Δε μπορούμε να χρησιμοποιήσουμε ατομικές εντολές για σύνθετες δομές αμοιβαίου αποκλεισμού γιατί οι ατομικές εντολές εκτελούνται σε επίπεδο καταχωρητή αποκλείοντας την πρόσβαση στον καταχωρητή που έχει αποθηκευμένη τη μεταβλητή. Συνεπώς το α.