-
X-Received: by 10.140.47.102 with SMTP id l93mr299741qga.5.1404565549245; Sat, 05 Jul
2014 06:05:49 -0700 (PDT)
X-Received: by 10.140.47.102 with SMTP id l93mr299741qga.5.1404565549245; Sat, 05 Jul
2014 06:05:49 -0700 (PDT)
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask
.pl!news.nask.org.pl!news.unit0.net!news.glorb.com!uq10no1794021igb.0!news-out.
google.com!a8ni6411qaq.1!nntp.google.com!i13no6161905qae.1!postnews.google.com!
glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Sat, 5 Jul 2014 06:05:49 -0700 (PDT)
Complaints-To: g...@g...com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=78.30.113.174;
posting-account=Sb6m8goAAABbWsBL7gouk3bfLsuxwMgN
NNTP-Posting-Host: 78.30.113.174
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <a...@g...com>
Subject: [asm] i dont (quite) get it
From: firr <p...@g...com>
Injection-Date: Sat, 05 Jul 2014 13:05:49 +0000
Content-Type: text/plain; charset=ISO-8859-2
Content-Transfer-Encoding: quoted-printable
Xref: news-archive.icm.edu.pl pl.comp.programming:206186
[ ukryj 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)
Następne wpisy z tego wątku
- 05.07.14 17:49 feldmarszałek tusk
- 07.07.14 12:14 XJL
- 07.07.14 12:49 firr
- 07.07.14 15:13 feldmarszałek tusk
- 07.07.14 15:20 feldmarszałek tusk
- 07.07.14 16:38 feldmarszałek tusk
- 07.07.14 16:58 Stregor
- 07.07.14 17:16 feldmarszałek tusk
- 07.07.14 17:55 R.e.m.e.K
- 07.07.14 20:41 feldmarszałek tusk
- 07.07.14 21:26 feldmarszałek tusk
- 07.07.14 22:07 firr
- 08.07.14 08:41 Stregor
- 08.07.14 09:23 firr
Najnowsze wątki z tej grupy
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
Najnowsze wątki
- 2024-12-25 Wrocław => Architekt rozwiązań (doświadczenie w obszarze Java, AWS
- 2024-12-25 Warszawa => Sales Assistant <=
- 2024-12-25 Kraków => Inżynier bezpieczeństwa aplikacji <=
- 2024-12-25 Lublin => System Architect (Java background) <=
- 2024-12-25 Szczecin => Specjalista ds. public relations <=
- 2024-12-25 Wrocław => Key Account Manager <=
- 2024-12-25 Kraków => Full Stack .Net Engineer <=
- 2024-12-25 Kraków => Programista Full Stack .Net <=
- 2024-12-25 Bieruń => Regionalny Kierownik Sprzedaży (OZE) <=
- 2024-12-25 Białystok => Inżynier Serwisu Sprzętu Medycznego <=
- 2024-12-25 Białystok => Delphi Programmer <=
- 2024-12-25 Chrzanów => Team Lead / Tribe Lead FrontEnd <=
- 2024-12-25 Kraków => Ekspert IT (obszar systemów sieciowych) <=
- 2024-12-25 Mińsk Mazowiecki => Spedytor Międzynarodowy <=
- 2024-12-24 Dzisiaj Bentlejem czyli przybieżeli sześciu Króli do Rysia na kasie