Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

pi

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 06.11.2010, 01:16    Titel: pi Antworten mit Zitat

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 traurig
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
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 06.11.2010, 02:54    Titel: Antworten mit Zitat

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 Zunge rausstrecken 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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 06.11.2010, 03:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.11.2010, 18:19    Titel: Re: pi Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 06.11.2010, 20:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 07.11.2010, 12:22    Titel: Antworten mit Zitat

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 zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 07.11.2010, 15:19    Titel: Antworten mit Zitat

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. happy
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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz