| 
				
					|  | 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, 00: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, 01: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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 06.11.2010, 02: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: 2531
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 06.11.2010, 17: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, 19: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, 11: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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 07.11.2010, 14: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.
 
 |  |