![]() |
Benchmark Algorythmus
Hallo Leute,
ich suche eine Berechnung die extrem CPU lastig ist, aber nicht stark auf den RAM geht. Je simpler der Algorythmus desto besser, es soll nacher ein Benchmark für bestimmte Prozessoren werden, also fertige Programme bringen mir nichts. Ob delphi oder anderes ist mir egal, wird nacher eher nicht in Delphi gemacht werden können. Also, wer kann was bieten? Was ist mit Primzahlentests? Sieb des Archimedes z.b. geht extrem auf den Ram, also nichts für mich! Danke für ein Paar hilfen! TO |
Re: Benchmark Algorythmus
Das hier müsste extrem auf die CPU, aber kaum aufs RAM gehen:
Delphi-Quellcode:
var i: Integer;
begin i := 10; Randomize; while SomeCondition do i := (i + Random(i) * Random(i)) mod High(Integer); end; |
Re: Benchmark Algorythmus
oki, ich muß noch folgendes sagen: es sollten auf Zeit reproduzierbare ergebnisse sein, so dass ich sagen kann, CPU 1 bekommt das in x sekunden hin und CPU 2 in y sekunden. Ich geh doch recht in der Annahme, dass sobald Zufall ins Spiel kommt die Sache und damit auch die Ergebnisse recht zufällig werden und meinen Anforderungen nicht entsprechen?
|
Re: Benchmark Algorythmus
Der Zufallsanteil darin ist nur gut, um die CPU auszulasten, sie braucht trotzdem ungefähr gleich lange für N Iterationen dieser Schleife. Für Benchmarks, die Zeit messen, nimmst du eben eine for-Schleife mit z.B. 10.000.000 Iterationen und misst die Zeit- ;-)
|
Re: Benchmark Algorythmus
Damm probiers mal mit Fibonacci ;) Müsste irgendwo inner Math.pas drinstehen, das geht auch ganzschön auf die CPU!
|
Re: Benchmark Algorythmus
fibonacci ist nicht geeignet, weil die zahlen zu schnell zu groß werden, mir stehen auf den zu verwendeten Prozessoren nur max. 32bit Interger zur verfügung. Trotzdem danke, aber hat noch jemand noch gute Vorschläge?
|
Re: Benchmark Algorythmus
*Push* niemand ne Idee, also eine ohne Random und wo man mit 32 bit auskommt?
|
Re: Benchmark Algorythmus
Was mir gerade so einfällt ist der BubbleSort. Aber so Rechenlastig ist der nun auch wieder nicht...
|
Re: Benchmark Algorythmus
Was hast du denn gegen Dax' Vorschlag?
Wenn auf der Zielplattform ein Zufallsgenerator zur Verfügung steht, der die Zufallszahlen synchron erzeugen kann (also für jede Zahl die gleiche Zeit braucht, z.B. einen Takt, weil er sie aus einem Pool holt), dann ist gegen sowas eigentlich nichts einzuwenden. Du rechnest ja nur mit den Random-Werten, und eine Integer-Berechnung benötigt immer gleich viele Taktzyklen, egal ob von den 32bit nun sieben oder siebzehn auf 1 gesetzt sind. Wo wir aber auch schon bei der nächsten Frage sind: Was für eine Architektur isses denn? Du fragst uns nach einem Rechenlastigen Benchmark für eine spezialisierte Architektur, verrätst aber nicht, welche es ist. Wenn die Architektur z.B. massiv viele Pipelines einsetzt, sollte man versuchen alle Pipelines um jeden Preis auszulasten und viele Sprünge zu vermeiden, damit nicht jedesmal die Pipelines neu befüttert werden müssen. Hat der Prozessor nur eine Pipeline, spielt das natürlich keine Rolle und man kann sich auch auf Schleifen konzentrieren, sofern die Architektur keine geisteskranke Sprungvorhersage hat. Hat sie eine, muss man sich nach ihr richten. Und wie schnell ist das Speicherinterface im Vergleich zum Prozessor? Darf man den Speicher ruhig für Daten benutzen, oder ist man auf die zahl der Register beschränkt? Wie sieht's mit synchronem Cache aus? Wie groß ist er? Gibt's überhaupt welchen, oder gibt's nur langsamer getakteten Cache? Wieviel langsamer getaktet ist der? U.u. müsste man direkt Assembler-Beispiele nehmen, denn man weiß sonst nie, welche Variablen der Compiler auf den Stack legt, und wie groß der Stack sein darf, damit er in den schnelleren Cache ausgelagert werden kann. |
Re: Benchmark Algorythmus
Zitat:
oder ping doch mal hagen [negaH] an vielleicht hat der eine Idee! |
Re: Benchmark Algorythmus
Zitat:
Zitat:
Zitat:
Edit, die 19823.: Aaaargh, ich hasse meinen Browser-Cache! :wall: |
Re: Benchmark Algorythmus
Du hattest doch schon sowas wie Primzahlentest vorgeschlagen. Warum nimmst du das dann nicht auch?
Delphi-Quellcode:
(ja, ich weiß, die Funktion könnte man noch deutlich optimieren, aber da es hier ja darum geht, eine gewisse Auslastung zu erreichen, erspare ich mir das mal.)
function Ist_Prim(n: LongWord): Boolean;
//LongWord ist ein vorzeichenloser 32bit-Integertyp var i: Longword; begin if n>=2 then Result:= True else Result:= False; i:= 2; while (Result and (i<=n-1)) do begin Result:= ((n mod i)<>0); i:= i+1; end;//while end; Diese Funktion kann man dann in einer for-Schleife laufen lassen und mit GetTickCount die Zeit nehmen:
Delphi-Quellcode:
MfG
var x, t: LongWord;
begin t:= GetTickCount;//Zeit nehmen for x:= 2 to 1000000 do Ist_Prim(x); t:= GetTickCount -t; ShowMessage('Dauer: '+IntToStr(t)+' ms'); end; Binärbaum |
Re: Benchmark Algorythmus
Man kann auch einfach Integeradditionen/divisionen/potenzen/wurzeln bzw. das gleiche mit Float.
Einfach, aber es funktioniert. |
Re: Benchmark Algorythmus
Zitat:
Und Wurzeln sind in den seltensten Fällen auch wieder Integer-Werte (z.B. bei sqrt(2)= 1.41....). Wer lesen kann ist halt klar im Vorteil. |
Re: Benchmark Algorythmus
Ich kann ja nicht wissen, dass Floats 48-Bit Variablen sind, ich bin schließlich doch ein Newbie und habe keine Ahnung von den Hintergründen.
|
Re: Benchmark Algorythmus
Zitat:
Solange der OP nichts über die Architektur verrät, können wir hier weiter im Dunkeln tappen und irgendwelche Berechnungen in die Luft werfen, Benchmarks sind und bleiben ziemlich oft Architekturspezifisch. Wenn ich 3GB Cache habe, kann mir der Speicherzugriff egal sein, da ich praktisch nie auf den langsamen RAM zugreife. In einem solchen Fall kann ich auch schonmal 10000x10000 Matrizen durch den Rechner jagen. Wenn ich hingegen mehrere Dutzend Pipelines habe, muss ich dafür sorgen, daß der Code so aussieht, daß auch jede Pipeline sinnvoll benutzt werden kann. Aber das schrob ich ja alles schon... |
Re: Benchmark Algorythmus
Zitat:
Man könnte auch statt Real den Typ Single verwenden. Der wäre dann 32 bit groß. Allerdings ist ein Float-/ Real-Typ doch auch was anderes als ein Ganzzahl-/Integer-Typ. Schleißlich kann man mit einem Integer keine Werte wie 1234.56789 darstellen. Und das könnte bzw. sollte man doch wissen (auch wenn man sich noch als Newbie einstuft). MfG Binärbaum |
Re: Benchmark Algorythmus
Natürlich weiß ich, was ein Float ist. Ich habe ja auch gesagt, man kann die Berechnung sowohl mit Integern als auch mit Floats machen, was dann natürlich auch unterschiedliche Ergebnisse bringt, denn Floats sind natürlich deutlich langsamer. Ich habe nie behauptet, dass es das gleiche ist, was man nimmt.
|
Re: Benchmark Algorythmus
WARUM nicht einfach sowas:
Delphi-Quellcode:
Oder irgend so einen Schwaschsinn. Du kannst wahrscheinlich auch einfach konstante Werte nehmen... Ich weiß nur nicht, ob der Compiler dann irgendwelche Optimierungen vornimmt, die ganz überl sind...
function benchmark:integer; //gibt die dauer in ms zurück
var i,temp:integer; begin result :=getTickCount(); for i:=0 to 30000 do begin temp :=round(i+sqr(i)-sqrt(i)*i+3/i); end; result :=result -getTickCount(); end; |
Re: Benchmark Algorythmus
Die Compileroptimierungen kann man doch ausschalten, oder? :gruebel:
Und @Binärbaum: Vielleicht sollten wir aufhören mit diesem *Streit*. Sonst kommt noch ein Mod und schließt den Thread oder sowas in der Art. |
Re: Benchmark Algorythmus
Zitat:
Oder irre ich mich da? (Bin mir auch nicht so sicher :| ) |
Re: Benchmark Algorythmus
ich gaube {$OPTIMAZIATION OFF} oder so... ich weiß es aber nicht so genau. In jedem Fall wäre das Problem damit gelöst...
|
Re: Benchmark Algorythmus
Zitat:
Und ohne Compileroptimierung weiß man auch nicht, was der Compiler unoptimiert draus macht, wenn man den Assemblercode nicht selber schreibt, sodaß ein derartiges Benachmark auch wieder nicht repräsentativ für optimierte Programme ist. Dax' Beispiel wäre an sich schon nicht schlecht, wenn der Zufallsgenerator schnell und gleichmäßig genug ist. Den Hinweis, daß man in allen anderen Fällen mehr über das System kennen muss, spare ich mir hier. Hoppala :mrgreen: |
Re: Benchmark Algorythmus
das thema ist recht alt und ich hatte die hoffnung schon aufgegeben einen ordentlichen Algorithmus zu finden. Es geht bei den Benchmarks um sehr verschiedene Prozessoren, angefangen von standart i386 über xscales bis hin zu kleinen microcontrollern. Deshalb sollen auch möglichst einfache Zahlen verwendet werden damit die grundbedingungen für alle cpus möglichst gleich ist.
Danke TO |
Re: Benchmark Algorythmus
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz