🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #2590

[1/3 NTG] C - Optymalizacje wstawkami

#2590
From: DMR
Date: Mon, 04 Feb 2019 17:19
45 lines
3815 bytes
Jaka tu cisza i spokój... Raj socjopaty. :-)

No, dobra...

Całe moje programowanie polega na tworzeniu aplikacji, które mają zassać dane, wymłócić je i wypluć wyniki - tyle, że tych danych bywa sporawo.
Używam Code::Blocks z MinGW i różne mam z nim przygody, o czym pewnie jeszcze napiszę, ale ostatnio kompletnie szlag mnie trafił, bo nie mogłem nigdzie znaleźć mojej "ulubionej" funkcji sincos() - a takie odwołanie FPU pamiętam z niegdysiejszych zainteresowań asemblerem.
Rozważałem nawet powrót/przejście na inny kompilator, Borland, albo Microsoft, ale to byłby tylko półśrodek, w dodatku kłopotliwy.
Mamy przecież koprocesor, który tylko czeka na instrukcje. :-)

Podrążyłem trochę temat i znalazłem rozwiązanie, od razu zbenchmarkowane:


volatile double a = 0.55;
...
for (n = 0; n < nIterations; n++)
{
   asm ("fldl %2;"
        "fsincos;"
        "fstpl %1;"
        "fstpl %0;"
        : "=m"(sin_a), "=m"(cos_a) : "m"(a));
}


Przy nIterations = 50 000 000 całość liczy się nieco ponad sekundę, natomiat przy użyciu sin() i cos() z math.h... prawie cztery.
Dla pojedynczych funkcji przyśpieszenie nie jest aż tak spektakularne, ale i tak wychodzi ponad dwa razy szybciej.
Warto więc się było nad tematem pochylić. No i kodowanie "na żywca", bez użycia zewnętrznych bibliotek jest jakby bardziej... sexy! :-)

Znalazłem taką stronę z gotowcami:

https://www.willus.com/mingw/_fastmath.shtml

Ale tam czytam:
I've noticed lately that the difference between my in-lines and the gcc 3.x/4.x defaults depends significantly on what arguments are sent to the functions. Sometimes mine are faster; sometimes the gcc defaults are faster. In general, with gcc 4.x, I've found that only my sincos in-line gives me any benefit over the gcc default on Core 2 processors, and it's not by much. 


Może ktoś mi wytłumaczyć, o co tu biega?
Bo albo gość zmaścił odwołania FPU, albo GCC nie umie prawidłowo obsłużyć odwołań, albo te wbudowane funkcje liczą sinusy na jakimś SSE/AVX (w co wątpię).
Ja w każdym razie mam odmienne doświadczenia (chyba, że się nie znam).



Druga sprawa - fajnie było czytać stare książki o asemblerze, przedstawiające program jako sekwencję instrukcji.
Ale teraz kończymy drugą dekadę XXI wieku - procesory mają wiele rdzeni, a system ujeżdża jednocześnie kupę procesów.
Co się dzieje, jeśli w sam środek misternie poskładanego zestawu instrukcji wpierdzieli nam się inny proces?
Technical Details
Message-ID: <30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!4.us.feeder.erje.net!feeder.erje.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!k10no648154itk.0!news-out.google.com!v71ni839ita.0!nntp.google.com!k10no648153itk.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail

Show Full Headers
Complete Article Headers
X-Received: by 2002:a5e:a61a:: with SMTP id q26mr256704ioi.29.1549300761591;        Mon, 04 Feb 2019 09:19:21 -0800 (PST)
X-Received: by 2002:aca:5395:: with SMTP id h143mr5158oib.6.1549300761388; Mon, 04 Feb 2019 09:19:21 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!2.eu.feeder.erje.net!4.us.feeder.erje.net!feeder.erje.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!k10no648154itk.0!news-out.google.com!v71ni839ita.0!nntp.google.com!k10no648153itk.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.asm
Date: Mon, 4 Feb 2019 09:19:21 -0800 (PST)
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=80.238.104.22; posting-account=FE4hoAoAAADKg8EtnA4bEyQiJf7iqAgV
NNTP-Posting-Host: 80.238.104.22
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com>
Subject: [1/3 NTG] C - Optymalizacje wstawkami
From: DMR <mezzogm@gmail.com>
Injection-Date: Mon, 04 Feb 2019 17:19:21 +0000
Lines: 70
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit