Η Intel δημοσίευσε το ISPC 1.26 (Implicit SPMD Program Compiler), σχεδιασμένο για τη συναρμολόγηση κώδικα C με παράλληλες επεκτάσεις προγραμματισμού SPMD (Single Program, Multiple Data), οι οποίες επιτρέπουν την παράλληλη εκτέλεση πολλών παρουσιών του ίδιου προγράμματος με διαφορετικά σύνολα δεδομένων εισόδου. Ο κώδικας του έργου είναι γραμμένος σε C++ και διανέμεται με την άδεια BSD. Υποστηρίζει εργασία σε Linux, Windows, macOS και FreeBSD.
Τα προγράμματα C με επεκτάσεις SPMD μεταγλωττίζονται για εκτέλεση σε υπολογιστικές μονάδες SIMD που παρέχονται από την CPU και την GPU, η οποία σας επιτρέπει να χρησιμοποιείτε μηχανισμούς διανυσματοποίησης SIMD χωρίς βελτιστοποιήσεις χαμηλού επιπέδου και ρητή χρήση οδηγιών SIMD στον κώδικα. Για να γραφτούν παραλληλίσιμες συναρτήσεις, χρησιμοποιούνται η οικεία σύνταξη και οι ιδιωματισμοί της γλώσσας C - οι συναρτήσεις SPMD αλληλεπιδρούν άμεσα με συναρτήσεις και δομές γραμμένες σε C/C++. Τα υπάρχοντα προγράμματα εντοπισμού σφαλμάτων μπορούν να χρησιμοποιηθούν για τον εντοπισμό σφαλμάτων προγραμμάτων.
Το ISPC χρησιμοποιεί την υποδομή LLVM ως backend για δημιουργία κώδικα και βελτιστοποίηση. Υποστηρίζονται διανυσματικές οδηγίες x86 (SSE2, SSE4, AVX, AVX2, AVX512) και ARM (NEON), καθώς και μεταφόρτωση υπολογισμών στην πλευρά της GPU (Intel Gen9 και Xe). Σε αρχιτεκτονικές με διανυσματικά μπλοκ SSE που επεξεργάζονται 4 στοιχεία κάθε φορά, η χρήση του ISPC καθιστά δυνατή την επίτευξη επιτάχυνσης εκτέλεσης προγράμματος κατά 3 ή περισσότερες φορές, και σε αρχιτεκτονικές με διανυσματικά μπλοκ AVX που επεξεργάζονται 8 στοιχεία τη φορά, η επιτάχυνση μπορεί να φτάσει τα 5- 6 φορές. Επιπλέον, εκτός από το μέγεθος του διανυσματικού μπλοκ, η κλιμάκωση εξασφαλίζεται επίσης με την εκτέλεση σε διαφορετικούς πυρήνες επεξεργαστή.
Βασικές καινοτομίες που προστέθηκαν στην έκδοση 1.26 του ISPC:
- Βελτιωμένη υποστήριξη για την αρχιτεκτονική ARM:
- Η συμπεριφορά της σημαίας "--arch=arm" έχει αλλάξει, η οποία σχετίζεται πλέον με την αρχιτεκτονική ARMv8 (32-bit) και όχι με το ARMv7 (για το ARMv8 σε λειτουργία 64-bit, η σημαία "--arch=aarch64" θα πρέπει ακόμα να χρησιμοποιείται).
- Η υποστήριξη για τους επεξεργαστές ARMv7 Cortex-a9 και Cortex-a15 έχει διακοπεί.
- Προστέθηκε υποστήριξη για επεξεργαστές Cortex-a55, Cortex-a78, Cortex-a510, Cortex-a520, καθώς και νέους επεξεργαστές Apple ARM.
- Προστέθηκαν νέοι στόχοι κατασκευής: neon-i16x16 και neon-i8x32.
- Προστέθηκε υποστήριξη για λειτουργίες που βασίζονται σε διανυσματικές οδηγίες ARM SDOT και UDOT.
- Η βελτιστοποίηση έχει πραγματοποιηθεί, η απόδοση για το ARMv8 έχει αυξηθεί κατά 13% κατά μέσο όρο.
- Προστέθηκε ένας νέος τύπος στόχων κατασκευής - "γενικός", ο οποίος επιτρέπει τη βελτιστοποίηση της εσωτερικής αρχιτεκτονικής του μεταγλωττιστή και την απλοποίηση της προσθήκης νέων στόχων κατασκευής. Η ιδέα είναι να υποστηρίζονται βασικοί στόχοι για συγκεκριμένες δυνατότητες υλικού, πάνω από τις οποίες μπορούν εύκολα να κατασκευαστούν στόχοι με συγκεκριμένες βελτιστοποιήσεις. Η υποστήριξη για την αρχιτεκτονική ARM έχει αλλάξει στη χρήση γενικών στόχων.
- Η γεννήτρια κώδικα έχει ρυθμίσει τον βρόχο και τη λειτουργία ξετυλίγματος για να μειώσει το μέγεθος του προκύπτοντος κώδικα στη λειτουργία βελτιστοποίησης "-O1". Βελτιωμένη δημιουργία κώδικα για τις ενσωματωμένες συναρτήσεις count_leading_zeros και count_trailing_zeros, καθώς και κατά την επιστροφή δομών από συναρτήσεις και κατά την αποθήκευση ή φόρτωση δεδομένων με τύπους int8/int16.
- Διευρυμένη υποστήριξη για LLVM intrinsics, ενεργοποιημένη καθορίζοντας τη σημαία "--enable-llvm-intrinsics".
- Η αλυσίδα εργαλείων LLVM ενημερώθηκε στην έκδοση 18.1.8 με ενημερώσεις κώδικα. Προστέθηκε μακροεντολή για τον εντοπισμό της έκδοσης LLVM που χρησιμοποιείται στο ISPC.
- Επιτρέπεται η εφαρμογή του χαρακτηριστικού "__attribute__((deprecated))" σε συναρτήσεις για την εκτύπωση μιας προειδοποίησης όταν καλείται η συνάρτηση.
- Καταργήθηκε ο στόχος κατασκευής avx512knl-x16 (KNL).
- Προστέθηκε η επιλογή "--darwin-version-min" για τον καθορισμό της ελάχιστης υποστηριζόμενης έκδοσης της πλατφόρμας στόχου για macOS και iOS.
Πηγή: opennet.ru
