Rocksolid Light

groups  faq  privacy  How to post  login

Message-ID:  

Try the Moo Shu Pork. It is especially good today.


rocksolid / de.comp.lang.c / FSIN vs sin()

SubjectAuthor
* FSIN vs sin()Bonita Montero
+* Re: FSIN vs sin()Marcel Mueller
|+* Re: FSIN vs sin()Bonita Montero
||`* Re: FSIN vs sin()Marcel Mueller
|| +* Re: FSIN vs sin()Bonita Montero
|| |`* Re: FSIN vs sin()Marcel Mueller
|| | `* Re: FSIN vs sin()Bonita Montero
|| |  `* Re: FSIN vs sin()Marcel Mueller
|| |   `- Re: FSIN vs sin()Bonita Montero
|| `- Re: FSIN vs sin()Bonita Montero
|`- Re: FSIN vs sin()Bonita Montero
`- Re: FSIN vs sin()Bonita Montero

1
Subject: FSIN vs sin()
From: Bonita Montero
Newsgroups: de.comp.lang.c
Organization: A noiseless patient Spider
Date: Fri, 26 Apr 2024 15:01 UTC
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!raubtier-asyl.eternal-september.org!.POSTED!not-for-mail
From: Bonita.M...@gmail.com (Bonita Montero)
Newsgroups: de.comp.lang.c
Subject: FSIN vs sin()
Date: Fri, 26 Apr 2024 17:01:32 +0200
Organization: A noiseless patient Spider
Lines: 69
Message-ID: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 26 Apr 2024 17:01:32 +0200 (CEST)
Injection-Info: raubtier-asyl.eternal-september.org; posting-host="c6de859a5905ce48df9437d48b950ae4";
logging-data="3953137"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18vWuG+Gzp7ZIW0deViHFwTN24fz7W/7wQ="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:2rYtZWpLpZMdYO90Z0HASxWxORM=
Content-Language: de-DE
View all headers

Helmut meinte ja mal, dass FSIN auf x87-FPUs schneller als das sin()
der Standardbibliothkek ist. Ich hab mir mal die Timings auf modernen
CPUs bei agner.org angeschaut und das kam mir alles ein wenig seltsam
vor bzw. falls das intern über den CORDIC-Algorithmus gehen sollte
sollte das eigentlich schneller gehen als mit bis zu 200 Takten auf
meiner Zen4-CPU.
Hab dann mal einen kleinen Benchmark in C++ und Assembler geschrieben,
und der sieht so aus:

#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <chrono>
#include <atomic>
#include <vector>

using namespace std;
using namespace chrono;

double x87Sin( double angle );

atomic<double> aSum;

int main()
{ vector<double> values;
for( int i = 0; i < 1000; ++i )
values.emplace_back( M_PI * i / 1000.0 );
auto bench = [&]( double (*sinFn)( double ) )
{
auto start = high_resolution_clock::now();
double sum = 0.0;
for( int r = 0; r < 10'000; ++r )
for( double d : values )
sum += sinFn( d );
double t = duration_cast<nanoseconds>( high_resolution_clock::now() -
start ).count() / 1.0e7;
aSum = sum;
return t;
};
cout << bench( x87Sin ) / bench( sin ) << endl;
unsigned unequal = 0;
for( double d : values )
unequal += x87Sin( d ) != sin( d );
cout << unequal << endl;
}

PUBLIC ?x87Sin@@YANN@Z

_TEXT SEGMENT
?x87Sin@@YANN@Z PROC
movsd qword ptr [rsp - 8], xmm0
fld qword ptr [rsp - 8]
fsin
fstp qword ptr [rsp - 8]
movsd xmm0, qword ptr [rsp - 8]
ret
?x87Sin@@YANN@Z ENDP
_TEXT ENDS
END

Das Ergebnis ist, dass das sin() der MSVC-Runtime ca. 11,3 mal
schneller ist als das x87 FSIN.
Was mich auch interssiert hatte ist, wie oft sich die Ergebnisse
für gleiche Eingaben aufgrund unterschiedlicher Rechenwege unter-
scheiden. Und da war ich echt überrascht, dass das sin() der Run-
time auf 1.000 Eingaben sich nur 27 mal unterschied; ich hätte
echt damit gerechnet, dass sich die meisten Endergebnisse irgendwo
auf den letzten Bits unterscheiden.

Subject: Re: FSIN vs sin()
From: Marcel Mueller
Newsgroups: de.comp.lang.c
Organization: MB-NET.NET for Open-News-Network e.V.
Date: Fri, 26 Apr 2024 18:37 UTC
References: 1
Path: i2pn2.org!i2pn.org!news.swapon.de!news.mb-net.net!open-news-network.org!.POSTED!not-for-mail
From: news.5.m...@spamgourmet.org (Marcel Mueller)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Fri, 26 Apr 2024 20:37:51 +0200
Organization: MB-NET.NET for Open-News-Network e.V.
Message-ID: <v0gs9v$1sgg$2@gwaiyur.mb-net.net>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 26 Apr 2024 18:37:51 -0000 (UTC)
Injection-Info: gwaiyur.mb-net.net;
logging-data="61968"; mail-complaints-to="abuse@open-news-network.org"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:6LXBhABU78FSXz6uTq2xcgx5VDE= sha256:3J1KO6WkZS7MwW4lxuJhQrJikDFQmMDocmqk08ngmtk=
sha1:szoP9YGfZUr7Q+tg8a5pSeHux9o= sha256:qf6aA88/DKxKxPIg18RkTKojMGGHF6CV/zfBk6XPs1w=
Content-Language: de-DE
In-Reply-To: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
View all headers

Am 26.04.24 um 17:01 schrieb Bonita Montero:
> Das Ergebnis ist, dass das sin() der MSVC-Runtime ca. 11,3 mal
> schneller ist als das x87 FSIN.

Was erwartest du, wenn jedes mal die Daten erst durch den Stack-Wolf drehst?

> Was mich auch interssiert hatte ist, wie oft sich die Ergebnisse
> für gleiche Eingaben aufgrund unterschiedlicher Rechenwege unter-
> scheiden. Und da war ich echt überrascht, dass das sin() der Run-
> time auf 1.000 Eingaben sich nur 27 mal unterschied; ich hätte
> echt damit gerechnet, dass sich die meisten Endergebnisse irgendwo
> auf den letzten Bits unterscheiden.

Probier mal große Zahlen, nicht [0,Pi), dann kommen die Unterschiede
zutage. fsin ist da eigen.

Marcel

Subject: Re: FSIN vs sin()
From: Bonita Montero
Newsgroups: de.comp.lang.c
Organization: A noiseless patient Spider
Date: Sat, 27 Apr 2024 04:55 UTC
References: 1 2
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!raubtier-asyl.eternal-september.org!.POSTED!not-for-mail
From: Bonita.M...@gmail.com (Bonita Montero)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Sat, 27 Apr 2024 06:55:24 +0200
Organization: A noiseless patient Spider
Lines: 13
Message-ID: <v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 27 Apr 2024 06:55:22 +0200 (CEST)
Injection-Info: raubtier-asyl.eternal-september.org; posting-host="fece718e5fda82b334bfde32c02affdd";
logging-data="211420"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18MZBX9Qj4AGztDaqH9mFu+ZhAzqiAwTpM="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:J4T684VRBFcPMdGAgSxaM83XfNM=
Content-Language: de-DE
In-Reply-To: <v0gs9v$1sgg$2@gwaiyur.mb-net.net>
View all headers

Am 26.04.2024 um 20:37 schrieb Marcel Mueller:

> Was erwartest du, wenn jedes mal die Daten erst durch den Stack-Wolf
> drehst?

Was ?

> Probier mal große Zahlen, nicht [0,Pi), dann kommen die Unterschiede
> zutage. fsin ist da eigen.

Is aber unwahrscheinlich, dass jemand Zahlen jenseits von 360 Grad
nimmt.

Subject: Re: FSIN vs sin()
From: Bonita Montero
Newsgroups: de.comp.lang.c
Organization: A noiseless patient Spider
Date: Sat, 27 Apr 2024 05:24 UTC
References: 1 2
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!raubtier-asyl.eternal-september.org!.POSTED!not-for-mail
From: Bonita.M...@gmail.com (Bonita Montero)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Sat, 27 Apr 2024 07:24:44 +0200
Organization: A noiseless patient Spider
Lines: 58
Message-ID: <v0i26p$6o9h$1@raubtier-asyl.eternal-september.org>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 27 Apr 2024 07:24:42 +0200 (CEST)
Injection-Info: raubtier-asyl.eternal-september.org; posting-host="fece718e5fda82b334bfde32c02affdd";
logging-data="221489"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19CG43CvT1Gi+VuOpGy9tOP9RiH56zTe38="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:4J3FaBorzGENfR8kP5VNZJARJA8=
Content-Language: de-DE
In-Reply-To: <v0gs9v$1sgg$2@gwaiyur.mb-net.net>
View all headers

Ich hab jetzt mal das FSIN als gcc Inline-Assembly gemacht. Der FSIN
-Teil ist mit dem g++ natürlich genauso "schnell", aber das std::sin()
ist sehr viel langsamer, dass das std::sin() im Endeffekt nur fünfmal
so schnell ist wie das FSIN.

#include <iostream>
#include <cmath>
#include <chrono>
#include <atomic>
#include <vector>

constexpr double PI = 3.14159265358979323846;

using namespace std;
using namespace chrono;

#if defined(_MSC_VER)
double x87Sin( double angle );
#else
double x87Sin( double angle )
{ double sinval;
asm( "fsin" : "=t" (sinval) : "0" (angle) );
return sinval;
} #endif

atomic<double> aSum;

int main()
{ vector<double> values;
values.reserve( 1'000 );
for( int i = 0; i < 1000; ++i )
values.emplace_back( PI * i / 1e3 );
auto bench = [&]( double (*sinFn)( double ) )
{
auto start = high_resolution_clock::now();
double sum = 0.0;
for( int r = 0; r < 10'000; ++r )
for( double d : values )
sum += sinFn( d );
double t = duration_cast<nanoseconds>( high_resolution_clock::now() -
start ).count() / 1.0e7;
aSum.store( sum, memory_order_relaxed );
return t;
};
double
x87 = bench( x87Sin ),
std = bench( sin );
cout << "x87: " << x87 << endl;
cout << "std: " << std << endl;
cout << "*: " << x87 / std << endl;
unsigned unequal = 0;
for( double d : values )
unequal += x87Sin( d ) != sin( d );
cout << unequal << endl;
}

Subject: Re: FSIN vs sin()
From: Marcel Mueller
Newsgroups: de.comp.lang.c
Organization: MB-NET.NET for Open-News-Network e.V.
Date: Sat, 27 Apr 2024 09:41 UTC
References: 1 2 3
Path: i2pn2.org!i2pn.org!news.swapon.de!news.mb-net.net!open-news-network.org!.POSTED!not-for-mail
From: news.5.m...@spamgourmet.org (Marcel Mueller)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Sat, 27 Apr 2024 11:41:33 +0200
Organization: MB-NET.NET for Open-News-Network e.V.
Message-ID: <v0ih8d$99fr$1@gwaiyur.mb-net.net>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
<v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 27 Apr 2024 09:41:33 -0000 (UTC)
Injection-Info: gwaiyur.mb-net.net;
logging-data="304635"; mail-complaints-to="abuse@open-news-network.org"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:D9ivfyHV7LmaEHIa8jg1t9sjYrE= sha256:JV8h7MX0mdgkHQvsuZ/7Ln3pD3HxvimjxNo51uGufGo=
sha1:zZqlm4+oYRb1LrulA925Im8KkoQ= sha256:XWA9TWPen6usWy8OlEKkWrGs9ZupfVqTxGI5F6F7AoY=
Content-Language: de-DE
In-Reply-To: <v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
View all headers

Am 27.04.24 um 06:55 schrieb Bonita Montero:
> Am 26.04.2024 um 20:37 schrieb Marcel Mueller:
>
>> Was erwartest du, wenn jedes mal die Daten erst durch den Stack-Wolf
>> drehst?
>
> Was ?

Naja, der Assembler-Code verhindert jegliche Optimierungen für den
Datentransport. Und dass die zu testende Funktion nur einige Prozent der
ausgeführten Instruktionen ausmacht, macht die Sache keineswegs besser.

Es bleibt aber auch festzuhalten, dass die ruhmreichen Zeiten der x86
FPU gezählt sind. Nachdem der 486 schon langsamer als der 387 war, hat
sich das ganze nicht mehr sonderlich zum Guten weiterentwickelt. Die 586
haben nochmal Schwung gebracht (und sich Anfangs verrechnet), aber
danach kam nicht mehr viel.

>> Probier mal große Zahlen, nicht [0,Pi), dann kommen die Unterschiede
>> zutage. fsin ist da eigen.
>
> Is aber unwahrscheinlich, dass jemand Zahlen jenseits von 360 Grad
> nimmt.

Noch nicht viel mit trigonometrischen Funktionen gemacht, oder?
Bereits die Berechnung eines einfachen Sinustons bedingt größere Werte.

Die eingebaute sin-Funktion wird dann auch langsamer, weil fmod recht
teuer ist.

Mit 8-fach Unrolling komme ich bei kleinen Zahlen auf Faktor 3 langsamer
als sin(), aber bei großen Zahlen dreht sich das Bild. Dann wird sin()
immer langsamer. Das hängt natürlich von der jeweiligen CPU ab. Das war
jetzt ein alter AMD FX.

Aber zumindest scheint das Große-Zahlen-Problem mittlerweile halbwegs im
Griff zu sein. Früher hat fsin ziemlichen Blödsinn ausgerechnet, wenn
die Argumente zu groß wurden.

Marcel

Subject: Re: FSIN vs sin()
From: Bonita Montero
Newsgroups: de.comp.lang.c
Organization: A noiseless patient Spider
Date: Sat, 27 Apr 2024 12:04 UTC
References: 1 2 3 4
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!raubtier-asyl.eternal-september.org!.POSTED!not-for-mail
From: Bonita.M...@gmail.com (Bonita Montero)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Sat, 27 Apr 2024 14:04:40 +0200
Organization: A noiseless patient Spider
Lines: 32
Message-ID: <v0ipkk$bpp9$1@raubtier-asyl.eternal-september.org>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
<v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
<v0ih8d$99fr$1@gwaiyur.mb-net.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 27 Apr 2024 14:04:37 +0200 (CEST)
Injection-Info: raubtier-asyl.eternal-september.org; posting-host="fece718e5fda82b334bfde32c02affdd";
logging-data="386857"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX189DP1ekgJ4J1O7P/tnLMvYN8MB+neFB5U="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:gaBgaXRigjl0KWtfBwPb4mh0q10=
In-Reply-To: <v0ih8d$99fr$1@gwaiyur.mb-net.net>
Content-Language: de-DE
View all headers

Am 27.04.2024 um 11:41 schrieb Marcel Mueller:

> Noch nicht viel mit trigonometrischen Funktionen gemacht, oder?
> Bereits die Berechnung eines einfachen Sinustons bedingt größere Werte.

Ne, aber imm mal Computergrafik, da hat man Bounds beim Sinus die
immer >= 0 bis < 360 Graf oder >= -180 bis < 180 Grad liegen.

> Die eingebaute sin-Funktion wird dann auch langsamer, weil fmod recht
> teuer ist.

Kommt aber insgesamt sicher selten vor. Ich mein wenn Du schon nichts
sinnvolleres kennst als dieses Beispiel ...

> Mit 8-fach Unrolling komme ich bei kleinen Zahlen auf Faktor 3 langsamer
> als sin(), ...

So ein dummes Zeug, die Funktion dahinter hat eine derart große Kom-
plexität, dass Du an der Stelle mit Loop-Unrolling sicher gar nichts
erreichst. Zumal Loop-Unrolling auf heutigen CPUs sowieso nur selten
was bringt und wenn sehr wenig.

> Aber zumindest scheint das Große-Zahlen-Problem mittlerweile halbwegs
> im Griff zu sein. Früher hat fsin ziemlichen Blödsinn ausgerechnet,
> wenn die Argumente zu groß wurden.

Grundsätzlich arbeitet der CORDIC-Algorithmus mit sukzessiver Approxima-
tion. Dazu wird Pi / 2 = 90 Grad zu 1.0, dass man Bit-weise sich annä-
hrern kann. Wie groß der Wert dabei ist ist dann komplett egal da man
höherwertige Bits dann komplett ignorieren kann. Das war früher sicher
nicht anders als heute denn CORDIC ist uralt.

Subject: Re: FSIN vs sin()
From: Marcel Mueller
Newsgroups: de.comp.lang.c
Organization: MB-NET.NET for Open-News-Network e.V.
Date: Sat, 27 Apr 2024 14:04 UTC
References: 1 2 3 4 5
Path: i2pn2.org!i2pn.org!news.swapon.de!news.mb-net.net!open-news-network.org!.POSTED!not-for-mail
From: news.5.m...@spamgourmet.org (Marcel Mueller)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Sat, 27 Apr 2024 16:04:50 +0200
Organization: MB-NET.NET for Open-News-Network e.V.
Message-ID: <v0j0m2$a90o$2@gwaiyur.mb-net.net>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
<v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
<v0ih8d$99fr$1@gwaiyur.mb-net.net>
<v0ipkk$bpp9$1@raubtier-asyl.eternal-september.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 27 Apr 2024 14:04:50 -0000 (UTC)
Injection-Info: gwaiyur.mb-net.net;
logging-data="336920"; mail-complaints-to="abuse@open-news-network.org"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:CG3d16UhHFN2UPYqbVOOGXRWbEM= sha256:+ijq4GKEU8A4DaMSsdxiF5AE+fgYBMbKFBN90SfFl2E=
sha1:m+nLzGWMC0em+6VjDkBTZVmIncU= sha256:RhV0K2gvZ7hoKORIVoDj/1tXEc25YJ1ylNg4QtH1tFo=
Content-Language: de-DE
In-Reply-To: <v0ipkk$bpp9$1@raubtier-asyl.eternal-september.org>
View all headers

Am 27.04.24 um 14:04 schrieb Bonita Montero:
> Am 27.04.2024 um 11:41 schrieb Marcel Mueller:
>
>> Noch nicht viel mit trigonometrischen Funktionen gemacht, oder?
>> Bereits die Berechnung eines einfachen Sinustons bedingt größere Werte.
>
> Ne, aber imm mal Computergrafik, da hat man Bounds beim Sinus die
> immer >= 0 bis < 360 Graf oder >= -180 bis < 180 Grad liegen.
>
>> Die eingebaute sin-Funktion wird dann auch langsamer, weil fmod recht
>> teuer ist.
>
> Kommt aber insgesamt sicher selten vor. Ich mein wenn Du schon nichts
> sinnvolleres kennst als dieses Beispiel ...

Naja, Berechnung der FFT-Koeffizienten tut's auch.
Ich denke mal im Bereich Digital Signal Processing hat man es selten mit
Werten im Bereich ±π zu tun.

Gleichwohl stimme ich zu, dass wirklich große Werte selten sind. Und
genau darauf dürften die Implementierungen auch optimiert sein.

>> Mit 8-fach Unrolling komme ich bei kleinen Zahlen auf Faktor 3
>> langsamer als sin(), ...
>
> So ein dummes Zeug, die Funktion dahinter hat eine derart große Kom-
> plexität, dass Du an der Stelle mit Loop-Unrolling sicher gar nichts
> erreichst. Zumal Loop-Unrolling auf heutigen CPUs sowieso nur selten
> was bringt und wenn sehr wenig.

Naja, der Funktionsaufruf mit Übertragung über Stack ist schon einiger
Overhead.

> Grundsätzlich arbeitet der CORDIC-Algorithmus mit sukzessiver Approxima-
> tion. Dazu wird Pi / 2 = 90 Grad zu 1.0, dass man Bit-weise sich  annä-
> hrern kann. Wie groß der Wert dabei ist ist dann komplett egal da man
> höherwertige Bits dann komplett ignorieren kann. Das war früher sicher
> nicht anders als heute denn CORDIC ist uralt.

Keine Ahnung, wie das die Runtime macht. Aber die Berechnungszeit von
sin() steigt hier von etwa 10ns bei kleinen Zahlen auf 150ns und mehr
bei großen. Das ist schon eklatant.

Marcel

Subject: Re: FSIN vs sin()
From: Bonita Montero
Newsgroups: de.comp.lang.c
Organization: A noiseless patient Spider
Date: Sat, 27 Apr 2024 14:28 UTC
References: 1 2 3 4 5 6
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!raubtier-asyl.eternal-september.org!.POSTED!not-for-mail
From: Bonita.M...@gmail.com (Bonita Montero)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Sat, 27 Apr 2024 16:28:46 +0200
Organization: A noiseless patient Spider
Lines: 22
Message-ID: <v0j22q$dk6f$1@raubtier-asyl.eternal-september.org>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
<v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
<v0ih8d$99fr$1@gwaiyur.mb-net.net>
<v0ipkk$bpp9$1@raubtier-asyl.eternal-september.org>
<v0j0m2$a90o$2@gwaiyur.mb-net.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 27 Apr 2024 16:28:43 +0200 (CEST)
Injection-Info: raubtier-asyl.eternal-september.org; posting-host="fece718e5fda82b334bfde32c02affdd";
logging-data="446671"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+8v59HgkdcGeqkf0oBRneUBMAvRnxaXYU="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:XaHvvz0i+TJr4zM9bhCtKqcxPyk=
Content-Language: de-DE
In-Reply-To: <v0j0m2$a90o$2@gwaiyur.mb-net.net>
View all headers

Am 27.04.2024 um 16:04 schrieb Marcel Mueller:

> Naja, Berechnung der FFT-Koeffizienten tut's auch.

Ja, super, aber dann hat man erst recht einen kleinen Wertebereich.

> Naja, der Funktionsaufruf mit Übertragung über Stack ist schon einiger
> Overhead.

Selbst wenn spielt das anteilig bei so ner komplexen Operation nicht die
Rolle.

> Keine Ahnung, wie das die Runtime macht. Aber die Berechnungszeit von
> sin() steigt hier von etwa 10ns bei kleinen Zahlen auf 150ns und mehr
> bei großen. Das ist schon eklatant.

Du musst echt irgendwas verkehrt messen oder eine uralte CPU haben.
Meine 7950X Zen4-CPU braucht für eine sin()-Operation ca. 7ns mit
g++ 12, das wären ca. 40 Takte bei 5.7GHz; x87 FSIN ist mit diesem
Compiler nur fünfmal langsamer.

Subject: Re: FSIN vs sin()
From: Marcel Mueller
Newsgroups: de.comp.lang.c
Organization: MB-NET.NET for Open-News-Network e.V.
Date: Sat, 27 Apr 2024 19:44 UTC
References: 1 2 3 4 5 6 7
Path: i2pn2.org!i2pn.org!news.swapon.de!news.mb-net.net!open-news-network.org!.POSTED!not-for-mail
From: news.5.m...@spamgourmet.org (Marcel Mueller)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Sat, 27 Apr 2024 21:44:44 +0200
Organization: MB-NET.NET for Open-News-Network e.V.
Message-ID: <v0jkjc$bjkr$1@gwaiyur.mb-net.net>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
<v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
<v0ih8d$99fr$1@gwaiyur.mb-net.net>
<v0ipkk$bpp9$1@raubtier-asyl.eternal-september.org>
<v0j0m2$a90o$2@gwaiyur.mb-net.net>
<v0j22q$dk6f$1@raubtier-asyl.eternal-september.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 27 Apr 2024 19:44:44 -0000 (UTC)
Injection-Info: gwaiyur.mb-net.net;
logging-data="380571"; mail-complaints-to="abuse@open-news-network.org"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:dFBf1m2Lwl5PiM7nYVebmlcuwzU= sha256:ngrmZ1kSZQ/XVmckJYTmVdm00IN6mKKgVG9kqvfbxXo=
sha1:cxC9JuQjAXcoeJYPZ3QlYJWy+1M= sha256:zk2INFuDi+RuBpMDwR9/vc8VY1LHFgJsLp2uwuuaFCg=
Content-Language: de-DE
In-Reply-To: <v0j22q$dk6f$1@raubtier-asyl.eternal-september.org>
View all headers

Am 27.04.24 um 16:28 schrieb Bonita Montero:
>> Keine Ahnung, wie das die Runtime macht. Aber die Berechnungszeit von
>> sin() steigt hier von etwa 10ns bei kleinen Zahlen auf 150ns und mehr
>> bei großen. Das ist schon eklatant.
>
> Du musst echt irgendwas verkehrt messen oder eine uralte CPU haben.

Knapp 10 Jahre schätze ich.

> Meine 7950X Zen4-CPU braucht für eine sin()-Operation ca. 7ns mit
> g++ 12, das wären ca. 40 Takte bei 5.7GHz;

Aber 10ns vs. 7ns finde ich dafür ziemlich gut. Das wären ungefähr
genauso viele Takte.

> x87 FSIN ist mit diesem
> Compiler nur fünfmal langsamer.

War hier nur gut 3-mal, mit Parameterübergabe am Stack eher 4-mal.

Marcel

Subject: Re: FSIN vs sin()
From: Bonita Montero
Newsgroups: de.comp.lang.c
Organization: A noiseless patient Spider
Date: Sun, 28 Apr 2024 04:03 UTC
References: 1 2 3 4 5 6 7 8
Path: i2pn2.org!i2pn.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!raubtier-asyl.eternal-september.org!.POSTED!not-for-mail
From: Bonita.M...@gmail.com (Bonita Montero)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Sun, 28 Apr 2024 06:03:00 +0200
Organization: A noiseless patient Spider
Lines: 15
Message-ID: <v0khpg$rpoj$1@raubtier-asyl.eternal-september.org>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
<v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
<v0ih8d$99fr$1@gwaiyur.mb-net.net>
<v0ipkk$bpp9$1@raubtier-asyl.eternal-september.org>
<v0j0m2$a90o$2@gwaiyur.mb-net.net>
<v0j22q$dk6f$1@raubtier-asyl.eternal-september.org>
<v0jkjc$bjkr$1@gwaiyur.mb-net.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sun, 28 Apr 2024 06:02:57 +0200 (CEST)
Injection-Info: raubtier-asyl.eternal-september.org; posting-host="7b71e943e08bab7b984b48dff94e6881";
logging-data="911123"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18Fr7Vi8QvUQt8zKjID0S7zgQGpZhXVn5I="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:cNTgbkCo/A5smFxAAd6BX+7ML9U=
In-Reply-To: <v0jkjc$bjkr$1@gwaiyur.mb-net.net>
Content-Language: de-DE
View all headers

Am 27.04.2024 um 21:44 schrieb Marcel Mueller:

> Aber 10ns vs. 7ns finde ich dafür ziemlich gut. Das wären ungefähr
> genauso viele Takte.

Ja, aber es gibt keine großen Timings bei großen Werten, auch wenn
ich 1E10 hinzuaddiere.

> War hier nur gut 3-mal, mit Parameterübergabe am Stack eher 4-mal.

Die Parameterübergabe am Stack macht bei so einer komplexen
Operation gar nichts aus. Der Code für den g++ nutzt ja inline
-Assembly und ist genauso schnell wie der unter Windows mit dem
Umkopieren.

Subject: Re: FSIN vs sin()
From: Bonita Montero
Newsgroups: de.comp.lang.c
Organization: A noiseless patient Spider
Date: Thu, 2 May 2024 11:36 UTC
References: 1 2 3 4
Path: i2pn2.org!i2pn.org!news.nntp4.net!news.hispagatos.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!raubtier-asyl.eternal-september.org!.POSTED!not-for-mail
From: Bonita.M...@gmail.com (Bonita Montero)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Thu, 2 May 2024 13:36:42 +0200
Organization: A noiseless patient Spider
Lines: 94
Message-ID: <v0vts9$3qphu$1@raubtier-asyl.eternal-september.org>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
<v0gs9v$1sgg$2@gwaiyur.mb-net.net>
<v0i0fp$6ees$1@raubtier-asyl.eternal-september.org>
<v0ih8d$99fr$1@gwaiyur.mb-net.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 02 May 2024 13:36:42 +0200 (CEST)
Injection-Info: raubtier-asyl.eternal-september.org; posting-host="fc01b5cced46b9bd2db0b176923fffe4";
logging-data="4023870"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+AYBc92OY7boDkc5XAfPgbJwquJpW/O4E="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:e3E04xrgmBFJYuU3Zvmte28RdJQ=
In-Reply-To: <v0ih8d$99fr$1@gwaiyur.mb-net.net>
Content-Language: de-DE
View all headers

Am 27.04.2024 um 11:41 schrieb Marcel Mueller:

> Die eingebaute sin-Funktion wird dann auch langsamer, weil fmod recht
> teuer ist.

fmod() ist bei kleinen Exponenten-Differenzen bis einschließlich 11
bei der glibc sehr schnell, denn dann kann der Dividend einfach nach
links geschoben werden und mit Integer-Operationen dividiert werden.

Ich hab mal ein sin() gebastelt das mit dem Taylor-Algorithmus arbeitet
und den ganzen Wertebereich eines doubles handeln kann. Hier der Code
mit nem kleinen Benchmark:

#include <iostream>
#include <span>
#include <array>
#include <bit>
#include <numeric>
#include <chrono>
#include <atomic>

using namespace std;
using namespace chrono;

double taylor( double angle );

atomic<double> aSum( 0.0 );

int main()
{ constexpr double PI = 3.14159265358979323846264338327950288;
vector<double> angles;
for( int i = 0; i != 100; ++i )
angles.emplace_back( i * PI / 100 );
double sum = 0.0, l = 0.0;
auto start = high_resolution_clock::now();
for( size_t i = 1'000'000; i; --i )
for( double d : angles )
sum += l = taylor( d + l ),
l *= numeric_limits<double>::denorm_min();
cout << duration_cast<nanoseconds>( high_resolution_clock::now() -
start ).count() / 1.0e8 << endl;
aSum = sum;
}

double taylor( double angle )
{ double neg = 1.0;
if( angle < 0.0 )
angle = -angle,
neg = -1.0;
constexpr double PI = 3.14159265358979323846264338327950288;
angle = fmod( angle, 2 * PI );
if( angle > PI )
angle -= PI,
neg = -neg;
if( angle > PI / 2 )
angle = PI - angle;
static double const rawReverseFacs[] =
{
0x1.0000000000000p+0,
0x1.5555555555555p-3,
0x1.1111111111111p-7,
0x1.a01a01a01a01ap-13,
0x1.71de3a556c734p-19,
0x1.ae64567f544e4p-26,
0x1.6124613a86d09p-33,
0x1.ae7f3e733b81fp-41,
0x1.952c77030ad4ap-49,
0x1.2f49b46814157p-57,
0x1.71b8ef6dcf572p-66
};
span reverseFacs( rawReverseFacs );
array<double, 11> chain;
double poly = angle;
for( size_t i = 0; i != 11; ++i )
chain[i] = bit_cast<double>( (uint64_t)(i % 2) << 63 | 0x3FFull << 52
) * poly * reverseFacs[i],
poly *= angle * angle;
return neg * accumulate( chain.rbegin(), chain.rend(), 0.0 );
}

Auf jeden Fall ist bei mir dann die mittlere Zeit bis Zum Ergebnis ca.
30,8ns bei 5.7GHz, also ca. 175 Takte. Für wirklich große Winkel kann
das fmod() schon reinhauen, aber der Regelfall ist das aus besagtem
Grund wirklich nicht.
Ich mein in Anbetracht der Performance obigen Algorithmusses und der
Tatsache, dass FSIN ähnlich langsam ist liegt der Verdacht nahe, dass
FSIN wirklich mit einer Polynomlösung arbeitet, wie folngende Intel
-Seite meint:
https://www.intel.com/content/www/us/en/developer/articles/technical/the-difference-between-x87-instructions-and-mathematical-functions.html
Ich frag mich aber wieso die meinen, dass die Taylor-Lösung schneller
ist als die Cordic-Lösung, ist sie ja nachweislich nicht.

Subject: Re: FSIN vs sin()
From: Bonita Montero
Newsgroups: de.comp.lang.c
Organization: A noiseless patient Spider
Date: Mon, 6 May 2024 13:03 UTC
References: 1
Path: i2pn2.org!i2pn.org!news.samoylyk.net!news.swapon.de!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!raubtier-asyl.eternal-september.org!.POSTED!not-for-mail
From: Bonita.M...@gmail.com (Bonita Montero)
Newsgroups: de.comp.lang.c
Subject: Re: FSIN vs sin()
Date: Mon, 6 May 2024 15:03:49 +0200
Organization: A noiseless patient Spider
Lines: 2
Message-ID: <v1akfh$2iqg0$1@raubtier-asyl.eternal-september.org>
References: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Mon, 06 May 2024 15:03:45 +0200 (CEST)
Injection-Info: raubtier-asyl.eternal-september.org; posting-host="e06fe4b76d6897bf55db3e92b14fce2d";
logging-data="2714112"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+m4Kx0lqKIeoV6Ds1HXUFWqa54dqTxA30="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:IsEs4qJbzPy+mTe8pHfknuVXI2I=
In-Reply-To: <v0gfkb$3okfh$1@raubtier-asyl.eternal-september.org>
Content-Language: de-DE
View all headers

Total faszinierend: sin() gibt mit der glibc Bit-identische Ergebnisse
zu FSIN, braucht aber nur 40% der CPU-Zeit weils auf Cordic basiert.


rocksolid / de.comp.lang.c / FSIN vs sin()

1
server_pubkey.txt

rocksolid light 0.9.12
clearnet tor