Μετάβαση στο περιεχόμενο

Παράλληλη Επεξεργασία — Εξέταση Σεπτεμβρίου (χρονολογία άγνωστη, Ενότητες 1–4)

Μεταγραφή από τις φωτογραφίες του φακέλου Themata/For Disc/Εξέταση Σεπτεμβρίου. Σημείωση: οι φωτογραφίες είναι στιγμιότυπα πλατφόρμας εξέτασης που περιέχουν τις επιλεγμένες απαντήσεις φοιτητή, καθώς και χρονόμετρο και ενδείξεις πλοήγησης· οι απαντήσεις και τα στοιχεία της οθόνης δεν μεταγράφονται.

1.1.png

Ενότητα 1 (Γενικές ερωτήσεις)

Ερώτηση 1 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Αμοιβαίος αποκλεισμός απαιτείται όταν ένα νήμα:

  • [ ] Διαβάζει την τιμή μιας μεταβλητής που είναι τοπική για το νήμα
  • [ ] Μεταβάλλει την τιμή μιας διαμοιραζόμενης (global) μεταβλητής
  • [ ] Μεταβάλλει την τιμή μιας μεταβλητής που είναι τοπική για το νήμα
  • [ ] Κανένα από τα παραπάνω

2.1.png

Ενότητα 1 (Γενικές ερωτήσεις)

Ερώτηση 2 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Τα παράλληλα προγραμματιστικά μοντέλα αναιρούν ποια ιδιότητα του μοντέλου "Von Neumann":

  • [ ] Σειριακή εκτέλεση των εντολών εντός κάθε διεργασίας ή νήματος
  • [ ] Αποθήκευση προγράμματος και δεδομένων στην μνήμη
  • [ ] Τον συνδυασμό των a. και b.
  • [ ] Ντετερμινισμό εκτέλεσης προγράμματος

3.1.png

Ενότητα 1 (Γενικές ερωτήσεις)

Ερώτηση 3 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Οι ατομικές εντολές:

  • [ ] Επιτρέπουν σε ένα πρόγραμμα να αποκτήσει αποκλειστικό (ατομικό) έλεγχο στο υπολογιστικό σύστημα στο οποίο εκτελείται
  • [ ] Χρησιμοποιούνται για την εξατομίκευση επιλογών του χρήστη που εκτελεί το αντίστοιχο πρόγραμμα
  • [ ] Μεταβάλλουν την τιμή μόνο διαμοιραζόμενων (global) μεταβλητών ενός προγράμματος
  • [ ] Διαβάζουν από την μνήμη, τροποποιούν και γράφουν την νέα τιμή μιας μεταβλητής στην μνήμη χωρίς να μπορεί κανένα άλλο νήμα να προσπελάσει την μεταβλητή αυτή

4.1.png

Ενότητα 1 (Γενικές ερωτήσεις)

Ερώτηση 4 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Ποιο από τα παρακάτω παράλληλα προγραμματιστικά μοντέλα έχει σχεδιαστεί για συστήματα κατανεμημένης μνήμης;

  • [ ] OpenMP
  • [ ] POSIX Threads
  • [ ] MPI
  • [ ] Προγραμματισμός με κοινή μνήμη

5.1.png

Ενότητα 1 (Γενικές ερωτήσεις)

Ερώτηση 5 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Η διάσπαση των δεδομένων του προβλήματος προς επίλυση σε μικρότερα σύνολα με σκοπό των διαμοιρασμό τους στα επεξεργαστικά στοιχεία ενός παράλληλου υπολογιστικού συστήματος ονομάζεται:

  • [ ] Data decomposition
  • [ ] Domain decomposition
  • [ ] Functional decomposition
  • [ ] Procedural decomposition

6.1.png

Ενότητα 1 (Γενικές ερωτήσεις)

Ερώτηση 6 / 6 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Ποια από τις παρακάτω κατηγορίες δεν ανήκει στην ταξινόμηση υπολογιστικών συστημάτων που πρότεινε ο Michael J. Flynn;

  • [ ] SIMD
  • [ ] SISD
  • [ ] MIMD
  • [ ] Όλες οι παραπάνω κατηγορίες ανήκουν στην ταξινόμηση υπολογιστικών συστημάτων που πρότεινε ο Michael J. Flynn

1.1..png

Ενότητα 2 (POSIX Threads / OpenMP)

Ερώτηση 1 / 7 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Η οδηγία #pragma omp for του OpenMP:

  • [ ] Δημιουργεί ένα πλήθος νημάτων και διαμοιράζει τις επαναλήψεις του βρόχου for που ακολουθεί μεταξύ των νημάτων αυτών
  • [ ] Διαμοιράζει τις επαναλήψεις του βρόχου for που ακολουθεί μεταξύ νημάτων που έχουν δημιουργηθεί νωρίτερα μέσω της οδηγίας parallel
  • [ ] Συγκεντρώνει την εκτέλεση όλων των επαναλήψεων του βρόχου for που ακολουθεί σε ένα νήμα μιας παράλληλης περιοχής
  • [ ] Ολοκληρώνει την εκτέλεση μιας παράλληλης περιοχής ώστε να μπορέσει να εκτελεστεί σωστά ο βρόχος for που ακολουθεί

1.2.png

Ενότητα 2 (POSIX Threads / OpenMP)

Ερώτηση 2 / 7 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Μεταβλητές τύπου pthread_mutex_t χρησιμοποιούνται σε προγράμματα με POSIX Threads για:

  • [ ] Υλοποίηση ατομικών εντολών
  • [ ] Φράγματα
  • [ ] Συγχρονισμό
  • [ ] Αμοιβαίο αποκλεισμό

1.3.png

Ενότητα 2 (POSIX Threads / OpenMP)

Ερώτηση 3 / 7 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Έστω ένα πλήθος POSIX Threads, καθένα εκ των οποίων τροποποιεί μια κοινή (global) μεταβλητή. Για να είστε βέβαιοι πως η κοινή μεταβλητή θα περιέχει στο τέλος το σωστό αποτέλεσμα θα πρέπει στο πρόγραμμα σας να εισάγετε επιπλέον τουλάχιστον μια μεταβλητή τύπου:

  • [ ] pthread_barrier_t
  • [ ] pthread_mutexattr_t
  • [ ] pthread_mutex_t
  • [ ] pthread_t

1.4.png

Ενότητα 2 (POSIX Threads / OpenMP)

Ερώτηση 4 / 7 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Ένα παράλληλο πρόγραμμα OpenMP χρησιμοποιεί μια διπλά διασυνδεδεμένη λίστα. Για να υλοποιήσετε μια λειτουργία εισαγωγής νέου στοιχείου στην λίστα θα χρησιμοποιήσετε:

  • [ ] Την οδηγία #pragma omp atomic
  • [ ] Την οδηγία #pragma omp critical
  • [ ] Την οδηγία #pragma omp flush
  • [ ] Την οδηγία #pragma omp reduction

1.5.png

Ενότητα 2 (POSIX Threads / OpenMP)

Ερώτηση 5 / 7 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Ποιο από τα παρακάτω δεν είναι τμήμα του προγραμματιστικού μοντέλου OpenMP;

  • [ ] Μεταγλωττιστής
  • [ ] Οδηγίες προς τον μεταγλωττιστή
  • [ ] Βιβλιοθήκη χρόνου εκτέλεσης
  • [ ] Μεταβλητές συστήματος

1.6.png

Ενότητα 2 (POSIX Threads / OpenMP)

Ερώτηση 6 / 7 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Μια υλοποίηση του προτύπου των POSIX Threads επιτρέπεται να υλοποιήσει τα νήματα:

  • [ ] Μόνο ως νήματα επιπέδου πυρήνα
  • [ ] Μόνο ως νήματα επιπέδου χρήστη
  • [ ] Είτε ως νήματα επιπέδου χρήστη είτε ως νήματα επιπέδου πυρήνα
  • [ ] Μόνο ως έργα (tasks)

1.7.png

Ενότητα 2 (POSIX Threads / OpenMP)

Ερώτηση 7 / 7 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Η οδηγία #pragma omp parallel του OpenMP:

  • [ ] Δημιουργεί ένα πλήθος νημάτων και διαμοιράζει τον φόρτο εργασίας μεταξύ των νημάτων αυτών
  • [ ] Δημιουργεί ένα πλήθος νημάτων, τα οποία όλα εκτελούν τον κώδικα της παράλληλης περιοχής
  • [ ] Δημιουργεί ένα πλήθος νημάτων εκ των οποίων ένα μόνο ξεκινάει την εκτέλεση του κώδικα της παράλληλης περιοχής
  • [ ] Δημιουργεί το αρχικό νήμα της παράλληλης περιοχής

1.1...png

Ενότητα 3 (MPI)

Ερώτηση 1 / 5 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Η συνάρτηση MPI_Send():

  • [ ] Αποστέλλει δεδομένα από μια διεργασία MPI σε όλες τις διεργασίες του προγράμματος MPI
  • [ ] Αποστέλλει δεδομένα από μια διεργασία MPI σε όλες τις διεργασίες ενός επικοινωνητή (communicator) του προγράμματος MPI
  • [ ] Αποστέλλει δεδομένα από μια διεργασία MPI σε μια άλλη διεργασία MPI
  • [ ] Αποστέλλει δεδομένα από μια διεργασία MPI στην ίδια διεργασία, αλλά προς άλλη εικονική μνήμη της διεργασίας

2.png

Ενότητα 3 (MPI)

Ερώτηση 2 / 5 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Η συνάρτηση MPI_Recv():

  • [ ] Παραλαμβάνει δεδομένα για μια διεργασία MPI από όλες τις άλλες διεργασίες του προγράμματος MPI
  • [ ] Παραλαμβάνει δεδομένα για μια διεργασία MPI από όλες τις διεργασίες ενός επικοινωνητή (communicator) του προγράμματος MPI
  • [ ] Παραλαμβάνει δεδομένα για μια διεργασία MPI που έχει αποστείλει η ίδια διεργασία και αποθηκεύει τα δεδομένα σε άλλη εικονική μνήμη της διεργασίας
  • [ ] Παραλαμβάνει δεδομένα για μια διεργασία MPI που έχουν αποσταλεί από μια άλλη διεργασία του προγράμματος MPI

3.png

Ενότητα 3 (MPI)

Ερώτηση 3 / 5 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Ο επικοινωνητής (communicator) είναι:

  • [ ] Ένα σύνολο διεργασιών του προγράμματος MPI, οι οποίες μπορούν να επικοινωνήσουν μεταξύ τους μέσω συναρτήσεων συλλογικής επικοινωνίας
  • [ ] Μια ειδική διεργασία του MPI που αναλαμβάνει να διεκπεραιώσει όλες τις λειτουργίες ανταλλαγής δεδομένων μεταξύ διεργασιών του προγράμματος MPI
  • [ ] Ένα νήμα σε κάθε διεργασία MPI που παραλαμβάνει τα δεδομένα που αποστέλλονται από άλλες διεργασίες προς αυτήν
  • [ ] Ανάλογα με το πλαίσιο στο οποίο αναφερόμαστε, μπορεί να είναι οποιοδήποτε από τα παραπάνω

4.png

Ενότητα 3 (MPI)

Ερώτηση 4 / 5 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Η συνάρτηση MPI_Reduce():

  • [ ] Παραλαμβάνει δεδομένα για μια διεργασία MPI από όλες τις διεργασίες ενός επικοινωνητή (communicator) του προγράμματος MPI και εκτελεί μια πράξη μεταξύ όλων των δεδομένων
  • [ ] Παραλαμβάνει δεδομένα για μια διεργασία MPI από όλες τις άλλες διεργασίες του προγράμματος MPI και εκτελεί μια πράξη μεταξύ όλων των δεδομένων
  • [ ] Παραλαμβάνει δεδομένα για μια διεργασία MPI που έχει αποστείλει η ίδια διεργασία και αποθηκεύει τα δεδομένα σε άλλη εικονική μνήμη της διεργασίας
  • [ ] Παραλαμβάνει δεδομένα για μια διεργασία MPI από μια άλλη διεργασία του προγράμματος MPI

5.png

Ενότητα 3 (MPI)

Ερώτηση 5 / 5 (Πολλαπλής Επιλογής (Μοναδική Απάντηση) — 0.40 βαθμοί)

Το παράλληλο προγραμματιστικό μοντέλο MPI ακολουθεί το μοντέλο εκτέλεσης:

  • [ ] Single Instruction Multiple Data (SIMD)
  • [ ] Multiple Instructions Multiple Data (MIMD)
  • [ ] Single Program Multiple Data (SPMD)
  • [ ] Multiple Programs Multiple Data (MPMD)

Άσκηση 4.png

Ενότητα 4 (Προγραμματισμός με OpenMP)

Ερώτηση 1 / 1 (Ελεύθερου Κειμένου — 2 βαθμοί)

Θεωρήστε μια εφαρμογή που χρησιμοποιεί ένα δυαδικό δέντρο για την οργάνωση των δεδομένων της.

  • Η δομή που περιγράφει κάθε κόμβο του δέντρου είναι η παρακάτω:
struct node {
    struct node  *left;  /* Δείχνει στο αριστερό παιδί. NULL αν δεν υπάρχει αριστερό παιδί. */
    struct node  *right; /* Δείχνει στο δεξί παιδί. NULL αν δεν υπάρχει δεξί παιδί.       */
    /*
     * Ακολουθούν τα υπόλοιπα πεδία της δομής στα οποία αποθηκεύονται δεδομένα και
     * τα οποία για λόγους συντομίας δεν αναφέρονται εδώ.
     */
};
  • Η εφαρμογή υλοποιεί μια συνάρτηση ‘struct node *create_and_init_tree()’, η οποία όταν καλείται δημιουργεί ένα δέντρο και αρχικοποιεί κατάλληλα τα πεδία κάθε κόμβου. Επιστρέφει δε έναν δείκτη στην ρίζα του δέντρου.
  • Η συνάρτηση ‘main()’ (στην οποία θα πρέπει να συμπληρώσετε κώδικα στην συνέχεια), περιλαμβάνει μια κλήση στην συνάρτηση ‘create_and_init_tree()’, ενώ έχει ορισμένη και μια μεταβλητή τύπου ‘int’, όπως παρακάτω:
int main() {
    int          numberOfNodes;
    struct node  *root = create_and_init_tree();

    /*
     * Εδώ θα πρέπει στην συνέχεια να συμπληρώσετε κώδικα.
     */
}

Υλοποιείστε μια συνάρτηση ‘count()’, η οποία θα δέχεται μόνο μια παράμετρο, και χρησιμοποιώντας Έργα (Tasks) του μοντέλου OpenMP θα διατρέχει με παράλληλο τρόπο το δέντρο και θα μετράει από πόσους κόμβους αποτελείται το δέντρο. Επιπλέον, συμπληρώστε τον κώδικα που απαιτείται στην συνάρτηση ‘main()’ ώστε να εκκινήσετε την όλη διαδικασία παράλληλης καταμέτρησης. Θα πρέπει να λάβετε υπόψη σας τους παρακάτω περιορισμούς και να απαντήσετε στα παρακάτω ερωτήματα:

  • Ποιου τύπου δεδομένων θα πρέπει να είναι η μοναδική παράμετρος της ‘count()’;
  • Τι τύπου δεδομένων θα πρέπει να είναι το αποτέλεσμα που επιστρέφει η ‘count()’, αν θεωρήσετε πως πρέπει να επιστρέφει κάποιο αποτέλεσμα; Ορίστε κατάλληλα την συνάρτηση χρησιμοποιώντας της απαντήσεις σας σε αυτό και το προηγούμενο ερώτημα.
  • Το τελικό αποτέλεσμα (το συνολικό πλήθος κόμβων) θα πρέπει θα πρέπει στο τέλος του προγράμματος να είναι αποθηκευμένο στην τοπική μεταβλητή ‘numberOfNodes’ της συνάρτησης ‘main()’.
  • Δεν επιτρέπεται να ορίσετε άλλες τοπικές μεταβλητές στην συνάρτηση ‘main()’ και δεν επιτρέπεται να ορίσετε καθολικές μεταβλητές.

[Λείπει από τη φωτογραφία: το τέλος της σελίδας μετά την τελευταία υποπαράγραφο της Άσκησης 4· η φωτογραφία κόβεται στο κάτω άκρο]

Λύσεις (⚪ AI, μη επαληθευμένο)

Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (antigravity-gemini, deepseek-flash), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο

Προσοχή

Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.

AI λύσεις — 2021-b

Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.

Θέμα 1.1.png — Ενότητα 1, Ερώτηση 1/6

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 2η — «Μεταβάλλει την τιμή μιας διαμοιραζόμενης (global) μεταβλητής».
Αιτιολόγηση: Όταν πολλά νήματα γράφουν/τροποποιούν ταυτόχρονα μια κοινή μεταβλητή, υπάρχει κίνδυνος συνθήκης ανταγωνισμού· απαιτείται αμοιβαίος αποκλεισμός (π.χ. mutex/critical/atomic).

Θέμα 2.1.png — Ενότητα 1, Ερώτηση 2/6

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 4η — «Ντετερμινισμό εκτέλεσης προγράμματος».
Αιτιολόγηση: Η παράλληλη εκτέλεση εισάγει μη ντετερμινιστικές παρεμβολές/χρονοπρογραμματισμό νημάτων, ενώ η σειριακή εκτέλεση εντολών εντός κάθε νήματος διατηρείται.

Θέμα 3.1.png — Ενότητα 1, Ερώτηση 3/6

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 4η — «Διαβάζουν από την μνήμη, τροποποιούν και γράφουν την νέα τιμή ... χωρίς να μπορεί κανένα άλλο νήμα να προσπελάσει την μεταβλητή αυτή».
Αιτιολόγηση: Αυτός είναι ο ορισμός της ατομικής (atomic) εντολής/πράξης.

Θέμα 4.1.png — Ενότητα 1, Ερώτηση 4/6

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 3η — MPI.
Αιτιολόγηση: Το MPI είναι μοντέλο μηνυμάτων για συστήματα κατανεμημένης μνήμης· τα OpenMP/POSIX Threads βασίζονται σε κοινή μνήμη.

Θέμα 5.1.png — Ενότητα 1, Ερώτηση 5/6

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 1η — Data decomposition.
Αιτιολόγηση: Η διάσπαση των δεδομένων του προβλήματος σε μικρότερα σύνολα και ο διαμοιρασμός τους στα επεξεργαστικά στοιχεία ονομάζεται data decomposition.

Θέμα 6.1.png — Ενότητα 1, Ερώτηση 6/6

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 4η — «Όλες οι παραπάνω κατηγορίες ανήκουν στην ταξινόμηση ... Flynn».
Αιτιολόγηση: Οι κατηγορίες Flynn είναι SISD, SIMD, MISD, MIMD· άρα SIMD, SISD και MIMD ανήκουν όλες.

Θέμα 1.1..png — Ενότητα 2, Ερώτηση 1/7

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 2η — «Διαμοιράζει τις επαναλήψεις του βρόχου for ... μεταξύ νημάτων που έχουν δημιουργηθεί νωρίτερα μέσω της οδηγίας parallel».
Αιτιολόγηση: Το #pragma omp for είναι worksharing construct· δεν δημιουργεί νήματα, αλλά μοιράζει επαναλήψεις στα υπάρχοντα νήματα της παράλληλης περιοχής.

Θέμα 1.2.png — Ενότητα 2, Ερώτηση 2/7

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 4η — Αμοιβαίο αποκλεισμό.
Αιτιολόγηση: Οι μεταβλητές pthread_mutex_t είναι mutexes και χρησιμοποιούνται για αμοιβαίο αποκλεισμό κρίσιμων τμημάτων.

Θέμα 1.3.png — Ενότητα 2, Ερώτηση 3/7

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 3η — pthread_mutex_t.
Αιτιολόγηση: Για σωστή ταυτόχρονη τροποποίηση κοινής μεταβλητής από πολλά POSIX Threads απαιτείται mutex (ή αντίστοιχος μηχανισμός ατομικότητας).

Θέμα 1.4.png — Ενότητα 2, Ερώτηση 4/7

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 2η — #pragma omp critical.
Αιτιολόγηση: Η εισαγωγή σε διπλά διασυνδεδεμένη λίστα ενημερώνει πολλούς δείκτες· απαιτείται κρίσιμο τμήμα, όχι απλή ατομική πράξη.

Θέμα 1.5.png — Ενότητα 2, Ερώτηση 5/7

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 1η — Μεταγλωττιστής.
Αιτιολόγηση: Το μοντέλο OpenMP περιλαμβάνει οδηγίες προς τον μεταγλωττιστή, βιβλιοθήκη χρόνου εκτέλεσης και μεταβλητές περιβάλλοντος· ο ίδιος ο μεταγλωττιστής δεν είναι συστατικό του μοντέλου.

Θέμα 1.6.png — Ενότητα 2, Ερώτηση 6/7

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 3η — «Είτε ως νήματα επιπέδου χρήστη είτε ως νήματα επιπέδου πυρήνα».
Αιτιολόγηση: Το πρότυπο POSIX Threads δεν επιβάλλει συγκεκριμένη υλοποίηση· επιτρέπει user-level, kernel-level ή υβριδική υλοποίηση.

Θέμα 1.7.png — Ενότητα 2, Ερώτηση 7/7

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 2η — «Δημιουργεί ένα πλήθος νημάτων, τα οποία όλα εκτελούν τον κώδικα της παράλληλης περιοχής».
Αιτιολόγηση: Το #pragma omp parallel δημιουργεί ομάδα νημάτων· κάθε νήμα εκτελεί το ίδιο structured block. Ο διαμοιρασμός φόρτου γίνεται με άλλα constructs, π.χ. omp for.

Θέμα 1.1...png — Ενότητα 3, Ερώτηση 1/5

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 3η — «Αποστέλλει δεδομένα από μια διεργασία MPI σε μια άλλη διεργασία MPI».
Αιτιολόγηση: Η MPI_Send() είναι point-to-point αποστολή, όχι broadcast ή συλλογική επικοινωνία.

Θέμα 2.png — Ενότητα 3, Ερώτηση 2/5

Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 4η — «Παραλαμβάνει δεδομένα για μια διεργασία MPI που έχουν αποσταλεί από μια άλλη διεργασία του προγράμματος MPI».
Αιτιολόγηση: Η MPI_Recv() λαμβάνει μήνυμα point-to-point από συγκεκριμένη/αναμενόμενη πηγή.

Θέμα 3.png — Ενότητα 3, Ερώτηση 3/5

Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 1η — «Ένα σύνολο διεργασιών του προγράμματος MPI, οι οποίες μπορούν να επικοινωνήσουν μεταξύ τους μέσω συναρτήσεων συλλογικής επικοινωνίας».
Αιτιολόγηση: Ο communicator ορίζει ομάδα διεργασιών και context επικοινωνίας· δεν είναι ειδική διεργασία ή νήμα.

Θέμα 4.png — Ενότητα 3, Ερώτηση 4/5

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 1η — «Παραλαμβάνει δεδομένα για μια διεργασία MPI από όλες τις διεργασίες ενός επικοινωνητή και εκτελεί μια πράξη μεταξύ όλων των δεδομένων».
Αιτιολόγηση: Η MPI_Reduce() είναι συλλογική πράξη αναγωγής πάνω στα δεδομένα των διεργασιών του communicator, με αποτέλεσμα συνήθως στη ρίζα.

Θέμα 5.png — Ενότητα 3, Ερώτηση 5/5

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: 3η — Single Program Multiple Data (SPMD).
Αιτιολόγηση: Στο MPI συνήθως εκτελείται το ίδιο πρόγραμμα από πολλές διεργασίες, καθεμία με διαφορετικά δεδομένα/rank· αυτό είναι το μοντέλο SPMD.

Θέμα Άσκηση 4.png — Ενότητα 4, Ερώτηση 1/1

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή

Η μοναδική παράμετρος της count() πρέπει να είναι δείκτης σε κόμβο δέντρου, δηλαδή struct node *p (στη main() καλείται με το root). Το αποτέλεσμα της count() πρέπει να είναι int, ώστε να είναι συμβατό με τη μεταβλητή numberOfNodes της main().

Ενδεικτική υλοποίηση:

int count(struct node *p)
{
    if (p == NULL)
        return 0;

    int left_count = 0, right_count = 0;

    #pragma omp taskgroup
    {
        #pragma omp task shared(left_count) firstprivate(p)
        {
            left_count = count(p->left);
        }

        #pragma omp task shared(right_count) firstprivate(p)
        {
            right_count = count(p->right);
        }
    }

    return 1 + left_count + right_count;
}

int main(void)
{
    int numberOfNodes;
    struct node *root = create_and_init_tree();

    #pragma omp parallel
    {
        #pragma omp single
        numberOfNodes = count(root);
    }

    return 0;
}

Αιτιολόγηση: Η count() δημιουργεί δύο tasks, ένα για το αριστερό και ένα για το δεξί υποδέντρο. Το taskgroup εξασφαλίζει ότι όλα τα αναδρομικά tasks ολοκληρώνονται πριν γίνει η πρόσθεση και η επιστροφή του αποτελέσματος. Η κλήση γίνεται μέσα σε ενεργή παράλληλη περιοχή (#pragma omp parallel) και ξεκινά από ένα μόνο νήμα (#pragma omp single). Έτσι το τελικό πλήθος αποθηκεύεται στη μοναδική τοπική μεταβλητή numberOfNodes της main(), χωρίς επιπλέον τοπικές μεταβλητές στη main() και χωρίς καθολικές μεταβλητές.

✔ Επιβεβαίωσε · ✖ Βρήκα λάθος


✖ Βρήκα λάθος στη μεταγραφή