Αρχιτεκτονική συνόλου εντολών

Το σύνολο εντολών (instruction set) ή αρχιτεκτονική συνόλου εντολών (instruction set architecture, ISA), είναι το τμήμα της αρχιτεκτονικής υπολογιστών που συνδέεται με τον προγραμματισμό και περιλαμβάνει τους τύπους δεδομένων της μηχανής, τις εντολές, τους καταχωρητές, τους τρόπους διευθυνσιοδότησης (addressing modes), την αρχιτεκτονική μνήμης, τον χειρισμό διακοπών και εξαιρέσεων, καθώς και την εξωτερική είσοδο/έξοδο (Input/output, I/O). Μια αρχιτεκτονική συνόλου εντολών περιλαμβάνει το σύνολο των μνημονικών εντολών (opcodes) της γλώσσας μηχανής, και τις εντολές που υλοποιούνται από τον ίδιο τον επεξεργαστή. [1]

Η αρχιτεκτονική συνόλου εντολών διαφέρει από τη μικροαρχιτεκτονική, η οποία είναι το σύνολο των τεχνικών σχεδίασης επεξεργαστών, που χρησιμοποιείται για την υλοποίηση του συνόλου εντολών. Υπολογιστές με διαφορετικές μικροαρχιτεκτονικές μπορούν να έχουν το ίδιο σύνολο εντολών. Για παράδειγμα, ο Pentium της Intel και ο Athlon της AMD υλοποιούν σχεδόν ίδιες εκδόσεις του συνόλου εντολών x86, αλλά έχουν σημαντικά διαφορετικές εσωτερικές σχεδιάσεις. Η αρχιτεκτονική συνόλου εντολών IA32 σχεδιάστηκε από την εταιρία Intel για του επεξεργαστές της ίδιας εταιρίας. Η ανταγωνιστική εταιρία AMD υλοποίησε επεξεργαστές διαφορετικής αρχιτεκτονικής από αυτούς της Intel αλλά χρησιμοποίησε το ίδιο ακριβώς σύνολο εντολών IA32 (αρχικά σχεδιασμένο μόνο για Intel). Το 2002 περίπου η AMD επέκτεινε το σύνολο εντολών Intel-IA32 στο νέο σύνολο x86-64 για να υποστηρίζονται συστήματα 64 bit τα οποία μπορούν να χρησιμοποιηθούν χώρους διεύθυνσης μνήμης μέχρι 256 terrabytes ( bytes). Η Intel με το IA32 απευθυνόταν σε μηχανήματα 32bit όπου μπορούσαν να χρησιμοποιούν χώρο διεύθυνσης μνήμης μέχρι 4 gbytes ( bytes).Η AMD εκτός από το σύνολο εντολών x86-64 την εποχή εκεί κατάφερε και έβγαλε στην αγορά επεξεργαστή γρηγορότερο από 1 GHz. [2] Η επέκταση της AMD στο νέο σύνολο x86-64 επέτρεψε να μπορούν να χρησιμοποιηθούν χώροι διεύθυνσης μνήμης μέχρι 256 terrabytes ( bytes). Το σύνολο εντολών x86-64 στην συνέχεια υιοθετήθηκε και από την Intel για την κατασκευή επεξεργαστών. Το σύνολο εντολών x86-64 ενσωματώνει λειτουργίες για δημιουργία βελτιωμένου κώδικα μηχανής. [3]

Κάποιες εικονικές μηχανής (virtual machines) που υποστηρίζουν κώδικα byte (bytecode), όπως αυτές της Smalltalk και της Java, καθώς και η εικονική μηχανή Common Language Runtime της Microsoft σαν αρχιτεκτονική συνόλου εντολών, την υλοποιούν μεταφράζοντας τον κώδικα byte από συχνά χρησιμοποιούμενα μονοπάτια κώδικα σε κώδικα μηχανής, και εκτελούν τα λιγότερο συχνά χρησιμοποιούμενα μονοπάτια με διερμηνεία. Για παράδειγμα, με αυτόν τον τρόπο, η Transmeta υλοποίησε το σύνολο εντολών x86 σε επεξεργαστές VLIW.

Η TIMI (Technology-Independent Machine Interface) ήταν μια ιδιαίτερη αρχιτεκτονική συνόλου εντολών που εμφανίστηκε στους IBM System/38 και IBM AS/400. Υλοποιήθηκε από λογισμικό χαμηλού επιπέδου που μετέφραζε τον κώδικα TIMI σε κώδικα μηχανής, παρέχοντας λειτουργίες που σήμερα θα αποδίδονταν σε μια «εικονική μηχανή» (virtual machine). Σχεδιάστηκε για να αυξήσει τον χρόνο ζωής της πλατφόρμας και των εφαρμογών της, επιτρέποντας τη μεταφορά ολόκληρης της πλατφόρμας σε πολύ διαφορετικό υλικό χωρίς να χρειάζεται μετατροπή στο λογισμικό εκτός από τον μεταφραστή από TIMI σε γλώσα μηχανής, και από τον κώδικα που υλοποιεί τις υπηρεσίες που χρησιμοποιούνται από τον κώδικα μηχανής που προκύπτει. Αυτό επέτρεψε στην IBM να μεταφέρει την πλατφόρμα AS/400 από μια παλιά αρχιτεκτονική CISC στην νεότερη αρχιτεκτονική POWER χωρίς να πρέπει να γράψει πάλι ή να μεταγλωττίσει μέρη του λειτουργικού συστήματος ή του λογισμικού, εκτός από τον κώδικα χαμηλού επιπέδου που αναφέρθηκε πριν.

Η γλώσσα μηχανής κατασκευάζεται από διακριτές εντολές (statements, instructions). Στην αρχιτεκτονική που εκτελείται, μια εντολή μπορεί να ορίζει:

  • Συγκεκριμένους καταχωρητές για αριθμητικές πράξεις, σχηματισμό διευθύνσεων μνήμης ή λειτουργίες ελέγχου
  • Συγκεκριμένες θέσεις μνήμης ή μετατοπίσεις (offsets)
  • Συγκεκριμένους τρόπους σχηματισμού διευθύνσεων (addressing modes) που χρησιμοποιούνται για την ερμηνεία των τελεστών

Συνδυάζοντας αυτές τις απλές εντολές μπορούν να προκύψουν πιο σύνθετες εντολές, οι οποίες (σε μια αρχιτεκτονική φον Νόιμαν) εκτελούνται ακολουθιακά ή όπως ορίζουν οι εντολές ροής ελέγχου (control flow).

Κάποιες εντολές που υπάρχουν στα περισσότερα σύνολα εντολών είναι οι εξής:

  • Χειρισμός δεδομένων και λειτουργίες μνήμης
    • θέσε (set) έναν καταχωρητή (που είναι μια προσωρινή μικρή μνήμη στον επεξεργαστή) σε μια σταθερή τιμή
    • μετακίνησε (move) δεδομένα από μια θέση μνήμης σε έναν καταχωρητή (ή αντίστροφα). Αυτό γίνεται για να ληφθούν τα δεδομένα που χρειάζεται ένας υπολογισμός που ακολουθεί, ή για να αποθηκευτεί το αποτέλεσμα ενός υπολογισμού.
    • διάβασμα (read) και γράψιμο (write) δεδομένων σε συσκευές υλικού
  • Αριθμητική και Λογική
    • πρόσθεσε (add), αφαίρεσε (subtract), πολλαπλασίασε (multiply), ή διαίρεσε (divide) τις τιμές δύο καταχωρητών, τοποθετώντας το αποτέλεσμα σε έναν καταχωρητή, ίσως θέτωντας έναν ή περισσότερους κωδικούς κατάστασης (flags, condition codes) σε έναν καταχωρητή κατάστασης (status register)
    • λειτουργίες μεταξύ bit (bitwise operations), όπως η σύζευξη και η διάζευξη των αντίστοιχων bit σε δύο καταχωρητές, ή η άρνηση κάθε bit σε έναν καταχωρητή
    • σύγκρινε (compare) τις τιμές δύο καταχωρητών (για παράδειγμα, για να βρεθεί αν η μία είναι μεγαλύτερη ή αν είναι ίσες)
  • Ροή ελέγχου
    • διακλάδωση (branch) σε κάποια άλλη θέση στο πρόγραμμα, για να συνεχίσει η εκτέλεση εντολών από εκεί
    • διακλάδωση υπό συνθήκη (conditionally branch) σε μια άλλη θέση στο πρόγραμμα, αν ισχύει κάποια συνθήκη
    • έμμεση διακλάδωση (indirectly branch) σε μια άλλη θέση, σώζοντας την θέση της επόμενης εντολής, για να αποτελεί ένα σημείο επιστροφής (από μια κλήση)

Κάποιοι υπολογιστές περιλαμβάνουν "σύνθετες" εντολές στο σύνολο εντολών τους. Μια "σύνθετη" εντολή κάνει κάτι που μπορεί να χρειάζεται περισσότερες από μια εντολές σε άλλους υπολογιστές. Τέτοιες εντολές είναι αυτές που χρειάζονται παραπάνω από ένα βήματα, ελέγχουν πολλαπλές λειτουργικές μονάδες ή κάνουν κάποια λειτουργία σε μεγαλύτερη κλίμακα από τις περισσότερες απλές εντολές που υλοποιεί ένας επεξεργαστής. Παραδείγματα "σύνθετων" εντολών είναι:

  • η ταυτόχρονη αποθήκευση πολλών καταχωρητών στη στοίβα
  • η μετακίνηση μεγάλων τμημάτων μνήμης
  • η αριθμητική μιγαδικών αριθμών ή αριθμών κινητής υποδιαστολής (ημίτονο, συνημίτονο, τετραγωνική ρίζα, κλπ.)
  • η εκτέλεση μιας εντολής δοκιμή-και-ανάθεση (test-and-set)
  • οι εντολές που χρησιμοποιούν την ALU με δεδομένα από τη μνήμη αντί από κάποιον καταχωρητή

Ένας τύπος σύνθετων εντολών που έχει γίνει πολύ δημοφιλής πρόσφατα είναι η λειτουργία SIMD (Single-Instruction-Multiple-Data, μια-εντολή-πολλά-δεδομένα) ή διανυσματική εντολή (vector instruction), μια λειτουργία που εκτελεί την ίδια αριθμητική πράξη σε πολλά δεδομένα ταυτόχρονα. Η SIMD μπορεί να χειρίζεται μεγάλα διανύσματα και πίνακες πολύ γρήγορα. Οι εντολές SIMD επιτρέπουν τον εύκολο παραλληλισμό των αλγορίθμων που συναντώνται συχνά στην επεξεργασία ήχου, εικόνας και βίντεο. Πολλές υλοποιήσεις SIMD έχουν κυκλοφορήσει στην αγορά με ονόματα όπως το MMX, το 3DNow! και το AltiVec.

Μια εντολή μπορεί να έχει πολλά πεδία, που ορίζουν ποια λογική λειτουργία θα εκτελεστεί, ενώ μπορεί επίσης να περιέχει διευθύνσεις προέλευσης και προορισμού ή σταθερές τιμές. Αυτή είναι η εντολή "Πρόσθεσε" ("Add") του MIPS, η οποία επιτρέπει την επιλογή των καταχωρητών προέλευσης και προορισμού, και την εισαγωγή μιας μικρής σταθεράς.

Στις παραδοσιακές αρχιτεκτονικές, μια εντολή περιλαμβάνει έναν κωδικό (opcode) που ορίζει τη λειτουργία που θα εκτελεστεί, όπως για παράδειγμα "πρόσθεσε περιεχόμενα της μνήμης στον καταχωρητή" και μηδέν ή παραπάνω τελεστέους (operand), που μπορεί να ορίζουν κάποιον καταχωρητή, θέσεις μνήμης, ή σταθερές. Οι τελεστέοι μπορεί να περιλαμβάνουν τρόπους σχηματισμού διευθύνσεων (addressing modes), οι οποίοι να καθορίζουν τη σημασία τους, ή να βρίσκονται σε σταθερά πεδία.

Στις αρχιτεκτονικές πολύ μεγάλης λέξης εντολής (very long instruction word, VLIW), στις οποίες ανήκουν πολλές αρχιτεκτονικές μικροκώδικα, πολλοί ταυτόχρονοι κωδικοί και τελεστέοι ορίζονται με μια μόνο εντολή.

Κάποια σπάνια σύνολα εντολών δεν έχουν πεδίο κωδικού (όπως οι Transport Triggered Architectures (TTA) ή η εικονική μηχανή της Forth), μόνο τελεστέους. Άλλα ασυνήθιστα σύνολα εντολών χωρίς τελεστέους ("0-operand") δεν έχουν πεδία για τον ορισμό των τελεστέων, όπως κάποιες μηχανές στοίβας, για παράδειγμα η NOSC [1].

Το μέγεθος ή μήκος μιας εντολής διαφέρει σημαντικά, από τέσσερα μπιτ σε κάποιους μικροελεγκτές σε εκατοντάδες μπιτ σε κάποια συστήματα VLIW. Οι επεξεργαστές που χρησιμοποιούνται στους προσωπικούς υπολογιστές, στους μεγάλους υπολογιστές (mainframes), και στους υπερυπολογιστές έχουν μεγέθη εντολής που κυμαίνονται από τα 8 μέχρι τα 64 bit (η πιο μεγάλη εντολή του x86 είναι 15 byte, δηλαδή 120 bit). Σε ένα σύνολο εντολών, διαφορετικές εντολές μπορεί να έχουν διαφορετικά μεγέθη. Σε κάποιες αρχιτεκτονικές, ειδικά στις RISC, οι εντολές έχουν σταθερό μήκος, συνήθως ίσο με το μέγεθος λέξης της αρχιτεκτονικής. Σε άλλες αρχιτεκτονικές, οι εντολές έχουν μεταβαλλόμενο μήκος, συνήθως ακέραια πολλαπλάσια του byte ή μισής λέξης (halfword).

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

Η σχεδίαση ενός συνόλου εντολών είναι πολύπλοκο θέμα. Στην ιστορία των μικροεπεξεργαστών συναντώνται δύο προσεγγίσεις. Η πρώτη ήταν η CISC (Complex Instruction Set Computer), η οποία είχε πολλές διαφορετικές εντολές. Κατά τη δεκαετία του 1970 όμως, εταιρείες όπως η IBM βρήκαν μετά από έρευνα ότι πολλές εντολές του συνόλου εντολών μπορούσαν να παραλειφθούν. Το αποτέλεσμα ήταν η αρχιτεκτονική RISC (Reduced Instruction Set Computer), η οποία χρησιμοποιεί μικρότερο σύνολο εντολών. Ένα απλούστερο σύνολο εντολών μπορεί να προσφέρει υψηλότερες ταχύτητες, μικρότερο μέγεθος μικροεπεξεργαστή και μειωμένη κατανάλωση ενέργειας. Ένα πιο πολύπλοκο σύνολο εντολών όμως μπορεί να εκτελεί αποδοτικά συχνές λειτουργίες, να εκμεταλλεύεται καλύτερα την μνήμη και την κρυφή μνήμη (cache) ή να απλοποιεί τον προγραμματισμό.

Κάποιοι σχεδιαστές συνόλων εντολών διατηρούν κάποιους κωδικούς εντολών για κλήσεις συστήματος ή διακοπές λογισμικού. Για παράδειγμα ο MOS Technology 6502 χρησιμοποιεί την 00H, ο Zilog Z80 χρησιμοποιεί τους οκτώ κωδικούς C7,CF,D7,DF,E7,EF,F7,FFH[4] ενώ ο Motorola 68000 χρησιμοποιεί κωδικούς στο εύρος A000..AFFFH (ο δείκτης Η σημαίνει δεκαεξαδικό σύστημα).

Οι εικονικές μηχανές μπορούν να υλοποιηθούν γρήγορα και εύκολα αν ένα σύνολο εντολών ικανοποιεί τις απαιτήσεις εικονικοποίησης των Πόπεκ και Γκόλντμπεργκ (Popek and Goldberg virtualization requirements).

Σε συστήματα με πολλούς επεξεργαστές οι αλγόριθμοι συγχρονισμού χωρίς αναμονή (non-blocking synchronization) είναι πιο εύκολο νε υλοποιηθούν αν το σύνολο εντολών υποστηρίζει κάποια λειτουργία του τύπου «φόρτωσε και αύξησε κατά ένα» ("fetch-and-increment") ή «φόρτωσε συνδεδεμένο/αποθήκευσε συνθήκη» ("load linked/store conditional", "LL/SC") ή «σύγκρινε και αντάλλαξε ατομικά» ("atomic compare and swap").

Υλοποίηση του συνόλου εντολών

[Επεξεργασία | επεξεργασία κώδικα]

Κάθε σύνολο εντολών μπορεί να υλοποιηθεί με πολλούς τρόπους. Όλοι αυτοί οι τρόποι θα δώσουν το ίδιο προγραμματιστικό μοντέλο και θα μπορούν να εκτελούν τα ίδια εκτελέσιμα δυαδικά προγράμματα. Οι διαφορετικοί τρόποι υλοποίησης όμως επηρεάζουν άλλες παραμέτρους όπως για παράδειγμα το κόστος, η ταχύτητα, η κατανάλωση ενέργειας ή το μέγεθος του μικροεπεξεργαστή.

Όταν σχεδιάζει την μικροαρχιτεκτονική ενός επεξεργαστή, ένας μηχανικός χρησιμοποιεί «μπλοκ» από έτοιμα κυκλώματα όπως οι αθροιστές, οι πολυπλέκτες, οι μετρητές, οι καταχωρητές, οι αριθμητικές και λογικές μονάδες, κ.α. Στη συνέχεια χρησιμοποιείται μια γλώσσα μεταφοράς καταχωρητών (register transfer language) που να περιγράφει την αποκωδικοποίηση και την διάταξη για εκτέλεση κάθε εντολής του συνόλου εντολών, σε αυτήν την συγκεκριμένη μικροαρχιτεκτονική. Υπάρχουν δύο βασικοί τρόποι να κατασκευαστεί μια μονάδα ελέγχου (control unit) που να υλοποιεί αυτήν την περιγραφή (αν και πολλές σχεδιάσεις δανείζονται στοιχεία και από τους δύο):

  1. Οι πρώτες σχεδιάσεις υπολογιστών και κάποιοι από τους απλότερους υπολογιστές RISC υλοποιούσαν κατευθείαν με κυκλώματα την αποκωδικοποίηση και την διάταξη των εντολών (όπως υλοποιουσαν και την υπόλοιπη μικροαρχιτεκτονική).
  2. Άλλες σχεδιάσεις χρησιμοπιούν ρουτίνες μικροκώδικα ή πίνακες για αυτόν τον σκοπό—συνήθως σαν ROM μέσα στο τσιπ ή σαν προγραμματιζόμενες λογικές συστοιχίες (Programmable Logic Arrays, PLA) ενώ στο παρελθόν είχαν χρησιμοποιηθεί και ξεχωριστές μνήμες RAM.

Υπάρχουν κάποιες νέες σχεδιάσεις επεξεργαστών που μεταγλωττίζουν τον σύνολο εντολών σε μια εγγράψιμη RAM ή μνήμη φλας μέσα στην κεντρική μονάδα επεξεργασίας (όπως ο επεξεργαστής Rekursiv και ο Imsys Cjip),[5] ή σε ένα FPGA (reconfigurable computing). Ένα παλαιότερο παράδειγμα είναι ο MCP-1600 της Western Digital, ο οποίος χρησιμοποιεί μια ξεχωριστή ROM αποκλειστικά για τον μικροκώδικα.

Μια αρχιτεκτονική συνόλου εντολών μπορεί να προσομοιωθεί σε λογισμικό από έναν διερμηνέα. Αυτό είναι πιο αργό σε σχέση με την απευθείας εκτέλεση προγραμμάτων σε υλικό, λόγω της επιβάρυνσης της διερμηνείας, εκτός αν το υλικό που εκτελεί τον προσομοιωτή είναι πολύ γρηγορότερο. Σήμερα συχνά οι κατασκευαστές νέων αρχιτεκτονικών συνόλου εντολών παρέχουν προσομοιωτές λογισμικού στους προγραμματιστές πριν να είναι έτοιμη η υλοποίηση του υλικού.

Συχνά οι λεπτομέρειες της υλοποίησης επηρεάζουν την επιλογή των εντολών του συνόλου εντολών. Για παράδειγμα, πολλές υλοποιήσεις της σωλήνωσης εντολών (instruction pipeline) επιτρέπουν μόνο μια φόρτωση ή μια εγγραφή στη μνήμη ανά εντολή, με αποτέλεσμα να προκύπτει μια αρχιτεκτονική RISC τύπου φόρτωσης-αποθήκευσης (load-store architecture). Ένα άλλο παράδειγμα είναι οι πρώτοι τρόποι με τους οποίους υλοποιήθηκε η σωλήνωση εντολών με χρήση σχισμής καθυστέρησης (delay slot).

Οι απαιτήσεις της ψηφιακής επεξεργασίας σήματος υψηλής ταχύτητας αντίθετα πιέζουν για την υλοποίηση εντολών με συγκεκριμένο τρόπο. Για παράδειγμα, για την υλοποίηση γρήγορων ψηφιακών φίλτρων, η εντολή MAC σε έναν κλασικό ψηφιακό επεξεργαστή σήματος (DSP) πρέπει να υλοποιηθεί με χρήση κάποιου τύπου αρχιτεκτονικής Χάρβαρντ που να μπορεί να φέρνει μια εντολή και δύο λέξεις δεδομένων ταυτόχρονα, και να χρειάζεται έναν πολλαπλασιαστή που να πολλαπλασιάζει-αθροίζει σε έναν κύκλο.

Η μνήμη ήταν ακριβή στις πρώτους υπολογιστές με αποτέλεσμα τα προγράμματα να έπρεπε να είναι όσο πιο μικρά γινόταν ώστε να χωρούν στην περιορισμένη μνήμη και το συνολικό μέγεθος των εντολών που χρειάζονταν για μια λειτουργία, η πυκνότητα κώδικα (code density), ήταν βασικό χαρακτηριστικό κάθε συνόλου εντολών. Οι υπολογιστές με υψηλή πυκνότητα κώδικα είχαν (και ακόμα έχουν) εντολές για την είσοδο σε διαδικασία (procedure entry), επιστροφή με παραμέτρους (parameterized return), δομές επανάληψης (loops) κλπ. (και για αυτό ονομάστηκαν εκ των υστέρων υπολογιστές σύνθετου συνόλου εντολών ή CISC). Συνήθως όμως οι εντολές "CISC" απλά συνδύαζαν μια βασική αριθμητική ή λογική λειτουργία με την προσπέλαση ενός ή περισσότερων τελεστέων στη μνήμη (χρησιμοποιώντας διάφορους τρόπους σχηματισμού διευθύνσεων: άμεσο, έμμεσο, με δείκτη, κλπ.). Κάποιες αρχιτεκτονικές μπορεί να επιτρέπουν δύο ή τρεις τελεστέους (μαζί με το αποτέλεσμα) από τη μνήμη ή μπορούν να εκτελούν λειτουργίες όπως η αυτόματη αύξηση δεικτών στη μνήμη κατά ένα. Τα σύνολα εντολών που υλοποιούνται σε λογισμικό μπορεί να έχουν ακόμα πιο σύνθετες και ισχυρές εντολές.

Οι υπολογιστές περιορισμένου συνόλου εντολών (RISC), αρχικά υλοποιήθηκαν σε μεγάλη κλίμακα στη διάρκεια μιας περιόδου που τα υποσυστήματα μνήμης μεγάλωναν με γρήγορους ρυθμούς και θυσιάζουν την πυκνότητα κώδικα με σκοπό την απλοποίηση των κυκλωμάτων τους, ώστε να μπορούν να έχουν μεγαλύτερη συχνότητα και περισσότερους καταχωρητές και άρα να είναι πιο γρήγοροι. Οι εντολές RISC συχνά εκτελούν μόνο μια λειτουργία, όπως η πρόσθεση καταχωρητών ή η φόρτωση δεδομένων από μια θέση μνήμης σε έναν καταχωρητή ενώ συνήθως χρησιμοποιούν σταθερό μέγεθος εντολής, σε αντίθεση με ένα τυπικό σύνολο εντολών CISC που μπορεί να έχει εντολές μικρότερες από αυτό το σταθερό μήκος. Ο χειρισμός εντολών σταθερού μήκους είναι πιο εύκολος σε σχέση με τις εντολές μεταβλητού μήκους για διάφορους λόγους (για παράδειγμα δεν χρειάζεται να ελεγχθεί αν η εντολή χωράει σε μια γραμμή της κρυφής μνήμης ή αν ευθυγραμμίζεται με το όριο μια σελίδας εικονικής μνήμης[6]), με αποτέλεσμα να είναι πιο εύκολο να βελτιστοποιηθεί για μεγαλύτερη ταχύτητα εκτέλεσης. Όμως, επειδή οι υπολογιστές RISC συνήθως χρειάζονται περισσότερες και μεγαλύτερες εντολές για να υλοποιήσουν μια λειτουργία, κάνουν λιγότερο καλή χρήση της διαμεταγωγής του διαύλου και των κρυφών μνημών.

Οι υπολογιστές μικρού συνόλου εντολών (MISC) είναι μηχανές στοίβας (stack machines), όπου υπάρχουν λίγες εντολές (16-64), με αποτέλεσμα πολλές εντολές να μπορούν να χωρέσουν σε μια λέξη μηχανής. Αυτοί οι επεξεργαστές χρειάζονται λιγότερο πυρίτιο για την υλοποίησή τους και για αυτό μπορούν να υλοποιηθούν σε μορφή FPGA ή πολυπύρηνων (multi-core) επεξεργαστών. Η πυκνότητα κώδικα μοιάζει με αυτήν των RISC και η αυξημένη πυκνότητα εντολών εξισορροπείται από το γεγονός ότι χρειάζονται περισσότερες εντολές για μια λειτουργία.

Έχει γίνει επίσης έρευνα πάνω στην συμπίεση εκτελέσιμων (executable compression) για τη βελτίωση της πυκνότητας κώδικας. Η μαθηματική θεωρία της πολυπλοκότητα Κολμογκόροβ (Kolmogorov complexity) περιγράφει τα ανοιχτά προβλήματα και τους περιορισμούς αυτής της προσέγγισης.

Αριθμός τελεστέων

[Επεξεργασία | επεξεργασία κώδικα]

Τα σύνολα εντολών κατηγοριοποιούνται με βάση τον μέγιστο αριθμό τελεστέων που δηλώνονται ρητά στις εντολές τους.

(Στα παραδείγματα που ακολουθούν, τα a, b, και c είναι (άμεσες ή υπολογισμένες) διευθύνσεις θέσεων μνήμης, ενώ ονόματα της μορφής reg1 αναφέρονται σε καταχωρητές του υπολογιστή.)

  • 0 τελεστέων (υπολογιστές μηδέν διευθύνσεων, zero-address machines) ή μηχανές στοίβας (stack machines): Όλες οι αριθμητικές λειτουργίες χρησιμοποιούν το τελευταίο ή τα δύο τελευταία στοιχεία της στοίβας, και χρησιμοποιούνται εντολές ενός τελεστέου για την τοποθέτηση (push) και την αφαίρεση (pop) από τη στοίβα: push a, push b, add, pop c.
  • 1 τελεστέου (υπολογιστές μιας διεύθυνσης, one-address machines) ή μηχανές συσσώρευσης (accumulator machines), που περιλαμβάνουν τις πρώτους υπολογιστές και πολλούς μικρούς μικροελεγκτές: οι περισσότερες εντολές έχουν μόνο έναν τελεστέο στα δεξιά (μια σταθερά, έναν καταχωρητή ή μια θέση μνήμης), θεωρώντας έμμεσα ότι ο συσσωρευτής (accumulator) είναι ο τελεστέος στα αριστερά (καθώς και επίσης ο προορισμός του αποτελέσματος, αν χρειάζεται κάποιος τέτοιος): load a, add b, store c. Με αυτήν την κατηγορία σχετίζονται και οι μηχανές στοίβας που συχνά επιτρέπουν ρητά έναν τελεστέο σε αριθμητικές εντολές: push a, add b, pop c.
  • 2 τελεστέων — πολλοί υπολογιστές CISC και RISC εντάσσονται σε αυτήν την κατηγορία:
    • CISC — όταν οι εντολές μπορούν να έχουν μόνο έναν τελεστέο μνήμης ανά εντολή, λειτουργούν με ακολουθίες εντολών της μορφής load a,reg1; add reg1,b; store reg1,c, ακόμα και αν φορτώνουν και αποθηκεύουν στην ίδια θέση μνήμης
    • CISC — move a->c; add c+=b.
    • RISC — επειδή χρειάζεται ρητή φόρτωση από τη μνήμη, οι εντολές θα είναι: load a,reg1; load b,reg2; add reg1,reg2; store reg2,c
  • 3 τελεστέων, που επιτρέπουν την καλύτερη επαναχρησιμοποίηση των δεδομένων:[6]
    • CISC — είτε γίνεται η μοναδική εντολή add a,b,c, είτε (συνηθέστερα): move a,reg1; add reg1,b,c επειδή οι περισσότεροι υπολογιστές περιορίζονται σε δύο τελεστέους μνήμης.
    • RISC — οι αριθμητικές εντολές χρησιμοποιούν μόνο καταχωρητές επομένως χρειάζονται ρητές εντολές φόρτωσης/αποθήκευσης δύο τελεστέων: load a,reg1; load b,reg2; add reg1+reg2->reg3; store reg3,c - σε αντίθεση με τις περιπτώσεις 2 και 1 τελεστέου, αυτό αφήνει σε καταχωρητές και τις τρεις τιμές a, b, και c[6].
  • περισσότερων τελεστέων—κάποιοι υπολογιστές CISC επιτρέπουν τη χρήση διάφορων τρόπων σχηματισμού διευθύνσεων, επιτρέποντας περισσότερους από 3 τελεστέους (καταχωρητές ή πρόσβαση στη μνήμη), όπως η εντολής πολυωνυμικής αποτίμησης "POLY" του VAX.

Λόγω του μεγάλου αριθμού bit που χρειάζονται για την κωδικοποίηση των τριών καταχωρητών μιας εντολής 3 τελεστέων, οι επεξεργαστές RISC που χρησιμοποιούν εντολές 16-bit είναι μηχανές 2 τελεστέων, όπως ο Atmel AVR, ο TI MSP430 και κάποιες εκδόσεις του ARM Thumb. Οι επεξεργαστές RISC που χρησιμοποιούν εντολές 32-bit είναι συνήθως μηχανές 3 τελεστέων, όπως οι επεξεργαστές που υλοποιούν την αρχιτεκτονική Power, την αρχιτεκτονική SPARC, την αρχιτεκτονική MIPS, την αρχιτεκτονική ARM και την αρχιτεκτονική AVR32.

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

Κατάλογος αρχιτεκτονικών συνόλου εντολών

[Επεξεργασία | επεξεργασία κώδικα]

Ο κατάλογος που ακολουθεί δεν είναι πλήρης, καθώς εξακολουθεί η ανάπτυξη των παλιών αρχιτεκτονικών και δημιουργούνται νέες αρχιτεκτονικές. Πολλοί μικροεπεξεργαστές και μικροελεγκτές που είναι διαθέσιμοι στην αγορά υλοποιούν αρχιτεκτονικές συνόλου εντολών. Σε κάποιες εφαρμογές είναι συχνές και οι εξειδικευμένες αρχιτεκτονικές συνόλου εντολών, όπως στα ASIC, στα FPGA και στο πεδίο του reconfigurable computing.

Αρχιτεκτονικές συνόλου εντολών σε υλικό

[Επεξεργασία | επεξεργασία κώδικα]

Αρχιτεκτονικές συνόλου εντολών σε λογισμικό με εκδόσεις σε υλικό

[Επεξεργασία | επεξεργασία κώδικα]

Αρχιτεκτονικές συνόλου εντολών σε λογισμικό

[Επεξεργασία | επεξεργασία κώδικα]

Κατηγορίες συνόλων εντολών

[Επεξεργασία | επεξεργασία κώδικα]

Εφαρμογές που χρειάζονται ειδικά σύνολα εντολών

[Επεξεργασία | επεξεργασία κώδικα]

Τύποι συσκευών που υλοποιούν κάποιες αρχιτεκτονικές συνόλου εντολών

[Επεξεργασία | επεξεργασία κώδικα]
  1. Randal E. Bryant and David R. O'Hallaron, (2010). Computer Systems: A Programmer's Perspective. Carnegie Mellon University. σελ. 160. ISBN 978-0136108047. 
  2. Randal E. Bryant and David R. O'Hallaron, (2010). Computer Systems: A Programmer's Perspective. Carnegie Mellon University. σελ. 160. ISBN 978-0136108047. 
  3. Randal E. Bryant and David R. O'Hallaron, (2010). Computer Systems: A Programmer's Perspective. Carnegie Mellon University. σελίδες 155–156. ISBN 978-0136108047. 
  4. Ganssle, Jack. "Proactive Debugging" Αρχειοθετήθηκε 2012-07-14 at Archive.is. Δημοσίευση: 26 Φεβρουαρίου 2001.
  5. http://cpushack.net/CPU/cpu7.html
  6. 6,0 6,1 6,2 The evolution of RISC technology at IBM by John Cocke Αρχειοθετήθηκε 2012-02-09 στο Wayback Machine. – IBM Journal of R&D, Volume 44, Numbers 1/2, p.48 (2000)
  7. http://repo.or.cz/w/fpgammix.git/blob_plain/HEAD:/doc/README

Εξωτερικοί σύνδεσμοι

[Επεξεργασία | επεξεργασία κώδικα]