Intel on avaldanud ISPC 1.26 (Implicit SPMD Program Compiler) kompilaatori, mis on mõeldud C keeles paralleelse programmeerimise SPMD (Single Program, Multiple Data) laiendustega koodi kogumiseks. See võimaldab mitme programmi eksemplari paralleelset täitmist erinevate sisendandmetega. Projekti kood on kirjutatud C++ keeles ja jagatakse BSD litsentsi alusel. Tugi on saadaval Linuxi, Windowsi, macOS-i ja FreeBSD jaoks.
C-programmid, millel on SPMD laiendused, kompileeritakse SIMD arvutusplokkide jaoks, mida pakuvad CPU ja GPU, mis võimaldab kasutada SIMD vektorisüsteeme ilma madala taseme optimeerimisteta ja SIMD juhiste otsest rakendamist koodis. Paralleelseid funktsioone kirjutades kasutatakse tuttavat C keele süntaksit ja idiome — SPMD-funktsioonid suhtlevad otse C/C++ keeles kirjutatud funktsioonide ja struktuuridega. Programmide silumiseks võivad kasutada olemasolevaid silumisseadeid.
ISPC koodi genereerimise ja optimeerimise taustal kasutatakse LLVM infrastruktuuri. Toetatakse x86 (SSE2, SSE4, AVX, AVX2, AVX512) ja ARM (NEON) vektorinstruktsioone, samuti GPU (Intel Gen9 ja Xe) arvutuste väljastamist. SSE vektorplokkide arhitektuuridel, mis töötlevad 4 elementi korraga, võimaldab ISPC saavutada programmide täitmise kiirus kuni 3 korda või enam, samas kui AVX vektorplokkide arhitektuuridel, mis töötlevad 8 elementi korraga, võib kiirus tõusta 5-6 korda. Lisaks vektorploki suurusele tagab skaleeritavuse ka erinevate protsessorituumade kasutamine.
ISPC 1.26 versiooni lisatud peamised uuendused:
- Parendatud ARM arhitektuuri tuge:
- Muudetud lippu «—arch=arm» käitumist, mis on nüüd seotud ARMv8 (32-bit) arhitektuuriga, mitte ARMv7-ga (ARMv8 64-bitises režiimis tuleks nagu varem kasutada lippu «—arch=aarch64»).
- Toe lõpetamine ARMv7 Cortex-a9 ja Cortex-a15 protsessoritele.
- Toe lisamine Cortex-a55, Cortex-a78, Cortex-a510, Cortex-a520 protsessoritele ning uutele Apple ARM-protsessoritele.
- Uute kogumiste sihtide lisamine: neon-i16x16 ja neon-i8x32.
- Toe lisamine ARM SDOT ja UDOT vektorinstruktsioonide põhiste operatsioonide jaoks.
- Optimeerimine, ARMv8 jõudlus suurenes keskmiselt 13%.
- Lisatud uus koostamiste eesmärk — «generic», mis võimaldab optimeerida kompilaatori sisemist arhitektuuri ja lihtsustada uute koostamiste lisamist. Idee on toetada põhieesmärke spetsiifiliste riistvarafunktsioonide jaoks, millele on lihtne luua eesmärke, millel on konkreetne optimeerimine. Architektuuri ARM toe üleminek on toimunud generic-eesmärkidele.
- Koodigeneraatoris on kohandatud tsüklite ja funktsioonide arendust, et vähendada tulemuskoodi suurust optimeerimisrežiimis «-O1». Parandatud koodi genereerimist sisseehitatud funktsioonide count_leading_zeros ja count_trailing_zeros jaoks, samuti struktuuride tagastamisel funktsioonidest ja andmete salvestamisel ja laadimisel tüüpide int8/int16 puhul.
- Võimendatud sisseehitatud funktsioonide (intrinsics) tugi LLVM-is, mis aktiveeritakse valiku «—enable-llvm-intrinsics» määramisel.
- LLVM-i tööriistakomplekt on uuendatud versioonile 18.1.8 koos plaastritega. Lisatud makro, et määrata ISPC kasutatav LLVM versioon.
- Lubatud on atribuut «__attribute__((deprecated))» funktsioonide puhul hoiatuste kuvamiseks funktsiooni kutsumisel.
- Kogumise eesmärk avx512knl-x16 (KNL) on eemaldatud.
- Lisaud võimalus „—darwin-version-min“, et määrata minimaalne toetatud versioon sihtplatvormile macOS ja iOS.
Allikas: opennet.ru
