Παράλληλη Επεξεργασία — Εξέταση Φεβρουαρίου, σειρά Β (Ενότητα 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 για το ίδιο νήμα, το κύριο νήμα περιμένει να τελειώσει το νήμα πριν δημιουργήσει το επόμενο· άρα τα νήματα εκτελούνται ουσιαστικά σειριακά.