Optimalizace při překladu na procesorech ARM

Presentations

Optimalizace při překladu na procesorech ARM

Obsah přednášky

ARM32 z pohledu programátora

Instrukční sady procesorů ARM

Instrukční sada A32

Typy instrukcí

Vlastnosti ISA typické pro ARM

Velmi často používaný příklad

int gcd(int a, int b) {
   while (a != b) {
      if (a > b) a = a - b;
      else       b = b - a;
   }
   return a;
}

Klasický přístup při překladu

 gcd    CMP      r0, r1
        BEQ      end
        BLT      less
        SUB      r0, r0, r1
        B        gcd
 less
        SUB      r1, r1, r0
        B        gcd
 end

Využití příznaků

 gcd
        CMP      r0, r1
        SUBGT    r0, r0, r1
        SUBLT    r1, r1, r0
        BNE      gcd

Výsledky

Instrukční sada Thumb (T32)

Instrukční sada Thumb (T32)

Instrukční sada Thumb (T32)

Instrukční sada Thumb-2

Instrukční sada Thumb-2

RISCové procesory a problém se skoky

IT

CMP r0, r1
ITE EQ
MOVEQ r0, r2 ; větev "then"
MOVNE r0, r3 ; větev "else"

Výsledky měření: délka kódu

Instrukční sada Délka kódu
==================================
ARM             100%
Thumb            70%
Thumb-2          74%

Výsledky měření: rychlost aplikace

Instrukční sada Relativní rychlost
==================================
ARM             100%
Thumb            75%
Thumb-2          98%

Instrukční sada A64

AArch64 z pohledu programátora

Operace

Multiply/divide

Skoky a rozeskoky

Instrukce s podmínkou

Specifika AArch 64

A57

Osm samostatných pipeline (pokr.)

Podpora pro operace s FP

SIMD

Crypto

Rozšíření instrukčních sad

FPA (ARM Floating Point Accelerator)

VFP

VFP

VFP

VFP

VFP

VFP

Advanced SIMD Architecture

NEON

NEON

Datové typy

NEON Intrinsic

gcc   -mcpu=cortex-a9 -mfpu=neon ...
clang -mcpu=cortex-a9 -mfpu=neon ...
-mtune=cortex-a5 (a8, a9)

#include <arm_neon.h>
(typ)x(lanes)_t - uint8x4_t
(typ)x(lanes)x(počet_registrů)_t - uint8x2x4_t

uint16x4_t vadd_u16(uint16x4_t x, uint16x4_t y);
uint16x2_t vmlal_u32(uint64x2_t x, uint32x2_t, uint32x2_t);

Omezení některých jader ARM

FP

“Skryté” výpočty s double

test.c: In function ‘calcVAT’:
test.c:3:16: warning: implicit conversion from ‘float’ to ‘double’ to match other operand of binary expression [-Wdouble-promotion]
     return 20.0*price;
                     ^

Lazy stacking

C knihovny