A partire dai miei recenti benchmark AWS Graviton3 e guardando Graviton3 rispetto a Intel Xeon e AMD EPYC, un certo numero di lettori Phoronix ha espresso interesse nel vedere alcuni benchmark di ottimizzazione del compilatore per Graviton3 attorno ai suoi core Arm Neoverse-V1 con supporto SVE. Ecco alcuni benchmark per chi è interessato all’impatto dell’ottimizzazione del compilatore per questo nuovo processore cloud Arm ad alte prestazioni.
I test in questo articolo sono stati con un’istanza Amazon EC2 c7g.8xlarge con 32 core da una piattaforma Graviton3. Ubuntu 22.04 LTS era in esecuzione su questa istanza EC2 con il suo kernel Linux 5.15 di serie mentre sceglieva di utilizzare gcc-snapshot su Ubuntu 22.04 per fornire uno stack di compilatore basato su GCC12 più recente.
Da questa stessa istanza Graviton3, un numero di benchmark C/C++ open source sono stati eseguiti durante il test con i seguenti CFLAGS/CXXFLAGS in prova:
-O3-march=armv8.4-a per ARMv8.4 come si basa Neoverse-V1.
-O3 0march=armv8.4-a+sve per specificare il supporto Arm SVE (Scalable Vector Extension) trovato con Neoverse-V1.
-O3-march-armv8.4-a+sve-mcpu=neoverse-v1 per godere anche dell’ottimizzazione della CPU specifica per Neoverse-V1.
In GCC 11 è stato aggiunto il supporto Arm Scalable Vector Extension (SVE), inclusa la possibilità di vettorizzazione automatica per molte funzionalità SVE. Diamo un’occhiata per vedere quale differenza hanno questi flag del compilatore sulle prestazioni risultanti dei binari generati in esecuzione su Graviton3 nel cloud Amazon.
Il test del compilatore su Graviton3 è stato limitato a queste tre configurazioni al fine di risparmiare sui costi operativi nel cloud.
Le opzioni del compilatore SVE hanno fornito un aiuto ai test del codificatore di immagini JPEG XL per offrire prestazioni migliori rispetto al targeting Armv8.4 di base senza SVE. Anche OpenJPEG ha beneficiato in una certa misura di SVE.
In altri carichi di lavoro il vantaggio SVE variava da guadagni lievi a moderati.
Il supporto per la vettorizzazione automatica SVE di GCC 12 ha aiutato parte dell’audio codificare i benchmark.
Ovviamente, dipende in larga misura dal software in prova quanto impatto può avere da Arm SVE e altri tuning Neoverse-V1.
Con Zstd per esempio solo l’ottimizzazione ha aiutato le prestazioni di decompressione per la modalità lunga mentre nelle altre configurazioni di compressione Zstd testate non c’era alcuna differenza misurabile.
Nel caso di alcuni benchmark come Crypto++, l’ottimizzazione-mcpu=neoverse-v1 in realtà ha avuto un impatto negativo sulle prestazioni.
La vettorizzazione automatica e/o l’SVE di GCC hanno avuto un impatto negativo sulle prestazioni della libreria di elaborazione del segnale digitale open source Liquid-DSP.
Oppure nei benchmark crittografici Botan, l’ottimizzazione Neoverse-V1 era di notevole vantaggio per alcuni algoritmi crittografici.
Le prestazioni della libreria di rete neurale TNN Tencent variavano con SVE.
Per farla breve, come spesso accade, dipende in gran parte dalle particolari basi di codice e dai carichi di lavoro che utilizzi impegnarsi attivamente per valutare se l’ottimizzazione aggiuntiva del compilatore vale la pena. In alcuni carichi di lavoro GCC 12 come testato ha mostrato alcuni vantaggi con il suo supporto per la vettorizzazione automatica SVE, mentre in altri casi non così tanto e in alcuni casi ha fatto regredire le prestazioni. Sarà interessante vedere l’impatto dell’utilizzo degli intrinseci SVE ottimizzato a mano da parte dei principali software open source man mano che più processori Arm arriveranno a segnare con il supporto SVE/SVE2 e come si evolvono gli infiniti progressi del compilatore open source.
Coloro che desiderano vedere tutti i benchmark di confronto dei flag del compilatore testati per l’istanza Graviton3 possono vedere questa pagina dei risultati.