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

Παράλληλη Επεξεργασία — Εξέταση Φεβρουαρίου, σειρά Β (Ενότητα 2, 7 ερωτήσεις)

Μεταγραφή από τις φωτογραφίες ερωτήσεων 1–7 της Ενότητας 2 (σειρά Β).

Σημείωση: η φωτογραφία περιέχει απαντήσεις φοιτητή (επιλεγμένες επιλογές και σήμανση ✔)· δεν μεταγράφονται.

unknown (17).png

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

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

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

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

unknown (18).png

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

Ενότητα 2 (POSIX Threads / OpenMP) Μεταβλητές τύπου pthread_mutex_t χρησιμοποιούνται σε προγράμματα με POSIX Threads για:

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

unknown (19).png

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

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

Ένα πλήθος νημάτων POSIX εκτελεί την παρακάτω συνάρτηση func(). Η ακέραια (int) μεταβλητή s, το διάνυσμα ακεραίων (int) A και η μεταβλητή κλειδώματος mutex είναι κοινές (global) μεταβλητές. Ποια λειτουργία επιτελείται επί της μεταβλητής s;

void *func(void *arg)
{
  int local_s = 0, i;
  int start = …;
  int end = …;

  for (i = start; i < end; i++) {
    local_s += A[i];
  }

  pthread_mutex_lock(&mutex);
  s += local_s;
  pthread_mutex_unlock(&mutex);
}
  • [ ] Broadcast
  • [ ] Reduction
  • [ ] Gather
  • [ ] Gatherv

unknown (20).png

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

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

Στην παρακάτω παράλληλη περιοχή θεωρείστε πως όλες οι μεταβλητές περιέχουν ακεραίους (int).

#pragma omp parallel private(local_a, i, start, end) shared(a, B)
{
  local_a = 1;
  start = …;
  end = …;

  for (i = start; i < end; i++) {
    local_a *= B[i];
  }

  #pragma omp critical
  a *= local_a;
}

Ποια λειτουργία επιτελείται επί της μεταβλητής a;

  • [ ] Gatherv
  • [ ] Broadcast
  • [ ] Gather
  • [ ] Reduction

unknown (21).png

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

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

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

  • [ ] fork-connect
  • [ ] disjoin-join
  • [ ] disjoin-connect
  • [ ] fork-join

unknown (22).png

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

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

Ποιο clause πρέπει να προσθέσουμε στην οδηγία parallel στον παρακάτω κώδικα ώστε η τιμή της τοπικής μεταβλητής N να έχει τιμή 1000 σε όλα τα νήματα της παράλληλης περιοχής;

int N = 1000;

#pragma omp parallel ΕΠΙΛΕΞΤΕ ΤΟ ΣΩΣΤΟ CLAUSE ΠΟΥ ΠΡΕΠΕΙ ΝΑ ΒΑΛΕΤΕ ΕΔΩ
  • [ ] firstprivate(N)
  • [ ] private(N)
  • [ ] lastprivate(N)
  • [ ] num_threads(N)

unknown (23).png

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

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

Ο παρακάτω κώδικας τι πρόβλημα παρουσιάζει ως προς την παράλληλη εκτέλεση του σε ένα υπολογιστικό σύστημα που έχει 8 πυρήνες; Θεωρείστε πως η συνάρτηση thread_func() είναι ορισμένη στο πρόγραμμα και σωστή.

pthread_t tid[10];
int i;

for (i = 0; i < 10; i++) {
  pthread_create(&tid[i], NULL, thread_func, NULL);
  pthread_join(tid[i], NULL);
}
  • [ ] Τα νήματα που δημιουργούνται δεν εκτελούνται ταυτόχρονα, ακόμα και αν κανένας πυρήνας δεν χρησιμοποιείται από άλλο πρόγραμμα
  • [ ] Δημιουργούνται περισσότερα νήματα από τους διαθέσιμους πυρήνες
  • [ ] Η χρήση της συνάρτησης pthread_join() δεν είναι απαραίτητη στο συγκεκριμένο πρόγραμμα
  • [ ] Το πρόγραμμα δεν έχει κάποιο πρόβλημα
Λύσεις (⚪ AI, μη επαληθευμένο)

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

Προσοχή

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

AI λύσεις — 2021-f

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

Ερώτηση 1 / 7

Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: pthread_mutex_t (3η επιλογή). Χρειάζεται mutex γύρω από την ενημέρωση της κοινής μεταβλητής ώστε να αποφευχθεί race condition. Τα pthread_t είναι αναγνωριστικά νημάτων, τα pthread_barrier_t φράγματα και τα pthread_mutexattr_t ιδιότητες mutex.

Ερώτηση 2 / 7

Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: Αμοιβαίο αποκλεισμό (4η επιλογή). Τα pthread_mutex_t χρησιμοποιούνται με pthread_mutex_lock/unlock ώστε μόνο ένα νήμα να βρίσκεται τη φορά σε κρίσιμο τμήμα. Αν και αυτό είναι μορφή συγχρονισμού, η ειδική λειτουργία τους είναι ο αμοιβαίος αποκλεισμός.

Ερώτηση 3 / 7

Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: Reduction (2η επιλογή). Κάθε νήμα υπολογίζει τοπικό άθροισμα και έπειτα, με κλείδωμα, το προσθέτει στο κοινό s. Αυτό είναι αναγωγή αθροίσματος (reduction) πάνω στη μεταβλητή s.

Ερώτηση 4 / 7

Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: Reduction (4η επιλογή). Κάθε νήμα υπολογίζει τοπικό γινόμενο local_a και μέσα σε critical το πολλαπλασιάζει στο κοινό a. Πρόκειται δηλαδή για αναγωγή γινομένου πάνω στη μεταβλητή a.

Ερώτηση 5 / 7

Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: fork-join (4η επιλογή). Στο μοντέλο εκτέλεσης του OpenMP το κύριο νήμα δημιουργεί ομάδα νημάτων στην αρχή παράλληλης περιοχής (fork) και τα νήματα συνενώνονται στο τέλος της (join).

Ερώτηση 6 / 7

Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: firstprivate(N) (1η επιλογή). Το firstprivate δημιουργεί ιδιωτικό αντίγραφο για κάθε νήμα και το αρχικοποιεί με την τιμή της N από το κύριο νήμα, δηλαδή με 1000. Το private(N) θα άφηνε το αντίγραφο μη αρχικοποιημένο.

Ερώτηση 7 / 7

Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή

Σωστή επιλογή: «Τα νήματα που δημιουργούνται δεν εκτελούνται ταυτόχρονα, ακόμα και αν κανένας πυρήνας δεν χρησιμοποιείται από άλλο πρόγραμμα» (1η επιλογή). Επειδή αμέσως μετά το pthread_create καλείται pthread_join για το ίδιο νήμα, το κύριο νήμα περιμένει να τελειώσει το νήμα πριν δημιουργήσει το επόμενο· άρα τα νήματα εκτελούνται ουσιαστικά σειριακά.

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


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