 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 06.11.2010, 01:16 Titel: pi |
|
|
Hallo zusammen,
irgendwie wollte ich unbedingt mal die funktion zum annähern an pi:
Code: |
dim i as integer
dim v as double
cls
do
i = i +1
v = v + (1 / i^2)
print sqr(v*6)
loop
|
per threads beschleunigen:
Code: |
const threads = 32 ' Anzahl der Threads
type calcparam
threadID as any ptr
i_start as double
i_stop as double
result as double
end type
dim shared results(1 to threads) as calcparam
sub calcthread(p as calcparam ptr)
dim r as double
with *p
for i as double = .i_start to .i_stop
.result = .result + (1 / i^2)
next
end with
end sub
dim i as double
dim v as double
dim stp as double = 80000 'Schrittweite pro Thread
cls
i = 0
do
for t as integer = 1 to threads
with results(t)
.i_start = i + ((t-1) * (stp / threads)) +1
.i_stop = i + (t * (stp / threads))
.threadID = threadcreate(cast(any ptr, @calcthread), @results(t))
end with
next
v = 0
for r as integer = 1 to threads
threadwait(results(r).threadID)
v = v + results(r).result
next
print "Iteration:" & int(i) & " Wert:" & sqr(v * 6)
i = i + stp
loop
|
Und nun habe ich irgendwie die vermutung, dass sich irgendwo ein fehler eingeschlichen hat.. weiss nur nicht wo
vor allem bin ich noch am rätseln welche werte man für die anzahl der Threads und für die Schrittweite pro thread annehmen sollte..
vielleicht hat ja einer eine idee... würd mich freuen!
Schönes Wochenende!!! |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 06.11.2010, 02:54 Titel: |
|
|
also 32 threads ist auf jeden fall hoffnungslos übertrieben, mehr als 8 kerne hast du eh in keiner cpu. Und solltest du auf Massivparallele architekturen (cuda/opencl) abzielen solltest du irgendwo bei 128 threads anfangen, aber das geht glaub ich mit fb nicht so gut.
Ansonsten seh ich so spontan keinen fehler, aber du hast auch mit keinem wort erwähnt warum da ein fehler sein soll du glaubst da ist einer, aber wenn da einer ist müsste er dir doch aufgefallen sein oder? Ich mein, es gibt nur einen wert als ausgabe der falsch sein könnte, entweder der ist nicht falsch oder es liegt offensichtlich ein fehler vor. "Ich glaube da ist ein Fehler" ist in dem fall nicht drin x)
und schrittweite - überleg dir halt wie viele iterationen du insgesamt haben willst und teil das durch die anzahl der threads.
grob überschlagen - 80000 steps pro thread bei 32 threads macht nen iterationsschritt von 0,000000000000152587890625 im letzten thread, die wurzel des sechsfachen ist also 0,00000095683193077467894460831409168199, was zwar (glaub ich) ne relativ kräftige überschätzung ist (aus der summe kürzt der dumme, gleiches gilt für wurzeln, das hab ich da mal getrost ignoriert), aber dennoch bietet double dir ne menge mehr platz an nachkommastellen, du kannst also vermutlich durchaus noch ne ecke höher gehen als 2560000 iterationen insgesamt gehen ohne dass es völlig sinnlos wird. Die frage ist halt wie lang das rechnen dauert bzw wie viel zeit du dafür aufbringen willst. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 06.11.2010, 03:56 Titel: |
|
|
Meine Mathevorlesungen sind schon wieder Ewigkeiten her, aber vielleicht kannst du die Zwischenergebnisse bei Bedarf mit der verallgemeinerten Faulhaberschen Formel für p=-2 überprüfen.
http://de.wikibooks.org/wiki/Formelsammlung_Mathematik:_Endliche_Reihen _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.11.2010, 18:19 Titel: Re: pi |
|
|
OneCypher hat Folgendes geschrieben: | Code: | dim i as integer
dim v as double
cls
do
i = i +1
v = v + (1 / i^2)
print sqr(v*6)
loop |
|
Interessante Reihe, nur dass sie sehr langsam konvergiert. Dies liegt an einer relativ langsamen Konvergenzgeschwindigkeit des Terms 1/i^2 mit i gegen unendlich.
MisterD hat Folgendes geschrieben: | also 32 threads ist auf jeden fall hoffnungslos übertrieben, mehr als 8 kerne hast du eh in keiner cpu. |
Sonst musst Du Dir ein 19"-Rack mit mehreren zu einem Cluster zusammengeschalteter Servern zulegen, bei welchem jedes Motherboard gleich ein ganzes Array von CPUs schluckt. ;-)
Übrigens ganz früher im NT 4.0-Zeitalter war DualCore noch völlig unbekannt, man musst dort noch ein Motherboard mit mehreren CPU-Sockel verwenden und entsprechend bestücken, um im Windows-Taskmanager mehrere CPU-Last-Fensterchen zu bekommen...
MisterD hat Folgendes geschrieben: | grob überschlagen - 80000 steps pro thread bei 32 threads macht nen iterationsschritt von 0,000000000000152587890625 im letzten thread, die wurzel des sechsfachen ist also 0,00000095683193077467894460831409168199, was zwar (glaub ich) ne relativ kräftige überschätzung ist (aus der summe kürzt der dumme, gleiches gilt für wurzeln, das hab ich da mal getrost ignoriert), aber dennoch bietet double dir ne menge mehr platz an nachkommastellen, du kannst also vermutlich durchaus noch ne ecke höher gehen als 2560000 iterationen insgesamt gehen ohne dass es völlig sinnlos wird. |
Da gibt es noch ein sehr praktisches Problem: Auch wenn Du genügend Rechenpower hättest, so werden sich bei der hier gewählten Reihe unvermeidlich die Rundungsfehler (Stichwort Maschinengenauigkeit von Double-Werte!) sehr stark aufkumulieren. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 06.11.2010, 20:04 Titel: |
|
|
Da die einzige verkettete operation die er durch die ganze reihe macht das aufsummieren ist verstärken sich die fehler aber nicht, ich denke das kann man in dem fall hier relativ vernachlässigen da auf- und abrundungs-fehler sich sogar entgegenwirken. Es ist ja nicht so dass er das ergebnis eines schritts für den nächsten benutzt wo sich der fehler dann um irgendeinen faktor hochskalieren könnte.
naja 8 kerne.. n quadcore mit hyper threading halt oder sowas ;p _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 07.11.2010, 12:22 Titel: |
|
|
Hi!
Also ich habn 4 kern rechner mit hyperthreading. also logische 8 kerne.
Das ich dort 32 threads eingetragen habe, liegt daran, dass die geschwindigkeit mit 8 threads zwar höher war als die single-thread lösung, aber doch noch deutlich langsamer war als die 32-thread-lösung.
Die werte für die schrittweite sind auch erst durchs ausprobieren entstanden..
Genauere Datentypen gibts in freebasic nicht oder?
Das sich die rundungsfehler aufsummieren könnte gut sein! .. schließlich addiert jeder thread zu sein eigenes ergebnis. hmm.. aber .. das ist dann auch nicht anders als die single-thread-lösung..
Bei 1000000-Iterationen sind in der Multi-thread-lösung genau so viele additionen geschehen wie in der single-thread-lösung.. daher wirds wohl da keinen unterschied geben..
Das ich irgendwo einen fehler vermute liegt daran, dass ich den verlauf des ergebnisses über die iterationen mit einer vorberechneten pi-zahl ausm taschenrechner vergleiche.
Da sieht man, dass die ersten ziffern hinterm komma super schnell berechnet werden und dann dauerts auf einmal ewig bis eine neue gültige ziffer erreicht wurde...
Verteiltes rechnen hatte ich auch schon überlegt, vielleicht bedien ich mich mal an der tsne-bibliothek  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 07.11.2010, 15:19 Titel: |
|
|
Zitat: | Da sieht man, dass die ersten ziffern hinterm komma super schnell berechnet werden |
Naja, super schnell ist das nicht gerade, wenn du bedenkst, wie viele tausend Berechnungen du für die ersten paar Stellen brauchst.
Dass du nach hinten immer länger für eine neue gültige Ziffer brauchst, ist bei diesem Verfahren nicht ungewöhnlich. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|