Κλείσιμο διαφήμισης

Mike Ash αφιερωμένο στο blog του τις πρακτικές συνέπειες της μετάβασης σε αρχιτεκτονική 64-bit στο iPhone 5S. Αυτό το άρθρο βασίζεται στα ευρήματά του.

Ο λόγος για αυτό το κείμενο οφείλεται κυρίως στη μεγάλη παραπληροφόρηση που διαδίδεται για το τι σημαίνει πραγματικά για τους χρήστες και την αγορά το νέο iPhone 5s με επεξεργαστή ARM 64-bit. Εδώ θα προσπαθήσουμε να φέρουμε αντικειμενικές πληροφορίες σχετικά με την απόδοση, τις δυνατότητες και τις επιπτώσεις αυτής της μετάβασης για τους προγραμματιστές.

"64 bit"

Υπάρχουν δύο μέρη ενός επεξεργαστή στα οποία μπορεί να αναφέρεται η ετικέτα "X-bit" - το πλάτος των καταχωρητών ακεραίων και το πλάτος των δεικτών. Ευτυχώς, στους περισσότερους σύγχρονους επεξεργαστές αυτά τα πλάτη είναι τα ίδια, επομένως στην περίπτωση του A7 αυτό σημαίνει ακέραιους καταχωρητές 64 bit και δείκτες 64 bit.

Ωστόσο, είναι εξίσου σημαντικό να επισημάνουμε τι ΔΕΝ σημαίνει "64bit": Μέγεθος φυσικής διεύθυνσης RAM. Ο αριθμός των bit για επικοινωνία με τη μνήμη RAM (άρα η ποσότητα της μνήμης RAM που μπορεί να υποστηρίξει μια συσκευή) δεν σχετίζεται με τον αριθμό των bit της CPU. Οι επεξεργαστές ARM έχουν διευθύνσεις μεταξύ 26 και 40 bit και μπορούν να αλλάξουν ανεξάρτητα από το υπόλοιπο σύστημα.

  • Μέγεθος διαύλου δεδομένων. Η ποσότητα των δεδομένων που λαμβάνονται από τη μνήμη RAM ή την προσωρινή μνήμη είναι ομοίως ανεξάρτητη από αυτόν τον παράγοντα. Οι μεμονωμένες οδηγίες του επεξεργαστή μπορεί να ζητούν διαφορετικές ποσότητες δεδομένων, αλλά είτε αποστέλλονται σε κομμάτια είτε λαμβάνονται περισσότερα από όσα χρειάζονται από τη μνήμη. Εξαρτάται από το μέγεθος του κβαντικού δεδομένων. Το iPhone 5 λαμβάνει ήδη δεδομένα από τη μνήμη σε κβάντα 64 bit (και έχει επεξεργαστή 32 bit) και μπορούμε να συναντήσουμε μεγέθη έως και 192 bit.
  • Οτιδήποτε σχετίζεται με κινητή υποδιαστολή. Το μέγεθος τέτοιων καταχωρητών (FPU) είναι και πάλι ανεξάρτητο από την εσωτερική λειτουργία του επεξεργαστή. Η ARM χρησιμοποιεί FPU 64 bit από πριν από το ARM64 (επεξεργαστής ARM 64 bit).

Γενικά πλεονεκτήματα και μειονεκτήματα

Αν συγκρίνουμε κατά τα άλλα πανομοιότυπες αρχιτεκτονικές 32 bit και 64 bit, γενικά δεν είναι τόσο διαφορετικές. Αυτός είναι ένας από τους λόγους για τη γενική σύγχυση του κοινού που αναζητά λόγο για τον οποίο η Apple κινείται στα 64bit και στις φορητές συσκευές. Ωστόσο, όλα προέρχονται από τις συγκεκριμένες παραμέτρους του επεξεργαστή A7 (ARM64) και το πώς τον χρησιμοποιεί η Apple, όχι μόνο από το γεγονός ότι ο επεξεργαστής έχει αρχιτεκτονική 64 bit.

Ωστόσο, αν εξακολουθήσουμε να δούμε τις διαφορές μεταξύ αυτών των δύο αρχιτεκτονικών, θα βρούμε αρκετές διαφορές. Το προφανές είναι ότι οι καταχωρητές ακέραιων αριθμών 64 bit μπορούν να χειριστούν ακέραιους αριθμούς 64 bit πιο αποτελεσματικά. Ακόμη και πριν, ήταν δυνατή η εργασία μαζί τους σε επεξεργαστές 32 bit, αλλά αυτό συνήθως σήμαινε τη διαίρεση τους σε κομμάτια μήκους 32 bit, γεγονός που προκαλούσε πιο αργούς υπολογισμούς. Έτσι, ένας επεξεργαστής 64-bit μπορεί γενικά να υπολογίζει με τύπους 64-bit εξίσου γρήγορα όσο και με αυτούς των 32-bit. Αυτό σημαίνει ότι οι εφαρμογές που χρησιμοποιούν γενικά τύπους 64 bit μπορούν να εκτελούνται πολύ πιο γρήγορα σε έναν επεξεργαστή 64 bit.

Αν και τα 64 bit δεν επηρεάζουν τη συνολική ποσότητα μνήμης RAM που μπορεί να χρησιμοποιήσει ο επεξεργαστής, μπορεί να διευκολύνει την εργασία με μεγάλα κομμάτια μνήμης RAM σε ένα πρόγραμμα. Κάθε μεμονωμένο πρόγραμμα που εκτελείται σε επεξεργαστή 32-bit έχει μόνο περίπου 4 GB χώρου διευθύνσεων. Λαμβάνοντας υπόψη ότι το λειτουργικό σύστημα και οι τυπικές βιβλιοθήκες καταλαμβάνουν κάτι, αυτό αφήνει το πρόγραμμα με κάπου μεταξύ 1-3 GB για χρήση σε εφαρμογές. Ωστόσο, εάν ένα σύστημα 32-bit έχει περισσότερα από 4 GB μνήμης RAM, η χρήση αυτής της μνήμης είναι λίγο πιο περίπλοκη. Πρέπει να καταφύγουμε στον εξαναγκασμό του λειτουργικού συστήματος να χαρτογραφήσει αυτά τα μεγαλύτερα κομμάτια μνήμης για το πρόγραμμά μας (εικονικοποίηση μνήμης), ή μπορούμε να χωρίσουμε το πρόγραμμα σε πολλαπλές διεργασίες (όπου κάθε διεργασία έχει και πάλι θεωρητικά 4 GB μνήμης διαθέσιμη για άμεση διευθυνσιοδότηση).

Ωστόσο, αυτά τα «hacks» είναι τόσο δύσκολα και αργά που ελάχιστες εφαρμογές τα χρησιμοποιούν. Στην πράξη, σε έναν επεξεργαστή 32 bit, κάθε πρόγραμμα θα χρησιμοποιεί μόνο τα 1-3 GB της μνήμης του και μπορεί να χρησιμοποιηθεί περισσότερη διαθέσιμη μνήμη RAM για την εκτέλεση πολλών προγραμμάτων ταυτόχρονα ή τη χρήση αυτής της μνήμης ως buffer (caching). Αυτές οι χρήσεις είναι πρακτικές, αλλά θα θέλαμε κάθε πρόγραμμα να μπορεί να χρησιμοποιεί εύκολα κομμάτια μνήμης μεγαλύτερα από 4 GB.

Τώρα ερχόμαστε στον συχνό (στην πραγματικότητα λανθασμένο) ισχυρισμό ότι χωρίς περισσότερα από 4 GB μνήμης, μια αρχιτεκτονική 64 bit είναι άχρηστη. Ένας μεγαλύτερος χώρος διευθύνσεων είναι χρήσιμος ακόμη και σε ένα σύστημα με λιγότερη μνήμη. Τα αρχεία με αντιστοίχιση μνήμης είναι ένα εύχρηστο εργαλείο όπου μέρος των περιεχομένων του αρχείου συνδέεται λογικά με τη μνήμη της διαδικασίας χωρίς να χρειάζεται να φορτωθεί ολόκληρο το αρχείο στη μνήμη. Έτσι, το σύστημα μπορεί, για παράδειγμα, να επεξεργάζεται σταδιακά μεγάλα αρχεία πολλαπλάσια από τη χωρητικότητα της μνήμης RAM. Σε ένα σύστημα 32 bit, τέτοια μεγάλα αρχεία δεν μπορούν να αντιστοιχιστούν αξιόπιστα στη μνήμη, ενώ σε ένα σύστημα 64 bit, είναι κάτι το τέλειο, χάρη στον πολύ μεγαλύτερο χώρο διευθύνσεων.

Ωστόσο, το μεγαλύτερο μέγεθος των δεικτών φέρνει επίσης ένα μεγάλο μειονέκτημα: διαφορετικά τα πανομοιότυπα προγράμματα χρειάζονται περισσότερη μνήμη σε έναν επεξεργαστή 64-bit (αυτοί οι μεγαλύτεροι δείκτες πρέπει να αποθηκευτούν κάπου). Δεδομένου ότι οι δείκτες αποτελούν συχνό μέρος των προγραμμάτων, αυτή η διαφορά μπορεί να επιβαρύνει τη μνήμη cache, η οποία με τη σειρά της κάνει ολόκληρο το σύστημα να λειτουργεί πιο αργά. Έτσι, σε προοπτική, μπορούμε να δούμε ότι αν αλλάξαμε απλώς την αρχιτεκτονική του επεξεργαστή σε 64-bit, θα επιβράδυνε πραγματικά ολόκληρο το σύστημα. Επομένως, αυτός ο παράγοντας πρέπει να εξισορροπηθεί με περισσότερες βελτιστοποιήσεις σε άλλα μέρη.

ARM64

Ο A7, ο επεξεργαστής 64-bit που τροφοδοτεί το νέο iPhone 5s, δεν είναι απλώς ένας κανονικός επεξεργαστής ARM με ευρύτερους καταχωρητές. Το ARM64 περιέχει σημαντικές βελτιώσεις σε σχέση με την παλαιότερη έκδοση 32-bit.

Επεξεργαστής Apple A7.

μητρώου

Το ARM64 διατηρεί διπλάσιο αριθμό ακεραίων καταχωρητών από τον ARM 32-bit (προσέξτε να μην μπερδεύετε τον αριθμό και το πλάτος των καταχωρητών - μιλήσαμε για το πλάτος στην ενότητα "64-bit". Έτσι το ARM64 έχει και διπλάσιο πλάτος καταχωρητές και διπλάσιο μητρώα). Το ARM 32-bit έχει 16 ακέραιους καταχωρητές: έναν μετρητή προγράμματος (PC - περιέχει τον αριθμό της τρέχουσας εντολής), έναν δείκτη στοίβας (έναν δείκτη σε μια συνάρτηση σε εξέλιξη), έναν καταχωρητή σύνδεσης (έναν δείκτη για επιστροφή μετά τη συνάρτηση τελειωμένο), και τα υπόλοιπα 13 είναι για χρήση εφαρμογής. Ωστόσο, το ARM64 έχει 32 ακέραιους καταχωρητές, συμπεριλαμβανομένου ενός καταχωρητή μηδέν, ενός καταχωρητή σύνδεσης, ενός δείκτη πλαισίου (παρόμοιος με έναν δείκτη στοίβας) και ενός δεσμευμένου για το μέλλον. Αυτό μας αφήνει με 28 καταχωρητές για χρήση εφαρμογών, υπερδιπλάσιο του ARM των 32 bit. Ταυτόχρονα, το ARM64 διπλασίασε τον αριθμό των καταχωρητών κινητής υποδιαστολής (FPU) από 16 σε 32 καταχωρητές 128 bit.

Αλλά γιατί είναι τόσο σημαντικός ο αριθμός των μητρώων; Η μνήμη είναι γενικά πιο αργή από τους υπολογισμούς της CPU και η ανάγνωση/εγγραφή μπορεί να διαρκέσει πολύ χρόνο. Αυτό θα έκανε τον γρήγορο επεξεργαστή να συνεχίσει να περιμένει τη μνήμη και θα χτυπούσαμε το φυσικό όριο ταχύτητας του συστήματος. Οι επεξεργαστές προσπαθούν να κρύψουν αυτό το μειονέκτημα με στρώματα buffer, αλλά ακόμη και ο ταχύτερος (L1) εξακολουθεί να είναι πιο αργός από τον υπολογισμό του επεξεργαστή. Ωστόσο, οι καταχωρητές είναι κελιά μνήμης απευθείας στον επεξεργαστή και η ανάγνωση/εγγραφή τους είναι αρκετά γρήγορη ώστε να μην επιβραδύνει τον επεξεργαστή. Ο αριθμός των καταχωρητών πρακτικά σημαίνει την ποσότητα της ταχύτερης μνήμης για τους υπολογισμούς του επεξεργαστή, η οποία επηρεάζει σε μεγάλο βαθμό την ταχύτητα ολόκληρου του συστήματος.

Ταυτόχρονα, αυτή η ταχύτητα χρειάζεται καλή υποστήριξη βελτιστοποίησης από τον μεταγλωττιστή, ώστε η γλώσσα να μπορεί να χρησιμοποιεί αυτούς τους καταχωρητές και να μην χρειάζεται να αποθηκεύει τα πάντα στη γενική μνήμη της εφαρμογής (την αργή).

Σύνολο οδηγιών

Το ARM64 φέρνει επίσης σημαντικές αλλαγές στο σύνολο εντολών. Ένα σύνολο εντολών είναι ένα σύνολο ατομικών λειτουργιών που μπορεί να εκτελέσει ένας επεξεργαστής (π.χ. «ADD register1 register2» προσθέτει τους αριθμούς σε δύο καταχωρητές). Οι λειτουργίες που είναι διαθέσιμες σε μεμονωμένες γλώσσες αποτελούνται από αυτές τις οδηγίες. Οι πιο σύνθετες συναρτήσεις πρέπει να εκτελούν περισσότερες εντολές, ώστε να είναι πιο αργές.

Νέα στο ARM64 είναι οδηγίες για κρυπτογράφηση AES, λειτουργίες κατακερματισμού SHA-1 και SHA-256. Έτσι, αντί για μια πολύπλοκη υλοποίηση, μόνο η γλώσσα θα καλέσει αυτήν την οδηγία - η οποία θα επιφέρει τεράστια ταχύτητα στον υπολογισμό τέτοιων συναρτήσεων και ελπίζουμε να προσθέσει ασφάλεια στις εφαρμογές. Π.χ. το νέο Touch ID χρησιμοποιεί επίσης αυτές τις οδηγίες στην κρυπτογράφηση, επιτρέποντας πραγματική ταχύτητα και ασφάλεια (θεωρητικά, ένας εισβολέας θα πρέπει να τροποποιήσει τον ίδιο τον επεξεργαστή για να έχει πρόσβαση στα δεδομένα - κάτι που είναι τουλάχιστον ανέφικτο δεδομένου του μικροσκοπικού του μεγέθους).

Συμβατότητα με 32bit

Είναι σημαντικό να αναφέρουμε ότι το A7 μπορεί να λειτουργήσει πλήρως σε λειτουργία 32-bit χωρίς να χρειάζεται εξομοίωση. Σημαίνει ότι το νέο iPhone 5s μπορεί να εκτελεί εφαρμογές που έχουν μεταγλωττιστεί σε 32-bit ARM χωρίς καμία επιβράδυνση. Ωστόσο, τότε δεν μπορεί να χρησιμοποιήσει τις νέες λειτουργίες ARM64, επομένως αξίζει πάντα να φτιάχνετε μια ειδική κατασκευή μόνο για το A7, η οποία θα πρέπει να λειτουργεί πολύ πιο γρήγορα.

Αλλαγές χρόνου εκτέλεσης

Ο χρόνος εκτέλεσης είναι ο κώδικας που προσθέτει λειτουργίες στη γλώσσα προγραμματισμού, τις οποίες μπορεί να χρησιμοποιήσει ενώ εκτελείται η εφαρμογή, μέχρι τη μετάφραση. Δεδομένου ότι η Apple δεν χρειάζεται να διατηρήσει τη συμβατότητα της εφαρμογής (ότι ένα δυαδικό 64-bit εκτελείται σε 32-bit), θα μπορούσε να αντέξει οικονομικά να κάνει μερικές ακόμη βελτιώσεις στη γλώσσα Objective-C.

Ένα από αυτά είναι το λεγόμενο με ετικέτα δείκτη (σημειωμένη ένδειξη). Κανονικά, τα αντικείμενα και οι δείκτες σε αυτά τα αντικείμενα αποθηκεύονται σε ξεχωριστά μέρη της μνήμης. Ωστόσο, οι νέοι τύποι δείκτη επιτρέπουν σε κλάσεις με λίγα δεδομένα να αποθηκεύουν αντικείμενα απευθείας στον δείκτη. Αυτό το βήμα εξαλείφει την ανάγκη να εκχωρήσετε μνήμη απευθείας για το αντικείμενο, απλώς δημιουργήστε έναν δείκτη και το αντικείμενο μέσα σε αυτόν. Οι δείκτες με ετικέτα υποστηρίζονται μόνο σε αρχιτεκτονική 64 bit και λόγω του γεγονότος ότι δεν υπάρχει πλέον αρκετός χώρος σε έναν δείκτη 32 bit για την αποθήκευση αρκετά χρήσιμων δεδομένων. Επομένως, το iOS, σε αντίθεση με το OS X, δεν υποστήριζε ακόμη αυτήν τη δυνατότητα. Ωστόσο, με την άφιξη του ARM64, αυτό αλλάζει και το iOS έχει φτάσει στο OS X και από αυτή την άποψη.

Αν και οι δείκτες έχουν μήκος 64 bit, στο ARM64 χρησιμοποιούνται μόνο 33 bit για τη διεύθυνση του ίδιου του δείκτη. Και αν είμαστε σε θέση να αποκαλύψουμε αξιόπιστα τα υπόλοιπα bit του δείκτη, μπορούμε να χρησιμοποιήσουμε αυτό το διάστημα για να αποθηκεύσουμε πρόσθετα δεδομένα – όπως στην περίπτωση των αναφερόμενων δεικτών με ετικέτα. Εννοιολογικά, αυτή είναι μια από τις μεγαλύτερες αλλαγές στην ιστορία του Objective-C, αν και δεν είναι εμπορεύσιμο χαρακτηριστικό - έτσι οι περισσότεροι χρήστες δεν θα γνωρίζουν πώς η Apple προχωρά το Objective-C.

Όσον αφορά τα χρήσιμα δεδομένα που μπορούν να αποθηκευτούν στον υπόλοιπο χώρο ενός τέτοιου δείκτη με ετικέτα, το Objective-C, για παράδειγμα, το χρησιμοποιεί τώρα για να αποθηκεύσει το λεγόμενο αριθμός αναφοράς (αριθμός αναφορών). Προηγουμένως, το πλήθος αναφοράς ήταν αποθηκευμένο σε διαφορετική θέση στη μνήμη, σε έναν πίνακα κατακερματισμού που είχε προετοιμαστεί για αυτό, αλλά αυτό θα μπορούσε να επιβραδύνει ολόκληρο το σύστημα στην περίπτωση μεγάλου αριθμού κλήσεων alloc/dealloc/retain/release. Ο πίνακας έπρεπε να κλειδωθεί λόγω της ασφάλειας του νήματος, επομένως ο αριθμός αναφοράς δύο αντικειμένων σε δύο νήματα δεν μπορούσε να αλλάξει ταυτόχρονα. Ωστόσο, αυτή η τιμή εισάγεται πρόσφατα στα υπόλοιπα λεγόμενα isa δείκτες. Αυτό είναι άλλο ένα δυσδιάκριτο, αλλά τεράστιο πλεονέκτημα και επιτάχυνση στο μέλλον. Ωστόσο, αυτό δεν θα μπορούσε ποτέ να επιτευχθεί σε μια αρχιτεκτονική 32-bit.

Πληροφορίες σχετικά με τα συσχετισμένα αντικείμενα, εάν το αντικείμενο αναφέρεται ασθενώς, εάν είναι απαραίτητο να δημιουργηθεί ένας καταστροφέας για το αντικείμενο κ.λπ., εισάγονται επίσης πρόσφατα στην υπόλοιπη θέση των δεικτών προς τα αντικείμενα. Χάρη σε αυτές τις πληροφορίες, το Objective-C Ο χρόνος εκτέλεσης είναι σε θέση να επιταχύνει θεμελιωδώς τον χρόνο εκτέλεσης, κάτι που αντικατοπτρίζεται στην ταχύτητα κάθε εφαρμογής. Από τη δοκιμή, αυτό σημαίνει περίπου 40-50% επιτάχυνση όλων των κλήσεων διαχείρισης μνήμης. Απλώς μεταβαίνοντας σε δείκτες 64-bit και χρησιμοποιώντας αυτό το νέο χώρο.

záver

Αν και οι ανταγωνιστές θα προσπαθήσουν να διαδώσουν την ιδέα ότι η μετάβαση σε μια αρχιτεκτονική 64-bit είναι περιττή, θα γνωρίζετε ήδη ότι αυτή είναι απλώς μια πολύ ανενημέρωτη γνώμη. Είναι αλήθεια ότι η μετάβαση σε 64-bit χωρίς προσαρμογή της γλώσσας ή των εφαρμογών σας δεν σημαίνει πραγματικά τίποτα - επιβραδύνει ακόμη και ολόκληρο το σύστημα. Αλλά το νέο A7 χρησιμοποιεί ένα σύγχρονο ARM64 με ένα νέο σετ εντολών και η Apple έκανε τον κόπο να εκσυγχρονίσει ολόκληρη τη γλώσσα Objective-C και να εκμεταλλευτεί τις νέες δυνατότητες - εξ ου και η υποσχεθείσα επιτάχυνση.

Εδώ έχουμε αναφέρει πολλούς λόγους για τους οποίους μια αρχιτεκτονική 64-bit είναι το σωστό βήμα προς τα εμπρός. Είναι μια ακόμη επανάσταση «κάτω από το καπό», χάρη στην οποία η Apple θα προσπαθήσει να παραμείνει στην πρώτη γραμμή όχι μόνο με σχεδιασμό, περιβάλλον χρήστη και πλούσιο οικοσύστημα, αλλά κυρίως με τις πιο σύγχρονες τεχνολογίες της αγοράς.

Πηγή: mikeash.com
.