ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Αρχιτεκτονική Υπολογιστών Σύγχρονοι υπολογιστές Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Παράλληλη επεξεργασία Αρης Ευθυμίου
Παράλληλοι υπολογιστές παλιά ιδέα!! Στόχος: συνδέουμε πολλούς επεξεργαστές/υπολογιστές " μεγάλο, γρήγορο υπολογιστή Επίδοση ανάλογη του αριθμού υπολογιστών! Το λογισμικό πρέπει να δουλεύει με μεταβλητό αριθμό επεξεργαστών! Κατανάλωση ενέργειας πολλοί μικροί, αποδοτικοί επεξεργαστές! Αξιοπιστία πλεονασμός επεξεργαστών: το σύστημα θα μπορεί να λειτουργεί ακόμα και αν μερικοί αστοχήσουν 2
Επίδοση! Ρυθμός διεκπαιρέωσης εργασιών/προγραμμάτων job- level parallelism ή process- level parallelism ανεξάρτητες εφαρμογές Σχετικά εύκολη περίπτωση: συστάδα (cluster) υπολογιστών συνδεδεμένοι με δίκτυο (γρήγορο Ethernet)! Χρόνος υπολογισμού μίας εφαρμογής διάσπαση του προβλήματος και εκτέλεση σε πολλαπλούς επεξεργαστές 3
Πολυπύρηνοι μικροεπεξεργαστές! Ασύμφορη εκμετάλευση παραλληλίας επιπέδου εντολής πολύ μικρό κέρδος για μεγάλο κόστος! σε επιφάνεια πυριτίου και ενέργειας! Χρήση των επιπλέον τρανζίστορ του Ο.Κ. (Νόμος Moore) πολλαπλοί «επεξεργαστές» στο Ο.Κ. Ορος: πυρήνας (core) για επεξεργαστή, επεξεργαστής/cpu για το ολοκληρωμένο κύκλωμα που περιέχει τους πυρήνες mulr- core σχετικά λίγοι πυρήνες many- core πολλοί πυρήνες 4
Στόχος/πρόκληση! Κατασκευή υλικού και λογισμικού που διευκολύνει τη συγγραφή σωστών προγραμμάτων που εκτελούνται αποδοτικά (χρόνος, ενέργεια) καθώς ο αριθμός πυρήνων αυξάνεται! Υπάρχει και concurrent λογισμικό όχι μόνο σειριακό π.χ. Λειτουργικό Σύστημα 5
Παράλληλα προγράμματα! Η συγγραφή προγραμμάτων που χρησιμοποιούν πολλούς επεξεργαστές για μία εφαρμογή είναι δύσκολη decomposiron: διαχωρισμός σε έργα (task) assignment: ανάθεση έργων σε διεργασίες/νήματα orchestraron: ενορχήστρωση της πρόσβασης δεδομένων, επικοινωνίας, συγχρονισμού των διεργασιών mapping: αντιστοίχιση διεργασιών σε πυρήνες! Το πρόβλημα γίνεται πιο δύσκολο όσο αυξάνεται ο αριθμός των πυρήνων! Νήμα (thread) παρόμοιος όρος με τη διεργασία συχνά αναφέρεται σε διεργασία που αποτελεί μέρος μίας εφαρμογής 6
Διαχωρισμός - νόμος του Amdahl! Απαιτείται παραλληλισμός όλου του προγράμματος! Νόμος του Amdahl:! Εφαρμογή σε παράλληλο σύστημα 0<P<1 τμήμα που παραλληλοποιήθηκε Ν αριθμός επεξεργαστών! Παράδειγμα: 90 φορές ταχύτερα με 100 επεξεργαστές 1- P = 0.001 0.1% του προγράμματος δεν είναι παράλληλο! 7
Κλιμάκωση προβλήματος 1/3! Παράδειγμα - εφαρμογή πρόσθεση 10 τιμών (υποθ. δεν παραλληλίζεται) πρόσθεση 2 πινάκων διαστάσεων 10x10 Αριθμός επεξεργαστών 10, 100 Προσθέσεις (1 επεξεργαστής, 10x10): 10*10 + 10 = 110 Προσθέσεις (10 επεξεργαστες, 10x10): 10*10/10 + 10 = 20! speedup = 5.5 Προσθέσεις (100 επεξεργαστες, 10x10): 10*10/100 + 10 = 11! speedup = 10 8
Κλιμάκωση προβλήματος 2/3! Παράδειγμα - εφαρμογή πρόσθεση 10 τιμών (υποθ. δεν παραλληλίζεται) πρόσθεση 2 πινάκων διαστάσεων 100x100 Αριθμός επεξεργαστών 10, 100 Προσθέσεις (1 επεξεργαστής, 100x100): 100*100 + 10 = 10010 Προσθέσεις (10 επεξεργαστες, 100x100): 100*100/10 + 10 = 1010! speedup = 9.9 Προσθέσεις (100 επεξεργαστες, 100x100): 100*100/100 + 10 = 110! speedup = 91 9
Κλιμάκωση προβλήματος! Δύσκολο να επιτευχθεί σημαντική βελτίωση κρατώντας το μέγεθος προβλήματος σταθερό! Strong scaling σταθερό μέγεθος προβλήματος! weak scaling μέγεθος προβλήματος ανάλογο του αριθμού επεξεργαστών 10
Eξισορρόπηση φόρτου! Παράδειγμα προηγούμενη εφαρμογή 100 επεξεργαστές, πίνακας 100x100 κάθε επεξεργαστής έκανε 1/100 της δουλειάς Υπολογισμός χρόνου αν μόνο ένας επεξεργαστής έχει επιπλέον φόρτο: το 2% της δουλειάς! και το 5% 11
Eξισορρόπηση φόρτου! 2% * 100*100 = 200 10000-200 = 9800 για τους υπόλοιπους 99 επεξεργαστές! 9800 / 99 = 98.99 Χρόνος εκτέλεσης: max(9800/99, 200) + 10 = 210 Speedup = 10010/210 = 48 Το μισό από ότι με ισοκατανομή φόρτου! 5% * 100 *100 = 500 Χρόνος εκτέλεσης: max(9500/99, 500) + 10 = 510 Speedup = 10010/510 = 20 Σχεδόν το 1/5 από ότι με ισοκατανομή φόρτου 12
Shared- memory mulrprocessors! Ακρωνύμιο: SMP! Διευκόλυνση του υλικού: η μνήμη όλου του συστήματος έχει ενιαίο χώρο φυσικών διευθύνσεων εύκολη επικοινωνία μέσω κοινόχρηστων μεταβλητών συνηθίζεται σε πολυπύρηνους επεξεργαστές συνδιάζεται με μηχανισμούς συνοχής κρυφής μνήμης (cache coherence)! Ανεξάρτητες εφαρμογές τρέχουν σε δικό τους χώρο μηχανισμός εικονικής μνήμης 13
Συνοχή κρυφής μνήμης! Πρωτόκολλα συνοχής (coherence): κανόνες λειτουργίας που εξασφαλίζουν συνοχή κρυφής μνήμης! Σε μικρά συστήματα: πρωτόκολλο παρακολούθησης (snoopy) κάθε $ παρατηρεί τα αιτήματα των υπόλοιπων αν έχει αντίγραφο της γραμμής, κάνει κάποια δράση! Πρωτόκολλο ακύρωσης (invalidaron) κάθε εγγραφή, ακυρώνει τα αντίγραφα γραμμών $ των υπόλοιπων επεξεργαστών! False sharing: διαφορετικά δεδομένα στην ίδια γραμμή που δεν μοιράζονται προκαλούν ακυρώσεις 14
Συγχρονισμός! Συνεργασία διεργασιών/νημάτων: εγγραφή ανάγνωση κοινών δεδομένων! Απαιτείται συγχρονισμός αλλιώς προβλήματα data race! Συνηθισμένη μορφή: αμοιβαίος αποκλεισμός (mutual exclusion mutex) τμήματα κώδικα όπου μόνο ένα νήμα μπορεί να εκτελεί κάθε φορά! Υλοποίηση μέσω εντολών lock unlock που παρέχει το υλικό Οι εντολές συγχρονισμού επεξεργαστή γενικά απαιτούν αδιάκοπτη (atomic) ανάγνωση και εγγραφή μνήμης 15
Εντολή Atomic exchange! Ανταλλαγή της τιμής ενός καταχωρητή με αυτή μιας θέσης στη μνήμη! Υλοποίηση απλής κλειδαριάς 0 ανοιχτή, 1 κλειστή Τοποθέτηση τιμής 1 σε ένα καταχωρητή Εκτέλεση της εντολής ανταλλαγής Αν η τιμή του καταχωρητή είναι 1, κάποιος άλλος πυρήνας πρόλαβε να κλειδώσει Αν η τιμή είναι 0, ο πυρήνας κλείδωσε τη κλειδαριά! Καμία πράξη δεν μπορεί να παρεμβληθεί μεταξύ της ανάγνωσης και της εγγραφής 16
Παράδειγμα προγράμματος! Πρόσθεση 100000 αριθμών ενός πίνακα! Σχέδιο: κάθε επεξεργαστής προσθέτει 100000/Ν αριθμούς πρόσθεση των N επιμέρους αθροισμάτων! λέγεται reducron: επιστροφή μιας τιμής από μια «δομή»! π.χ. verilog reducron operators &a = λογικό AND των bit του a! Υποθέσεις 100 επεξεργαστές/νήματα Pn ο αριθμός τρέχοντος επεξεργαστή/νήματος: 0 Ν- 1 Αριθμοί σε πίνακα Α Πινακας sum[100] για επιμέρους αθροίσματα 17
Παράδειγμα τοπικές μεταβλητές, διαφορετικές ανά νήμα barrier όλα τα νήματα πρέπει να συγχρονιστούν 18
Συστάδες υπολογιστών! Κάθε επεξεργαστής έχει δικό του χώρο φυσικών διευθύνσεων! Επικοινωνία μέσω ανταλλαγής μηνυμάτων (message passing) συντονισμός νημάτων γίνεται έμμεσα το νήμα ενημερώνεται όταν φτάνει ένα μήνυμα! μπορούν να αποσταλούν και μηνύματα επιβεβαίωσης (acknowledgement) 19
Συστάδες! Ευκολότερη υλοποίηση υλικού! Επεκτάσιμες σε μεγάλο αριθμό υπολογιστών 10s χιλιάδες εξυπηρετητών (servers) Warehouse Scale Computers (WSC)! Εξαιρετικά αποδοτικές για ανεξάρτητα προγράμματα ή προγράμματα με ελάχιστη συνεργασία! Κάθε υπολογιστής έχει το δικό του αντίγραφο του Λ.Σ.! Χωριστή διαχείριση υπάρχουν βοηθητικά προγράμματα διαχείρισης! Μεγάλη διαθεσιμότητα το σύστημα αντέχει αστοχίες υπολογιστών 20
Πολυνημάτωση σε υλικό! Hardware mulrthreading! Πολλαπλά νήματα χρησιμοποιούν τις μονάδες επεξεργασίας (π.χ. ALU) ενός πυρήνα ταυτόχρονα ή με επικάλυψη! Κέρδος: αξιοποίηση του υλικού όταν η εκτέλεση ενός νήματος αναβάλεται (stall)! Προϋπόθεση: γρήγορη εναλλαγή νημάτων στον πυρήνα σε αντίθεση με εναλλαγή διεργασιών από το Λ.Σ. 100s κύκλοι! Ο επεξεργαστής έχει ένα ξεχωριστό αρχείο καταχωρητών και PC για κάθε νήμα 21
Είδη πολυνημάτωσης 22
Είδη παραλληλισμού Διαχωρισμός ανάλογα με τις ροές εντολών και δεδομένων SISD σειριακός επεξεργαστής MIMD παράλληλος επεξεργαστής SIMD επεξεργαστές διανυσμάτων/ παραλληλισμός δεδομένων! SPMD single- program mulrple- data!!!! Ενα πρόγραμμα (για ένα νήμα) που «αντιγράφεται» πολλές φορές και τα αντίγραφα τρέχουν παράλληλα Είδος MIMD 23
SIMD! Εντολές που «δουλεύουν» σε πολλά δεδομένα π.χ. πρόσθεση 64 ζευγαριών αριθμών! Μία μονάδα προσκόμισης εντολών, πολλαπλές λειτουργικές μονάδες για πράξεις μικρότερος κώδικας! Αποδοτικό σε εμφαρμογές με μεγάλη παραλληλία δεδομένων η ίδια δουλειά γίνεται συνέχεια σε διαφορετικά δεδομένα πίνακες με βρόγχους for 24
SIMD σε x86! Εντολές MMX, SSE,! Υπάρχει υλικό που χειρίζεται δεδομένα με «πλάτος» 64bit (ή και παραπάνω)! Πολλές εφαρμογές έχουν παραλληλισμό δεδομένων με μικρότερους τύπους δεδομένων, π.χ. bytes! Μικρή μετατροπή στην ALU επιτρέπει 8 ταυτόχρονες πράξεις σε συνεχόμενα bytes π.χ. πρόσθεση: αποσύνδεση της διάδοσης κρατούμενου κάθε 8 bits 25
Επεξεργαστές γραφικών! Ξεχωριστός επεξεργαστής με δική του μνήμη σε κάρτα γραφικών (ειδικό δίαυλο: AGP, τώρα PCIe) ή ενσωματωμμένος στη μητρική πλακέτα! ή στο ολοκληρωμένο κύκλωμα του επεξεργαστή ονομάζεται πλέον Graphics Processing Unit (GPU)! Μεγάλη αγορά: παιχνίδια, παιχνιδομηχανές γρήγορος κύκλος επένδυσης- απόδοσης 26
Αρχιτεκτονική GPU! Εκτενής παραλληλισμός πολλοί πυρήνες με πολλά νήματα! Απόκρυψη καθυστέρησης μνήμης μικρές κρυφές μνήμες εκτέλεση πολλών νημάτων! Κύρια μνήμη βελτιστοποιημένη ώς προς ρυθμό μεταφοράς ειδική DRAM με περισσότερους ακροδέκτες (pins)! Εξέλιξη GPUs παλιότερα βασίζονταν σε SIMD εντολές τώρα σε απλές scalar εντολές! για λόγους ευκολότερου προγραμματισμού και απόδοσης! Πολύ διαφορετική ορολογία ξεχωριστό περιβάλλον από αρχιτεκτονική CPUs 27
Ετερογενή συστήματα! Οι πολυπύρηνοι επεξεργαστές είναι ομοιογενή συστήματα (homogeneous) όλοι οι πυρήνες είναι ίδιοι υπάρχουν και λίγες εξαιρέσεις! Ο συνδιασμός CPU- GPU είναι ένα ετερογενές σύστημα (heterogeneous) επιλέγεται ο κατάλληλος επεξεργαστής για την κάθε δουλειά πρόγραμμα ή νήμα! Ο παραλληλισμός και η υπολογιστική ισχύς του GPU μπορεί να χρησιμοποιηθεί για υπολογισμούς που δεν έχουν σχέση με γραφικά όρος: General Purpose GPU (GPGPU) ή GPU compurng για υπολογισμούς που «μοιάζουν» με αυτούς των γραφικών 28
Προγραμματισμός GPU! Παλιότερα: ο προγραμματιστής άλλαζε το πρόγραμμα ώστε να μοιάζει με επεξεργασία γραφικών χρησιμοποιώντας APIs των OpenGL, DirectX! Πρόσφατα: ειδικές γλώσσες (επεκτάσεις γλωσσών) OpenCL, CUDA (NVIDIA) επεκτείνουν C, C++! Στηρίζονται πολύ στο run- rme system: ενδιάμεσος κώδικας μετατρέπεται/βελτιστοποιείται ανάλογα με την GPU μεγάλος αριθμός νημάτων ανεξάρτητος του αριθμού επεξεργαστών δυναμική ανάθεση νημάτων σε επεξεργαστές 29
Διάσπαση προβλήματος! Διάσπαση σε 2 επίπεδα! Thread block παράλληλα νήματα που λύνουν μικρά προβλήματα μπορούν να συνεργάζονται/ συγχρονίζονται τρέχουν στον ίδιο επεξεργαστή τύπου SPMD ίδιος κώδικας! Thread grid ένας αριθμός από thread blocks πρέπει να είναι ανεξάρτητα: η σειρά εκτέλεσης των επιμέρους block δεν είναι καθορισμένη 30
Οργάνωση GPU 31
Εκτέλεση νημάτων! warp ομάδα νημάτων του ίδιου thread group! η ίδια εντολή εκτελείται σε όλα τα νήματα SIMT: Single Instrucron Mulrple Threads σε περίπτωση if/then/else κάποια νήματα είναι ανενεργά! τρέχει ταυτόχρονα σε διαφορετικά SP του ίδιου SM! ένα νήμα ανά κύκλο, αλλά σε συνεχόμενους κύκλους τρέχουν νήματα του ίδιου warp π.χ. αλλαγή warp κάθε 4 κύκλους 32
Επόμενο μάθημα! Σύνοψη - επανάληψη 33
Τέλος Ενότητας
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σημειώματα
Σημείωμα Ιστορικού Εκδόσεων Έργου Το παρόν έργο αποτελεί την έκδοση 1.0. Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 1.0 διαθέσιμη εδώ. http://ecourse.uoi.gr/course/view.php?id=1307.
Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου. «Αρχιτεκτονική Υπολογιστών. Σύγχρονοι υπολογιστές». Έκδοση: 1.0. Ιωάννινα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http://ecourse.uoi.gr/course/view.php?id=1307.
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1] https://creativecommons.org/licenses/by-sa/4.0/.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Αρχιτεκτονική Υπολογιστών Οδηγίες GitHub Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Αρχιτεκτονική Υπολογιστών Οδηγίες GitHub Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Oδηγίες git, GitHub Αρης Ευθυμίου Πηγές: Timothy Wood - Git & GitHub: h?p://faculty.cs.gwu.edu/~lmwood/wiki/doku.php/learn:git Git Immersion: h?p://gilmmersion.com/index.html
Το σημερινό μάθημα! Τί είναι το Git και το GitHub! Αποθετήρια δημιουργία κλωνοποίηση!!!!!! Στιγμιότυπα Κατάλογος εργασίας και στιγμιότυπα Απομακρυσμένα αποθετήρια Χρήση 2 τοπικών αποθετηρίων Αναίρεση αλλαγών Προχωρημένη χρήση - παρακλάδια 2
Τι είναι το git! Το git είναι ένα σύστημα διαχείρισης εκδόσεων αρχείων Στα Αγγλικά: version control system Παρακολουθεί τις αλλαγές σε ένα σύνολο αρχείων κρατώντας στιγμιότυπά τους Το σύνολο στιγμιοτύπων ονομάζεται αποθετήριο (repository)! Ολα τα αρχεία και υποκατάλογοι κάτω από ένα «πατρικό» κατάλογο! Χρήσεις: επιστροφή σε μια παλιότερη έκδοση αν έχει γίνει κάποιο λάθος δοκιμή παραλλαγών (ονομάζονται παρακλάδια - branches) χωρίς να επηρεάζεται η τρέχουσα κατάσταση των αρχείων 3
Τι είναι το GitHub! Το GitHub είναι ένας εξυπηρετητής που φιλοξενεί αποθετήρια και μια εύχρηστη διεπαφή ιστού υποστηρίζει όλες τις εντολές του git και παρέχει μερικές επιπλέον δυνατότητες! Η εγγραφή χρηστών και η φιλοξενία ανοιχτών (public) αποθετηρίων είναι δωρεάν άλλες χρήσεις χρειάζονται πληρωμή (ιδιωτικά αποθετήρια)! Είναι εξαιρετικά δημοφιλές εργοδότες υποθέτουν ότι αιτούντες εργασία θα το γνωρίζουν ένας τρόπος να (απο/επι)δείξει κανείς τις ικανότητές του! συμμετοχή σε κοινά project, δημοσίευση project μαθημάτων,...! Υπάρχουν και άλλες αντίστοιχες υπηρεσίες π.χ. BitBucket 4
GitHub organizalons! Εκτός από αποθετήρια μεμονωμένων ανθρώπων παρέχονται αποθετήρια για οργανισμούς! Οπως ο UoI- CSE- MYY402! Κάτι σαν υπερ- κατάλογος αποθετηρίων! με ομάδες ανθρώπων να μοιράζονται αποθετήρια! Διάφορα επίπεδα προσβασης διαχειριστής, μόνο ανάγνωση, εγγραφή,... 5
Γιατί τα χρησιμοποιούμε! Εξαιρετικά χρήσιμα ως εργαλεία οργάνωση εργασιών, συνεργασία σε ομαδικά project,... de facto προαπαιτούμενα για εύρεση εργασίας χρήσιμα για παράδοση εργασιών/ασκήσεων! Το μάθημα απαιτεί ελάχιστη χρήση τους μόνο παραλαβή, παράδοση κώδικα εργασιών ελάχιστος χρόνος εκμάθησης (για απλή χρήση)! Σκοπός γνωριμία, βασική χρήση για το μάθημα πειραματισμός, βαθύτερη γνώση για προσωπική χρήση και εξέλιξη δεξιοτήτων 6
Εφαρμογές git, ρυθμίσεις! Θα χρησιμοποιήσουμε το git από τερματικό υπαρχουν και GUIs. Δείτε το φυλλάδιο του lab 0.! Εγκατάσταση από h?p://git- scm.com/downloads απλές οδηγίες, δε θα πρέπει να έχετε δυσκολίες ήδη εγκατεστημένο στους υπολογιστές των εργαστηρίων! Εγγραφή στο GitHub h?ps://educalon.github.com/pack! Ρυθμίσεις όνομα χρήστη και διεύθυνση email git config --global user.name "Your Name git config --global user.email "email@u Για email χρησιμοποιείστε τη διεύθυνση που δώσατε στο GitHub 7
Δημιουργία αποθετηρίου! Για το μάθημα τα αποθετήρια θα είναι έτοιμα στο GitHub θα χρειαστεί κλωνοποίηση για να έχετε «αντίγραφο εργασίας» σε κάθε άσκηση θα παίρνετε ένα κατάλογο με τα επιπλέον αρχεία! Στο GitHub, στη σελίδα σας πατήστε το πράσινο κουμπί: New Repository και δώστε ένα όνομα αυτό δημιουργεί αποθετήριο μόνο στο GitHub δεν θα έχετε τοπικό αντίγραφο. Βλ. κλωνοποίηση! Σε υπολογιστή (προσωπικό ή εργαστηρίου) σε τερματικό, σε ένα κατάλογο: git init αυτό δημιουργεί μόνο τοπικό αποθετήριο, όχι στο GitHub 8
Κλωνοποίηση αποθετηρίου! Το αποθετήριο του GitHub είναι για αποθήκευση, συνεργασία Δεν μπορείς να μεταγλωτίσεις, να τρέξεις προγράμματα,...! Χρειάζεται ένα τοπικό αντίγραφο, κλώνος (clone) με αντίγραφα όλων των αρχείων του τρέχοντος στιγμιότυπου, στον υπολογιστή που έχετε μπροστά σας! είτε στο εργαστήριο ή στο σπίτι! ή και στα δύο (βλ. παρακάτω)! Κλωνοποίηση: 1. βρείτε το URL του αποθετηρίου σας στο GitHub! μοιάζει με h?ps://github.com/username- or- ORGNAME/REPO.git! Κάτω δεξιά στην ιστοσελίδα του αποθετηρίου 2. δημιουργήστε τον κλώνο:! Εντολή σε τερματικό: git clone <URL>! Θα δημιουργηθεί κατάλογος με το όνομα του αποθετηρίου Ο κατάλογος ονομάζεται κατάλογος εργασίας (working- directory) 9
Στιγμιότυπα 1/2! Το git κρατάει στιγμιότυπα μόνο όταν το ζητήσουμε με την εντολή git commit τα στιγμιότυπα ονομάζονται commits! Τα commits καταγράφουν κάποιο «σημαντικό γεγονός» την ολοκλήρωση κάποιου μέρους της δουλειάς π.χ. αρχή του project, προσθήκη υπορουτίνας Α, το σημαντικό είναι υποκειμενικό: καλύτερα να υπάρχουν πολλά commits! Aπαιτείται ένα μικρό κείμενο που περιγράφει το γεγονός ονομάζεται commit message 10
Στιγμιότυπα 2/2! Υπάρχουν πολλά commits και το git έχει τη δυνατότητα να τα βρεί κάθε commit έχει ένα μοναδικό κωδικό, ονομάζεται hash είναι ένας πολύ μακρύς δεκαεξαδικός αριθμός πληροφορία στον κρυφό υποκατάλογο.git του working directory! Υπάρχει πάντα ένα τρέχον στιγμιότυπο που έχει το όνομα HEAD το HEAD δείχνει σε άλλο στιγμιότυπο όταν κάνουμε commit! Τα στιγμιότυπα σχετίζονται εκτός από το αρχικό, κάθε στιγμιότυπο προκύπτει από ένα προηγούμενο με μερικές αλλαγές σειρά αλλαγών μέχρι τώρα, εντολή: git log 11
Kατάλογος εργασίας, στιγμιότυπα Ποιά η διαφορά ενός «στιγμιότυπου» από το σύνολο αρχείων του καταλόγου εργασίας που βλέπω τώρα;! Τα αρχεία που φαίνονται στον κατάλογο εργασίας... μπορεί να είναι τα ίδια με ένα στιγμιότυπο (συνήθως το τρέχον), αλλά μπορεί και να έχουν αλλάξει! Επιπλέον μπορεί να υπάρχουν αρχεία που δεν είναι μέρος του στιγμιότυπου Συνήθως παραγόμενα αρχεία: εκτελέσιμα, object, log κ.α. ή αρχεία που μόλις προστέθηκαν και δεν έχουν κρατηθεί σε κάποιο στιγμιότυπο ακόμη! Το αποθετήριο είναι, χονδρικά, το σύνολο των στιγμιοτύπων πληροφορία κρατιέται στο.git του καταλόγου εργασίας και στο GitHub (ή και αλλού) 12
Προσθήκη σε στιγμιότυπο! Γίνεται σε δύο στάδια προσωρινή προσθήκη! εντολή: git add τελική προσθήκη! εντολή: git commit! Γιατί χωριστά στάδια: ευελιξία για προχωρημένους χρήστες! Χρήσιμη εντολή: git status ποιά αρχεία «παρακολουθούνται» (έχουν γίνει add) ποιά έχουν αλλάξει (είτε παρακολουθούνται, είτε όχι) και πολλά άλλα 13
Προσωρινή προσθήκη! Ονομάζεται staging (ή add to Index)! Είναι η στιγμή που κρατιέται το στιγμιότυπο Αν ξανα- αλλάξει το αρχείο από τότε μέχρι την τελική προσθήκη, οι αλλαγές δεν θα καταγραφούν στο στιγμιότυπο.! αν δεν ξαναγίνει προσωρινή προσθήκη! Απαραίτητη για κάθε αλλαγή σε αρχείο όχι μόνο για νέα αρχεία που θέλετε να προσθέσετε στο commit! Μπορεί να γίνει πολλές φορές πρίν από τη τελική προσθήκη! Εντολή: git add <filename>! Τα αρχεία μπορεί να είναι και σε υποκατάλογο 14
Προσθήκη σε στιγμιότυπο 2! Για απλούστευση κάντε και τα δύο βήματα μαζί, όταν θέλετε να κρατήσετε στιγμιότυπο: git add <filenames> git commit! Η εντολή git commit ξεκινά έναν editor ώστε να γράψετε ένα σύντομο κείμενο που εξηγεί τι περιλαμβάνει το commit εναλλακτικά: git commit - m το μήνυμα! Τα κείμενα αυτά είναι σημαντικά πρέπει να μπορεί κανείς να καταλαβαίνει τι κάνατε (και γιατί) φανταστείτε ότι το γράφετε για κάποιον άλλο 15
Προβολή των διαφορών! Εντολή git diff δείχνει διαφορές πολύ χρήσιμη σε συνδιασμό με την git status! git diff αλλαγές μεταξύ staged (μετά από git add) και working directory! git diff - - cached αλλαγές μεταξύ τρέχοντος στιγμιότυπου (HEAD) και staged! git diff HEAD αλλαγές μεταξύ τρέχοντος στιγμιότυπου και working directory 16
Παράδειγμα!!!!!!!!!!!!!! Το working dir είναι ίδιο με το τελευταίο στιγμιότυπο (HEAD) Αλλάζω το αρχείο aris git status git add aris # πρόσθεσε το aris στο staging area git status git diff - - cached # αλλαγές μεταξύ στιγμιοτύπου και staged ξανα- αλλάζω το aris git status git diff # αλλαγές μεταξύ staged και working dir git diff HEAD # αλλαγές μεταξύ στιγμιότυπου και working dir git commit - m message git status git diff # καμία αλλαγή! Το staging area είναι άδειο git diff HEAD # αλλαγές μεταξύ στιγμιότυπου και working dir 17
Απομακρυσμένο αποθετήριο! Θυμηθείτε: το τοπικό αποθετήριο κλωνοποίηθηκε από ένα αποθετήριο του GitHub το αποθετήριο του GitHub ονομάζεται απομακρυσμένο, remote! Το remote repo έχει όνομα Συνηθισμένο όνομα: origin Εντολή git remote αναφέρει το όνομα του remote repo! git remote -v δίνει περισσότερες πληροφορίες! Για παράδοση ασκήσεων ενημερώνετε το αποκρυσμένο αποθετήριο με τις αλλαγές που έγιναν στο τοπικό η πράξη λέγεται προώθηση push 18
Προώθηση! Το remote ενημερώνεται για όλα τα νέα στιγμιότυπα που δημιουργήθηκαν από την προηγούμενη ενημέρωση! Προσοχή: αν στο working directory υπάρχουν αλλαγές σε αρχεία, αυτές δεν προωθούνται μόνο commits προωθούνται! Εντολή Την πρώτη φορά: git push -u origin master! ώστε μετά το git push να αρκεί Το origin είναι το όνομα του remote Το master είναι το όνομα του παρακλαδιού που θέλετε να προωθήσετε. Το master είναι το «κύριο» παρακλάδι. Αναφέρεται και ως trunk (κορμός) σε διάφορα κείμενα 19
Σύνοψη: git για το μάθημα Στην αρχή (για κάθε τοπικό αποθετήριο): βλ εξήγηση! git clone <private_repo_url> παρακάτω Για κάθε καινούρια άσκηση τα ελάχιστα βήματα είναι:! git remote add labxx_starter <lab_starter_url>! git fetch labxx_starter! git merge labxx_starter/master -m Fetched labxx init files! θα δημιουργηθει ο κατάλογος labxx! Κάνετε αλλαγές αρχείων σχετικών με την άσκηση λύση της άσκησης! git add <αρχεία που τροποποιήθηκαν, προστέθηκαν>! git commit -m μήνυμα! git push origin master ή git push, αν έχετε κάνει git push - u origin master την πρώτη φορά 20
Πιθανά σενάρια! Σ1: Δουλεύοντας με 2 τοπικά αποθετήρια π.χ. και στο εργαστήριο και στο σπίτι! Σ2: Αναίρεση αλλαγών αν κάτι πάει στραβά, πώς επαναφέρουμε ένα παλιότερο στιγμιότυπο! Σ3: Αλλαγή ονόματος, διαγραφή αρχείου 21
Σ1: Δύο τοπικά αποθετήρια! Π.χ. στο εργαστήριο και στο σπίτι! Δημιουργία 2 κλώνων! Στο εργαστήριο, την πρώτη φορά git clone, add, commit, push ώστε όλες οι αλλαγές να προωθηθούν στο GitHub! Στο σπίτι (υποθέτω υπάρχει ήδη κλώνος) git pull ώστε οι αλλαγές να «έρθουν» τοπικά στο τέλος: git add, commit, push! Μετά, πάντα ξεκινάτε με git pull 22
Σ1: Πιθανά προβλήματα! Αν ξεχάσετε να κάνετε push τις τελευταίες αλλαγές πριν φύγετε από το σπίτι δεν υπάρχει τρόπος να τις πάρετε! (εκτός αν μπορείτε να στήσετε ένα git server στο σπίτι,...)! Αν ξεχάσετε να κάνετε pull ώστε να έχετε την πιο πρόσφατη έκδοση και κάνετε commit! ένα push θα αποτύχει γιατί το απομακρυσμένο αποθετήριο έχει αλλαγές που δεν έχετε τοπικά! πρέπει πρώτα να φέρετε και να συγχωνέψετε(merge) τις αλλαγές αν δεν κάνατε commit,! το pull θα αποτύχει και θα σας ζητηθεί να κάνετε commit και μετά merge, όπως παραπάνω 23
Σ1: Συνδιασμός αλλαγών! Eντολή git pull προσπαθεί να συνδιάσει τις αλλαγές αυτόματα,! προσθήκες νέων αρχείων δεν δημιουργούν προβλήματα αλλά συχνά αποτυχαίνει! αλλαγές στο ίδιο αρχείο απαιτούν την παρέμβαση του χρήστη Τα προβλήματα ονομάζονται conflicts Θα δείτε ποιά αρχεία έχουν conflicts στην απάντηση της pull! Επίλυση συγκρούσεων (συγχώνευση) ανοίξτε τα αρχεία με ένα editor και θα δείτε τις αλλαγές διορθώστε το πρόβλημα με το χέρι, σε όλα τα αρχεία δημιουργείστε ένα νέο στιγμιότυπο με τις αλλαγές! git add, commit προώθηση στο GitHub με git push 24
Σ1: Παράδειγμα!!!!!!!!!!!!! Το working dir είναι ίδιο με το τελευταίο στιγμιότυπο στο GitHub αλλάζω τοπικά το αρχείο test git add test git commit - m "local changes Στο GitHub με ένα browser αλλάζω το αρχείο test git pull # αποτυγχάνει, conflict στο test git status vi test # φαίνονται οι διαφορές, τις συνθέτω git add test git status git commit - m "message" git push Στο GitHub το αρχείο test άλλαξε και στο graphs φαίνεται τι έγινε 25
remote add, fetch, merge Στη σύνοψη git για το μάθημα, είδαμε 3 περίεργες εντολές git: 1. git remote add labxx_starter <lab_starter_url> 2. git fetch labxx_starter 3. git merge labxx_starter/master m Fetched labxx init files 1. Προσθήκη απομακρ. αποθετηρίου με όνομα labxx_starter μπορούμε να έχουμε πολλά remotes... 2. Προσκόμηση του τελευταίου στιγμιότυπου του labxx_starter δεν γίνονται όμως αλλαγές στα αρχεία του working directory 3. Συγχώνευση του remote με το working directory θεωρητικά μπορεί να υπάρξουν συγκρούσεις στο μάθημα, πάντα χωριστός κατάλογος 26
Σ2: αναίρεση αλλαγών! Πολλοί διαφορετικοί τρόποι ανάλογα με την κατάσταση και το τρόπο εργασίας/προτίμηση! Περιπτώσεις 1. 2. 3. 4.! πριν τη προσωρινή προσθήκη (πριν κάνετε git add) μετά τη προσωρινή αλλά πριν τη τελική προσθήκη (πριν git commit) μετά τη τελική προσθήκη (μετά το git commit) αλλά πριν τη προώθηση σε απομακρυσμένο αποθετήριο μετά και από τη προώθηση σε απομακρυσμένο αποθετήριο Σημείωση: Αναίρεση δεν σημαίνει ότι η ώρα προσπέλασης αρχείων θα επανέλθει. Τα περιεχόμενα μόνο αλλάζουν. 27
Π1: πρίν το git add! Βεβαιωθείτε ότι πράγματι δεν έχετε κάνει git add git status δεν θα πρέπει να έχει Changes to be commi?ed! Δώστε την εντολή git checkout <όνομα αρχείου> η εντολή φέρνει από το τρέχον στιγμιότυπο το αρχείο και το γράφει στο working directory 28
Π2: πριν το git commit! Βεβαιωθείτε για την κατάσταση του αποθετηρίου git status! Εντολές αναίρεσης: 1. git reset! αφαιρεί από το staging area όλες τις αλλαγές από το τελευταίο στιγμιότυπο (αναιρεί τα προηγούμενα git add)! Αλλά το working directory δεν αλλάζει 2. git checkout <ονόματα αρχείων>! «Φέρνει» τα αρχεία, όπως ήταν στο προηγούμενο στιγμιότυπο, στο working directory 29
Π3: μετά το commit, πριν push! Για αναίρεση του τελευταίου commit: git reset - - hard HEAD~1 οι αλλαγές στο working dir χάνονται και όλα τα άρχεια επανέρχονται όπως ήταν στο στιγμιότυπο.! Το HEAD~1 σημαίνει ένα commit πριν θα μπορούσαμε να έχουμε ~2 κλπ. μπορούμε επίσης να αναφερθούμε σε ένα commit με το hash του! Δεν είναι καλή ιδέα για κώδικα που έχουμε κάνει push σε απομακρυσμένο αποθετήριο και είναι ορατός από άλλους γιατί τους μπερδεύει 30
Π4: μετά το push! Στιγμιότυπα που έγιναν push σε απομακρυσμένο αποθετήριο έχουν γίνει ορατά και χρησιμοποιηθεί (pull) από άλλους αν ξαναγυρίσουμε σε παλιότερο στιγμιότυπο, οι άλλοι χρήστες θα μπερδευτούν! Καλύτερα να δημιουργηθεί ένα νέο στιγμιότυπο που στην ουσία αναιρεί τις αλλαγές! Εντολή git revert HEAD ξεκινάει editor με ένα έτοιμο μήνυμα. Μπορείτε να το αλλάξετε το working dir επανέρχεται στην κατάσταση του στιγμιοτύπου για αναίρεση πιο πίσω, HEAD~1 κλπ.! Μετά, git push ώστε η αλλαγή να περάσει στο απομακρυσμένο αποθετήριο 31
Σ3: μετονομασία, διαγραφή! Διαγραφή αρχείου διαγράφεται από το working directory, αλλά όχι από το στιγμιότυπο διαγραφή και από το working directory και από το (επόμενο) στιγμιότυπο: git rm <file_name>! Μετονομασία/μετακίνηση αρχείου παρόμοια προβληματα με τη διαγραφή εντολή git mv 32
Πιο προχωρημένη χρήση Παρακλάδια (branches)!!!! Δημιουργία νέου branch Αλλαγή τρέχοντος branch Συγχώνευση παρακλαδιών Ενημέρωση remote για τα παρακλάδια 33
Γιατί παρακλάδια! Συχνές δοκιμές κατά την ανάπτυξη κώδικα πώς θα οργανωθεί αυτό καλα;! Ολα τα version control systems υποστηρίζουν παρακλάδια το git φημίζεται ότι το κάνει πολύ εύκολα 34
Δημιουργία! Εντολή: git checkout -b <branch_name>! Δημιουργεί το παρακλάδι και αλλάζει το τρέχον παρακλάδι σε αυτό (στο καινούριο)! Η εντολή git status στην πρώτη γραμμή αναφέρει σε ποιό παρακλάδι βρισκόμαστε κάθε στιγμή 35
Αλλαγή τρέχοντος branch! Για να δούμε ποιά παρακλάδια υπάρχουν: εντολή: git branch! Αλλαγή τρέχοντος branch Eντολή: git checkout <branch_name>! Αλλαγμένα αρχεία στο working directory, δεν χάνονται! αλλά προσοχή βλ. διαφάνεια 27! 36
Συγχώνευση παρακλαδιών! Οπως συγχωνεύσαμε τοπικό με απομακρυσμένο αποθετήριο (merge, pull), έτσι γίνεται και σε branches! Στο τρέχον παρακλαδι, έστω master, μπορούμε να συγχωνεύσουμε τις αλλαγές που έκανε το παρακλάδι testbrach git merge testbranch Φυσικά μπορεί να υπάρξουν συγκρούσεις που πρέπει να λυθούν! Προσοχή: έχει σημασία ποιό παρακλάδι συγχωνεύεται σε ποιό! το master στο testbranch ή το testbranch στο master? και τα δύο έχουν νόημα για διαφορετικούς λόγους 37
Ενημέρωση remote για branches! Συνήθως τα παρακλάδια είναι για «προσωπική χρήση» δοκιμάζει κανείς παραλλαγές στο τοπικό του αποθετήριο πετάει ό,τι δεν δουλεύει και τις χρήσιμες αλλαγές τις συγχωνεύει με το κύριο παρακλάδι (master) μετά στέλνει τις «τελικές» αλλαγές (του master) στο απομακρυσμένο αποθετήριο! Αν στα παρακλάδια δουλεύουν και άλλοι πρέπει να φαίνονται στο απομακρυσμένο αποθετήριο εντολή: git push <remote> <branch> 38
Τέλος Ενότητας
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σημειώματα
Σημείωμα Ιστορικού Εκδόσεων Έργου Το παρόν έργο αποτελεί την έκδοση 1.0. Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 1.0 διαθέσιμη εδώ. http://ecourse.uoi.gr/course/view.php?id=1307.
Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου. «Αρχιτεκτονική Υπολογιστών. Οδηγίες GitHub». Έκδοση: 1.0. Ιωάννινα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http://ecourse.uoi.gr/course/view.php?id=1307.
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1] https://creativecommons.org/licenses/by-sa/4.0/.