Hlavní navigace

Názor k článku Programovací jazyk Go a assembler (3.část) od anonym - Ten minimalni rozdil mezi STOSx a VMOV/MOV zase...

  • 14. 2. 2020 12:32

    bez přezdívky

    Ten minimalni rozdil mezi STOSx a VMOV/MOV zase takove prekvapeni neni, nebot prinejmensim na Ivy Bridge a lepsich CPU uz je ERMSB, tzn. ze STOSx /MOVSx instrukce maji vylepseny mikrokod, jehoz funkci si lze v tomto konkretnim pripade predstavit jako sdruzovani 32bitovych zapisu STOSD do jednoho realneho n-bitoveho jiz v jadru. Pak je rychlost brzdena busem, a tedy priblizne stejna, jako pri pouziti 8bajtovych VMOV. Samozrejme to chce ty veci okolo, tzn. zarovnani na 16 bajtu, >= 128 bajtu pro REP prenos...
    Mimo jine si toho lze take povsimnout v modernich knihovnach pro memsety a memmovy, kde puvodni kombinace STOSD + (1...3)STOSB, resp. MOVSD + (1...3)MOVSB, jsou nahrazeny STOSB, resp. MOVSB, nebot mikrokodem provadene sdruzovani pristupu na bus do sirky datove sbernice, mensi overhead pri startu REPu a moznost inlajnovani maleho useku kodu tuto konstrukci jasne favorizuje.
    Jinymi slovy, s ERMSB je ECX = N, REP STOSD stejne rychle jako ECX = 4*N, REP STOSB.

    Z "Intel 64 and IA-32 Architectures Optimization Reference Manual":
    3.7.7.3 Memset ConsiderationsThe consideration of code size and throughput also applies for memset() implementations. For processors supporting ERMSB, using REP STOSB will again deliver more compact code size and significantly better performance than the combination of STOSD+B technique described in Section 3.7.6.When the destination buffer is 16-byte aligned, memset() using ERMSB can perform better than SIMD approaches. When the destination buffer is misaligned, memset() performance using ERMSB can degrade about 20% relative to aligned case, for processors based on Intel microarchitecture code named Ivy Bridge. In contrast, SIMD implementation of memset() will experience smaller degradation when the destination is misaligned.