eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming[asm] i dont (quite) get it[asm] i dont (quite) get it
  • Data: 2014-07-05 15:05:49
    Temat: [asm] i dont (quite) get it
    Od: firr <p...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    przegladam jedna stronke i tam jest napisane



    Żeby jednak w 100% wykorzystać moc obliczeniową, należy liczyć równocześnie 4
    iloczyny skalarne.

    sse-dotprod4.c:


    void sse_dot4(float* v1x4, float* v2x4, float* results) {
    __asm__ volatile (
    // load 4 vectors from v1
    "movups (%0), %%xmm0 \n"
    "movups 16(%0), %%xmm1 \n"
    "movups 32(%0), %%xmm2 \n"
    "movups 48(%0), %%xmm3 \n"

    // load 4 vectors from v2
    "movups (%1), %%xmm4 \n"
    "movups 16(%1), %%xmm5 \n"
    "movups 32(%1), %%xmm6 \n"
    "movups 48(%1), %%xmm7 \n"

    // perfom parallel multiplications
    "mulps %%xmm4, %%xmm0 \n" // xmm0 := |A3|A2|A1|A0|
    "mulps %%xmm5, %%xmm1 \n" // xmm1 := |B3|B2|B1|B0|
    "mulps %%xmm6, %%xmm2 \n" // xmm2 := |C3|C2|C1|C0|
    "mulps %%xmm7, %%xmm3 \n" // xmm3 := |D3|D2|D1|D0|
    // (xmm4-xmm7 are free)

    // perfom additions
    "movaps %%xmm0, %%xmm4 \n"
    "unpcklps %%xmm1, %%xmm0 \n" // xmm0 := |B1|A1|B0|A0|
    "unpckhps %%xmm1, %%xmm4 \n" // xmm4 := |B3|A3|B2|A2| (xmm1 is free)
    "movaps %%xmm2, %%xmm1 \n"
    "unpcklps %%xmm3, %%xmm2 \n" // xmm2 := |D1|C1|D0|C0|
    "unpckhps %%xmm3, %%xmm1 \n" // xmm1 := |D3|C3|D2|C2| (xmm3 is free)
    "addps %%xmm4, %%xmm0 \n" // xmm0 := | B13 | A13 | B02 | A02 | (xmm1 is
    free)
    "addps %%xmm1, %%xmm2 \n" // xmm2 := | D13 | C13 | D02 | C02 | (xmm3 is free)

    "movaps %%xmm0, %%xmm1 \n"
    "shufps $0b01000100, %%xmm2, %%xmm0 \n" // xmm0 := | D02 | C02 | B02 | A02 |
    "shufps $0b11101110, %%xmm2, %%xmm1 \n" // xmm1 := | D13 | C13 | B13 | A13 |
    "addps %%xmm1, %%xmm0 \n" // xmm0 := |D0123|C0123|B0123|A0123|
    "movups %%xmm0, (%2) \n"
    :
    : "r" (v1x4), "r" (v2x4), "r" (results)
    );
    }

    przez pare dobrych minut ne moglem pojac czemu to jest tak napisane gdy zwykle
    pionowe sse moze sie spokojnie obejsc tutaj bez szufli

    xxxx
    yyyy
    zzzz
    XXXX
    YYYY
    ZZZZ
    |
    v
    x*X+y*Y+z*Z

    i mz bedzie to raczej chyba szybsze ze wzgledu na to ze 1) nie uzywa szufli
    2) wogole operuje na mniejszej liczbie bajtów.. ta wersja wyzej jak rozumiem
    mnozy wektory 4D a czesciej przydatne sa 3D do tego pytanie czemu az czetry na raz,
    jesli to jest wlasciwie pozioma wersja to czmu np 4 a nie 2 albo 5? - akurat
    rejestrow starczylo na 4?

    z drugiej strony rozumiem ze taka pozioma wersja ma zalety co do tego poziomego
    rozkladu wektorow

    drugie pytanie czy taki sposob pisania zagwarantuje jakis standardowy prolog i epilog
    takiej funkcji? (tj bez jakichs zmuleń) i co to jest -
    : "r" (v1x4), "r" (v2x4), "r" (results)
    ?

    czy jest to asm pod gcc? (w sumie po przyzwyczajeniu sie nie jest gorszy od
    tego starego - jest chyba nawet lepszy pominawszy odwrocona kolejnosc)


Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: