View on GitHub

ceteiep_pdc

Parallel and Distributed Computing

Παραδείγματα εργαστηρίου (2019-2020)

Ημερολόγιο μαθημάτων


ΕΡΓΑΣΤΗΡΙΟ 1 & 2

Σειριακός κώδικας που υπολογίζει το άθροισμα ακεραίων από το 1 μέχρι και το Ν (Ν=10000).

Παράδειγμα με POSIX Processes. Υπολογισμός αθροίσματος ακεραίων τιμών από το 1 μέχρι και το Ν (Ν=10000) χρησιμοποιώντας 2 διεργασίες. Η διεργασία παιδί υπολογίζει το άθροισμα 1 + 2 + … + Ν/2 ενώ η διεργασία γονέας υπολογίζει το άθροισμα (Ν/2 + 1) + (Ν/2 + 2) + … + Ν.

Παράδειγμα με pThreads. Υπολογισμός αθροίσματος ακεραίων τιμών από το 1 μέχρι και το Ν (Ν=10000) χρησιμοποιώντας Τ νήματα (Τ=2). Το ένα νήμα υπολογίζει το άθροισμα 1 + 2 + … + Ν/2 ενώ το άλλο νήμα υπολογίζει το άθροισμα Ν/2+1 + Ν/2+2 + … + Ν. Το κύριο νήμα αναλαμβάνει την πρόσθεση των αθροισμάτων που υπολογίζουν τα νήματα.

ΕΡΓΑΣΤΗΡΙΟ 3 (κρίσιμες περιοχές)

Κώδικας υπολογισμού y = A * x (δίνεται ο δισδιάστατος πίνακας Α και το διάνυσμα x)

Κώδικες που επιδεικνύουν την αναγκαιότητα συγχρονισμού στον παράλληλο και ταυτόχρονο προγραμματισμό.

Ένα σύνολο νημάτων πραγματοποιούν τον ίδιο αριθμό μοναδιαίων αυξήσεων και μοναδιαίων μειώσεων στην κοινόχρηστη μεταβλητή counter που αρχικοποιείται στην τιμή 0. Η τελική τιμή της μεταβλητής counter θα έπρεπε να είναι 0 αλλά λόγω “συνθήκης ανταγωνισμού” δεν λαμβάνεται το σωστό αποτέλεσμα.

Επίλυση του προβλήματος με busy_wait (για 4 νήματα).

Το busy wait είναι επικίνδυνο αν πρόκειται να ζητηθεί βελτιστοποίηση κατά τη μεταγλώττιση. Επίλυση του προβλήματος με χρήση volatile μεταβλητών.

Επίλυση του προβλήματος με αμοιβαίο αποκλεισμό (mutex).

Επίλυση του προβλήματος με σημαφόρους.

ΕΡΓΑΣΤΗΡΙΟ 4 (φράγματα - μεταβλητές συνθήκης)

Χρησιμότητες των φραγμάτων

Ένα απλό παράδειγμα με φράγμα

10 νήματα “κοιμούνται” για κάποια δευτερόλεπτα το καθένα εμφανίζοντας μήνυμα για το χρονικό διάστημα του “ύπνου τους”. Μόνο όταν όλα τα νήματα “ξυπνήσουν”, τότε το καθένα θα πρέπει να εμφανίσει μήνυμα για το ότι “ξύπνησε”.

Ένα δεύτερο παράδειγμα χρησιμότητας των φραγμάτων

Έστω ότι 10 νήματα πρέπει πρώτα να προσθέσουν από μια μονάδα σε μια κοινόχρηστη μεταβλητή και μετά το καθένα να διπλασιάσει τη μεταβλητή.

Παράδειγμα με conditional variable

Σενάριο προβλήματος: Τρία νήματα Τ1, Τ2 και Τ3. Το νήμα Τ1 θα πρέπει να περιμένει να ξεκινήσουν τα νήματα Τ2 και Τ3 έτσι ώστε να ξεκινήσει. Τα νήματα Τ2 και Τ3 θα πρέπει να περιμένουν το Τ1 να τα ειδοποιήσει ότι μπορούν να συνεχίσουν την εκτέλεσή τους.

$ gcc lc04_conditional_var.c - o lc04_conditional_var -lpthread
$ lc04_conditional_var
T3:start
T3:wait T1 to finish
T2:start
T2:wait T1 to finish
T1:start
T1:work
T1:broadcast
T1:finish
T2:work
T2:finish
T3:work
T3:finish