|
Seite 4 [1 2 3 4] | 4 Seiten |
Autor |
Porrobipartitodividuellzahl |
|
hyperG
Senior  Dabei seit: 03.02.2017 Mitteilungen: 2106
 | Beitrag No.120, eingetragen 2023-06-28
|
Ich kenne mich unter CUDA per Mathematica nicht so aus & meine Grafikkarte ist auch nicht für schnelles Rechnen gedacht.
Das Problem scheint das große Array zu sein, dass ich erst füllen & übergeben muss.
Zwar konnte ich die Länge der in- & out-Arrays halbieren mit:
\sourceon CUDA
out[index] = 9999999999999999998/in[index]+9999999999999999998/(in[index]+length);
\sourceoff
aber ich habe den Trick noch nicht herausbekommen, wie ich grundsätzlich vom großen Array (also die Länge der For-Schleife wegkomme (wenigstens Reduzierung auf Kernanzahl 1024).
Außerdem bin ich mit dem aktuellem CUDA über 340 mal langsamer als per c++ mit 20 Threads. (ohne Array-Füllung & CUDA-Load auch noch 221 mal langsamer)
Klingt nicht effektiv bei meiner Grafikkarte & dem "Loader".
Außerdem komme ich selbst mit dem Halbierungs-Trick nur auf Schleifen-Länge 299999232.
|
Profil
|
hyperG
Senior  Dabei seit: 03.02.2017 Mitteilungen: 2106
 | Beitrag No.121, eingetragen 2023-06-28
|
Da nun die 64-Bit Grenze ansteht -> habe ich
- auf GMP gewechselt
- eine neue exakte Abkürzung für die letzten ultralangen Summen gefunden
https://matheplanet.com/matheplanet/nuke/html/uploads/c/47407_NonLinRegress478_Konst2.png
Später mehr...
Grüße
|
Profil
|
hyperG
Senior  Dabei seit: 03.02.2017 Mitteilungen: 2106
 | Beitrag No.122, eingetragen 2023-06-29
|
Analog Beitrag 113 hier mal die Berechnung für 10^31-1 mit 3 Berechnungsblöcken:
- Block 1 Python, wobei die großen Summen als Aufgabe (String) ausgegeben werden
- Block 2 Summe aus Quotienten per GMP-cpp
- Block 3 Summe aus Quotienten per cpp mit Zusammenfassung gleicher Quotienten
\sourceon Python
Out:
+ Sum( floor(9999999999999999999998/ r), r= 100000000...999999999) Summanden=89999999990000 23025850974940006927106 in 45.315 s GMP Block 2
+ Sum( floor(999999999999999999998/ r), r= 1000000000...9999999999) Summanden=899999999990 2302585093439545722239 in 518.940 s GMP
+ Sum( floor(99999999999999999998/ r), r= 10000000000...99999999999) Summanden=45000000000 230258509258904653777 in 5776.979 s GMP über 1 h !!!
+ Sum( floor(9999999999999999998/ r), r= 100000000000...999999999999) Summanden=444510000000 wird Block 3
+ Sum( floor(999999999999999998/ r), r= 1000000000000...9999999999999) Summanden=4444434900000
+ Sum( floor(99999999999999998/ r), r= 10000000000000...99999999999999) Summanden=44434570095000
+ Sum( floor(9999999999999998/ r), r= 100000000000000...999999999999999) Summanden=434782608695640
10^31 = 2089438970689359602437062750212 in 19.695s py-Berechnung Block 1
\sourceoff
Da die hinteren Summen aus Block 3 zu lange dauern, fasste ich Blöcke mit gleichen Summanden zusammen und ging von Mathematica auf das zig mal schnellere cpp mit 20 Kerne über:
\sourceon cpp
unsigned __int64 multtaskSum(const unsigned __int64 uOben, const unsigned __int64 a, const unsigned __int64 b)
{
unsigned __int64 u64Sum=0;
for (unsigned __int64 i1 = a; i1 <= b; i1++) u64Sum += (uOben / i1 - uOben /(i1+1))*i1;
return u64Sum;
}
...
#pragma omp parallel num_threads(uKerne)
{ int tid = omp_get_thread_num();
uAnz[tid]= multtaskSum(in64[0], (unsigned __int64 (dDiff*double(tid)))+ u64von, (tid+1==uKerne)? u64bis:(unsigned __int64(dDiff*double(tid+1)))+ u64von -1);
}
\sourceoff
\sourceon Python
#Block 3 Ergebnisse per cpp alle unter 0,1 s !!
+ Sum( floor(9999999999999999998/ r), r= 100000000000...999999999999) Summanden=444510000000 23025851581981521827 berechnet sich aus 3 Untersummen:
#SumFloorDivOMPhQ.exe 9999999999999999998 100000000000 400999999998 0.049 s Ergebnis=13887912607734768089
#SumFloorDivOMPhQ.exe 9999999999999999998 400999999999 700999999998 0.013 s Ergebnis= 5585464668277710409
#SumFloorDivOMPhQ.exe 9999999999999999998 700999999999 999999999999 0.005 s Ergebnis= 3552474305969043329 }
+ Sum( floor(999999999999999998/ r), r= 1000000000000...9999999999999) Summanden=4444434900000 0.002 s Ergebnis=2302580593002745457 hQ Block 3
+ Sum( floor(99999999999999998/ r), r= 10000000000000...99999999999999) Summanden=44434570095000 0.001 s Ergebnis=230213517549408270 hQ
+ Sum( floor(9999999999999998/ r), r= 100000000000000...999999999999999) Summanden=434782608695640 0.000 s Ergebnis= 22584092636713705 hQ
\sourceoff
Zusammen Block 1...3:
\sourceon Mathematica
Total[{2089438970689359602437062750212,
23025850974940006927106,
2302585093439545722239,
230258509258904653777,
23025851581981521827,
2302580593002745457,
230213517549408270,
22584092636713705}]
N[(10^31-1)/%,22]
Out[16]= 2089438996273635409860690442593
Out[17]= 4.785973659836100874614
\sourceoff
Das habe ich dann genauer untersucht und die Quotienten der Differenzen gebildet. Im Wechsel 5,375 und 1,860:
https://matheplanet.com/matheplanet/nuke/html/uploads/c/47407_NonLinRegress478_Konst3.png
Ab 10^32 fortgesetzt und so von 12 auf bis zu 18 Nachkommastellen
fortgesetzt.
Eine mögliche Formel zur Konstante aus Pi & e konnte relativ klein gehalten werden.
Grüße Gerd
P.S.:
Für noch größere n könnte ich noch einen Block zwischen Block 2 und 3 schieben:
für zu große Zwischenergebnisse den Block 3 nach GMP umformen...
Nachtrag: 23025851581981521827 scheint wegen der Stückelung nicht exakt zu stimmen (weil die zusätzlichen Grenzen den Abkürzungsalgorithmus negativ beeinflussen). Wenn ich diese Summe ohne Stückelung per GMP mit größeren möglichen Ganzzahlen berechne, kommt ein minimal anderes Ergebnis heraus.
|
Profil
|
hyperG
Senior  Dabei seit: 03.02.2017 Mitteilungen: 2106
 | Beitrag No.123, eingetragen 2023-06-30
|
So, Block 3 per GMP für noch größere Zahlen erweitert & Py bis zur RAM-Grenze ausgereizt -> macht ein maximales n=38 !!!
Das GUTE: meine Vorhersage aus Beitrag 122 ist nur minimal größer: nur die beiden letzten Ziffern sind anders.
Bei den 17 grünen Nachkommastellen der Konstante des letzten Bildes ändert sich somit NICHTS :-)
Grüße & schönes Wochenende 🕺🏼
|
Profil
|
cramilu hat die Antworten auf ihre/seine Frage gesehen. | Seite 4 | Gehe zur Seite: 1 | 2 | 3 | 4 |
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|