- Registriert
- Jan. 2007
- Beiträge
- 97
@leboh
Ist klar, das überlässt man bei richtigen Anwendungen den Fachleuten oder beschäftigt sich eingehend damit... um es dann doch wieder den Fachleuten zu überlassen. Hab mal in ein Buch über Monte-Carlo-Simulationen geschaut und da war auch ¾ vom Inhalt über Zufallszahlen, hat mich dann ziemlich abgeschreckt, aber momentan mache ich vieles schlicht, damit ich was zum Programmieren habe und mich mit verschiedenen Probleme rumschlagen kann und dann hoffentlich was lerne.
@kuddlmuddl
Mit dem Risiko, dass das eine blöde Frage ist: Was meinst du mit Partikelfiltern in diesem Kontext?
Ich hab jetzt mal .txt-Dateien mit Zufallszahlen gefüllt und lasse diese vom singlethread-Programm auslesen um mit ihnen zu arbeiten. Zum Vergleich habe ich noch eine Version vom singelthread-Programm, dass genau gleich aussieht, aber die Zahlen selbst erzeugt. Das Programm, das selbst erzeugt ist etwa 10 mal schneller, d.h. fúr mich lohnt es sich kaum, die Zahlen vorzubereiten. Evtl. mache ich beim Auslesen was nicht optimal?
Ich schau mir jetzt mal den Mersenne twister an, bzw zuerst bit-Operationen (habe ich bis jetzt noch nie benötigt), der ist laut Wikipedia der Standard-Generator für Monte-Carlo-Anwendungen, daher sicher auch ein wenig genauerer Betrachtung würdig.
Zum Thema Tabellisierung:
Dann müsste ich ja für einen gegebenen Wertebereich [a,b] je nach a und b wieder neue Tabellen berechnen. Dann noch in ein Programm einlesen und gezielt auslesen. Das ist ja auch ein grosser Rechenaufwand, gibt es da Faustregeln, wann der Vorteil der Tabelle den Nachteil des Auslesens überwiegt? bspw. dass ein scanf etwa 130 floating-point-operations entspricht, während ein sin(x) etwa 50 entspricht oder so? (ok, sin wird wohl über taylor-approximation berechnet, wo man etwa die flop schätzen könnte).
Gruss,
mahatma
So, habe jetzt diese (Link) Vorlage für den Mersenne Twister benutzt und bin (im singlethread) Programm etwa 1% langsamer, eher weniger. jedoch ist mein Resultat nun viel schlechter!
Im Test soll das Integral von x² berechnet werden im Interval [0,10]. Das Ergebnis sollte 333.333... sein, jedoch gibt das Programm mit dem Mersenne Twister Algo konsistent nur 33X.XXX aus, wobei die X nicht Dreien sind (
), die Version mit dem normalen rand() jedoch 333.3XX.
Was zum Teufel?
Ein Ort, wo ich den Fehler vermuten würde, ist die Umwandlung von unsigned int zu einem float, der bei mir so passiert (kopiert ist die ganze Funktion, die fettmarkierte Zeile enthält die
Umwandlung über einen Cast zu (float) für den Bruch über einen (long), wobei eine Änderung von long zu unsigned long keine Verbesserung bringt.
Ist klar, das überlässt man bei richtigen Anwendungen den Fachleuten oder beschäftigt sich eingehend damit... um es dann doch wieder den Fachleuten zu überlassen. Hab mal in ein Buch über Monte-Carlo-Simulationen geschaut und da war auch ¾ vom Inhalt über Zufallszahlen, hat mich dann ziemlich abgeschreckt, aber momentan mache ich vieles schlicht, damit ich was zum Programmieren habe und mich mit verschiedenen Probleme rumschlagen kann und dann hoffentlich was lerne.
@kuddlmuddl
Mit dem Risiko, dass das eine blöde Frage ist: Was meinst du mit Partikelfiltern in diesem Kontext?
Ich hab jetzt mal .txt-Dateien mit Zufallszahlen gefüllt und lasse diese vom singlethread-Programm auslesen um mit ihnen zu arbeiten. Zum Vergleich habe ich noch eine Version vom singelthread-Programm, dass genau gleich aussieht, aber die Zahlen selbst erzeugt. Das Programm, das selbst erzeugt ist etwa 10 mal schneller, d.h. fúr mich lohnt es sich kaum, die Zahlen vorzubereiten. Evtl. mache ich beim Auslesen was nicht optimal?
Code:
File *random_numbers;
random_numbers = fopen("random_numbers.txt","r");
[...]
fscanf(random_numbers, "%f", &randno)
[...]
Zum Thema Tabellisierung:
Dann müsste ich ja für einen gegebenen Wertebereich [a,b] je nach a und b wieder neue Tabellen berechnen. Dann noch in ein Programm einlesen und gezielt auslesen. Das ist ja auch ein grosser Rechenaufwand, gibt es da Faustregeln, wann der Vorteil der Tabelle den Nachteil des Auslesens überwiegt? bspw. dass ein scanf etwa 130 floating-point-operations entspricht, während ein sin(x) etwa 50 entspricht oder so? (ok, sin wird wohl über taylor-approximation berechnet, wo man etwa die flop schätzen könnte).
Gruss,
mahatma
Ergänzung ()
So, habe jetzt diese (Link) Vorlage für den Mersenne Twister benutzt und bin (im singlethread) Programm etwa 1% langsamer, eher weniger. jedoch ist mein Resultat nun viel schlechter!
Im Test soll das Integral von x² berechnet werden im Interval [0,10]. Das Ergebnis sollte 333.333... sein, jedoch gibt das Programm mit dem Mersenne Twister Algo konsistent nur 33X.XXX aus, wobei die X nicht Dreien sind (
Was zum Teufel?
Ein Ort, wo ich den Fehler vermuten würde, ist die Umwandlung von unsigned int zu einem float, der bei mir so passiert (kopiert ist die ganze Funktion, die fettmarkierte Zeile enthält die
Umwandlung über einen Cast zu (float) für den Bruch über einen (long), wobei eine Änderung von long zu unsigned long keine Verbesserung bringt.
Code:
void kernel( double a, double b, double (*function)(double), double* integral_val){
// a and b are the boundaries of the interval, *function a pointer to the function to be integrated and the result will be saved at integral_val
double value_sum=0;
int i;
int rand_counter = 0;
long mt_MAX = pow(2,32)-1;//maximum value of mt_random[]
float rand_zero_one;//random number between zero and one
float rand_interval;//random number in interval given by a and b
for(i=0; i<N; i++){
//if mt_buffer has been read, start over at the beginning and create new random numbers
if(rand_counter==MT_LEN){
mt_random();
rand_counter=0;
}
[B] rand_zero_one = (float)mt_buffer[rand_counter]/mt_MAX;[/B]
rand_interval = rand_zero_one*(b-a)+a;
value_sum += function( rand_interval );
rand_counter++;
}
//save result in integral_val
*integral_val = (double)(b-a)*1.f/N*value_sum;
}