The vast divide between the speed of CPU and RAM means that effective use of CPU caches is often a prerequisite for high performance on modern architectures. Hence, developers need to consider how to place data in memory so as to exploit spatial locality and achieve high memory bandwidth. Such manual memory optimisations are common in unmanaged languages (e.g. C, C++), but they sacrifice readability, maintainability, memory safety, and object abstraction. In managed languages, such as Java and C#, where the runtime abstracts away the memory from the developer, such optimisations are almost impossible.We present a language extension called SHAPES, which aims to offer developers more fine-grained control over the placement of data, without sacrificing memory safety or object abstraction. In SHAPES, programmers group related objects into pools, and specify how objects are laid out in these pools. Classes and types are annotated by pool parameters, which allow placement aspects to
SIMD (Single Instruction, Multiple Data) instruction sets are ubiquitous on modern hardware, but rarely used in software projects. A major reason for this is that efficient SIMD code requires data to be laid out in memory in an unconventional manner, forcing developers to explicitly refactor their code and data structures in order to make use of SIMD. In previous work, we proposed SHAPES, an abstract layout specification for enabling memory optimisations for managed, object-oriented languages. In this paper, we explain how, by extending SHAPES with well-known constructs from the literature, which are not specific to SIMD, we can extend SHAPES to compile programs to use SIMD instructions. The resulting language (sketch) seems able to exploit SIMD capabilities without sacrificing ease of development. 2018/6/26 26 __m128 pz = _mm_loadu_ps(&arr->pz[i]); 27 28 __m128 x2 = _mm_add_ps(x, x); 29 __m128 y2 = _mm_add_ps(y, y); 30 __m128 z2 = _mm_add_ps(z, z); 31 __m128 xx2 = _mm_mul_ps(x, x2); 32 __m128 yy2 = _mm_mul_ps(y, y2); 33 __m128 zz2 = _mm_mul_ps(z, z2); 34 35 __m128 xy2 = _mm_mul_ps(x, y2); 36 __m128 wz2 = _mm_mul_ps(w, z2); 37 __m128 xz2 = _mm_mul_ps(x, z2); 38 __m128 wy2 = _mm_mul_ps(w, y2); 39 __m128 yz2 = _mm_mul_ps(y, z2); 40 __m128 wx2 = _mm_mul_ps(w, x2); 41 42 __m128 a11 = _mm_sub_ps(_mm_sub_ps(ONES, yy2), zz2); 43 __m128 a12 = _mm_add_ps(xy2, wz2); 44 __m128 a13 = _mm_sub_ps(xz2, wy2); 45 __m128 a21 = _mm_sub_ps(xy2, wz2); 46 __m128 a22 = _mm_sub_ps(_mm_sub_ps(ONES, xx2), zz2);
Η ταχύτητα της CPU υπερτερεί πλέον αυτής της RAM. Ως αποτέλεσμα, οι προγραμματιστές που επιδιώκουν να επιτεύξουν υψηλή απόδοση σε σύγχρονες αρχιτεκτονικές θα χρειαστεί πιθανότατα να λάβουν υπ'όψιν το πώς να αξιποιήσουν τις λανθάνουσες μνήμεις (cache) της CPU κατά το βέλτιστο δυνατό τρόπο, το οποίο συνεπάγεται ότι θα χρειαστούν να εξετάσουν το πώς θα διατάξουν τα δεδομένα τους στη μνήμη ώστε να εκμεταλλευτούν τη χωρική τοπικότητα και να επιτύχουν υψηλή ευρυζωνικότητα μεταξύ της CPU και της RAM. Η εφαρμογή τέτοιων βελτιστοποιήσεων όσον αφορά τη μνήμη συνήθως έρχεται σε αντιπαράθεση με την αναγνωσιμότητα του κώδικα, τη συντηρησιμότητά του, την ασφάλεια της μνήμης και της έννοιας της αφαιρετικότητας αντικειμένων. Αυτό επιδεινώνεται περαιτέρω σε γλώσσες όπως η Java και η C#, όπου το runtime αποκρύπτει από τον προγραμματιστή το πώς διατάσσονται τα δεδομένα στη μνήμη και, ως αποτέλεσμα, τέτοιες βελτιστοποιήσεις είναι σχεδόν αδύνατον να θυλοποιηθούν. Ως εκ τούτου, παρουσιάζουμε σε αυτή τη διατριβή μία επέκταση γλώσσας προγραμματισμού, εν ονόματι SHAPES. Η SHAPES επιδιώκει να παράσχει μεγαλύτερη ευχέρεια στον προγραμματιστή ως προς τη διάταξη των δεδομένων στη μνήμη χωρίς αυτό να συνεπάγεται απώλεια της ασφάλειας μνήμης ή της αφαιρετικότητας αντικειμένων, διατηρώντας με αυτόν τον τρόπο την εκφραστικότητα και οικειότητα όσον αφορά τον αντικειμενοστραφή προγραμματισμό. Η SHAPES εισάγει τις έννοιες των περιοχών και των διατάξεων: Ο προγραμματιστής ομαδοποιεί σχετικά μεταξύ τους αντικείμενα σε περιοχές και προσδιορίζει το πώς τα αντικείμενα αυτά θα διατεταχθούν στη μνήμη. Οι κλάσεις και οι τύποι εφοδιάζονται με παραμέτρους περιοχών, οι οποίοι επιτρέπουν τις λεπτομέρειες σχετικά με τη διάταξη των δεδομένων να τροποποιηθούν κατά τρόπο ανεξάρτητο του πώς ο κώδικας επεξεργάζεται τα αντικείμενα που ανήκουν σε μία περιοχή. Αυτές οι επιλογές σχεδίασης διαχωρίζουν την επεξεργασία των δεδομένων από το πώς είναι διατεταγμένα τα δεδομένα αυτά καθ'αυτά στη μνήμη. Επιπλέον, παρέχουμε ένα μαθηματικό μοντέλο της SHAPES, παρουσιάζουμε το μοντέλο της όσον αφορά την ασφάλεια τύπων και μνήμης, καθώς και το πώς μεταφράζεται σε μία γλώσσα χαμηλού επιπέδου. Επίσης, παριοσιάζουμε τα επιχειρήματά μας όσον αφορά το γιατί αναμένουμε ότι η SHAPES μπορεί να μεταγλωττιστεί με αποδοτικό τρόπο όσον αφορά την αναπαράσταση των δεδομένων και την πρόσβαση των πεδίων αντικειμένων κατά τη διάρκεια της εκτέλεσης του προγράμματος. Επιπροσθέτως, παρουσιάζουμε την SHAPES-z, μία υλοποίηση της SHAPES ως μία ενσωματώσιμη γλώσσα, καθώς και τον shapeszc, τον μεταγλωττιστή της SHAPES-z. Παρουσιάζουμε τους συλλογισμούς και τις αιτιολογήσεις μας όσον αφορά το σχεδιασμό και την υλοποίηση τόσο της SHAPES-z όσο και του shapeszc. Τέλος, εκτιμούμε την απόδοση της SHAPES και της SHAPES-z μέσω περιπτωσιολογικών μελετών.
scite is a Brooklyn-based organization that helps researchers better discover and understand research articles through Smart Citations–citations that display the context of the citation and describe whether the article provides supporting or contrasting evidence. scite is used by students and researchers from around the world and is funded in part by the National Science Foundation and the National Institute on Drug Abuse of the National Institutes of Health.
customersupport@researchsolutions.com
10624 S. Eastern Ave., Ste. A-614
Henderson, NV 89052, USA
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Copyright © 2024 scite LLC. All rights reserved.
Made with 💙 for researchers
Part of the Research Solutions Family.