AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Leistungsindex von Mehrkernprozessoren ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Leistungsindex von Mehrkernprozessoren ermitteln

Ein Thema von Cyberstorm · begonnen am 20. Nov 2010 · letzter Beitrag vom 20. Nov 2010
Antwort Antwort
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#1

Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 11:06
hi.

ich habe ein sehr cpu lastiges programm (multi threaded).
ich implementiere gerade eine art netzwerk rendering um die cpu last auf mehrere multi core pc's aufzuteilen.

ich würde nun gerne einen leistungsindex für jede cpu erstellen, der technologien wie "Dynamic Acceleration", "Turbo Boost" etc. berücksichtigt.
ich will quasi wissen welcher rechner wieviel schafft und das unter volllast aller cpu-kerne/threads, da die arbeit vor der eigentlichen berechnung aufgeteilt werden muss.

das problem, welches ich sehe ist, dass die herkömlichen methoden um die cpu geschwindigkeit zu ermitteln alle auf einem thread basieren. und wenn ich nun dies tue und mit TSystemInfo.dwNumberOfProcessors multipliziere denke ich, dass das ergebnis durch oben genannte technologien verfälscht wird, da teilweise automatisch einzelne kerne höher getaktet werden, wenn die anderen idlen. (siehe z.b. http://www.tecchannel.de/pc_mobile/p...ur/index5.html)


lange rede kurze frage: gibt es schon eine entsprechende funktion um den leistungsindex zu ermitteln oder muss ich die selbst programmieren?

oder habe ich einen denkfehler in meiner überlegung?


vielen dank
konrad h.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 11:09
Zudem entsteht ja durch den Overhead der Prozesssynchronisierung weiterer Leistungsverlust. Ein 4-Kern-Prozessor leistet auch ohen Turbo-Boost nicht das 4fache wie ein SingleCore
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#3

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 11:25
Außerdem ist nicht jeder Kern einer CPU gleich schnell, bei einer bestimmten Aufgabe. Manche können besser Rechnen (+ -) dafür machen die anderen allgemeinere Sachen besser.
Du kannst niemals alles berücksichtigen, es gibt so viele Prozessor Features.

Deswegen würd ich sagen du lässt alle Computer kurz etwas von der Aufgabe rechnen. Die Zeit die er dafür braucht kannst du als Index verwenden (kleinerer Index - schnellerer Prozessor)
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 11:26
Man könnte das ab Vista integrierte Systembewertungstool WinSAT verwenden, um die CPU-Geschwindigkeit zu messen:

http://technet.microsoft.com/de-de/l...75(WS.10).aspx

Ich weiss aber nicht, ob es die einzelnen Kerne testet.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 11:31
Außerdem ist nicht jeder Kern einer CPU gleich schnell, bei einer bestimmten Aufgabe. Manche können besser Rechnen (+ -) dafür machen die anderen allgemeinere Sachen besser.
??? Halte ich momentan für Quatsch. Hast du dazu irgendwelche Quellen?
In Zukunft mag das vll. irgendwann passieren (zumal die GPU jetzt ja mit drauf wandert, aber die wird ja noch nicht als CPU Kern behandelt. AMD Bulldozer geht vll. ein wenig in die Richtung ist aber noch nicht draußen) aber noch nicht jetzt.

Zitat:
Deswegen würd ich sagen du lässt alle Computer kurz etwas von der Aufgabe rechnen. Die Zeit die er dafür braucht kannst du als Index verwenden (kleinerer Index - schnellerer Prozessor)
Ist wahrscheinlich das Beste. Wenn's einigermaßen genau sein soll führt daran kein Weg vorbei
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.124 Beiträge
 
Delphi 12 Athens
 
#6

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 11:51
Dann ist ein PC ein dynamisches System ... was du jetzt mißt, das kann in wenigen Minuten ein anderes Ergebnis liefern.

Teile einfach deine Aufgaben in kleinere Teile auf, laß die rechnen und wenn jemand schneller fertig ist, dann holt der sich halt nochein Teil.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#7

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 12:28
Außerdem ist nicht jeder Kern einer CPU gleich schnell, bei einer bestimmten Aufgabe. Manche können besser Rechnen (+ -) dafür machen die anderen allgemeinere Sachen besser.
??? Halte ich momentan für Quatsch. Hast du dazu irgendwelche Quellen?
In Zukunft mag das vll. irgendwann passieren (zumal die GPU jetzt ja mit drauf wandert, aber die wird ja noch nicht als CPU Kern behandelt. AMD Bulldozer geht vll. ein wenig in die Richtung ist aber noch nicht draußen) aber noch nicht jetzt.
ist definitiv kein quatsch. kann ich aus eigener erfahrung bestätigen. und die unterschiede sind drastisch (teilweise einige prozent). bei meinem quad q6600 z.B. ist kern 3 IMMER der langsamste wenn ich sachen aufteile. falls du es nicht glaubst liefere ich dir in ca. einer stunde eine routine, mit der du das nachvollziehen kannst, in dem mehrere threads gestartet werden und jedem thread per SetThreadAffinityMask ein einzelner kern zugewiesen wird. Dann auslasten und danach lässt sich schön erkennen, welcher kern wieviel geleistet hat.

Dann ist ein PC ein dynamisches System ... was du jetzt mißt, das kann in wenigen Minuten ein anderes Ergebnis liefern.

Teile einfach deine Aufgaben in kleinere Teile auf, laß die rechnen und wenn jemand schneller fertig ist, dann holt der sich halt nochein Teil.
das ist richtig, unterscheidet sich meiner meinung nach aber nur minimal und für meine zwecke völlig ausreichend. Das mit dem "wenn fertig, neue aufgabe holen" will ich in meinem fall halt unbedingt vermeiden, da die eigentliche berechnung, wenn ersteinmal gestartet dezentral stattfindet und erst nach erledigen der aufgabe die daten wieder zusammengeführt werden.


wie auch immer, ich schreibe wie gesagt gerade an einer funktion, die soetwas messen soll.
ich werde sie dann hier posten, vielleicht hilft sie anderen leuten als grundgerüst.

viele grüße
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#8

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 12:58
ist definitiv kein quatsch. kann ich aus eigener erfahrung bestätigen. und die unterschiede sind drastisch (teilweise einige prozent). bei meinem quad q6600 z.B. ist kern 3 IMMER der langsamste wenn ich sachen aufteile. falls du es nicht glaubst liefere ich dir in ca. einer stunde eine routine, mit der du das nachvollziehen kannst, in dem mehrere threads gestartet werden und jedem thread per SetThreadAffinityMask ein einzelner kern zugewiesen wird. Dann auslasten und danach lässt sich schön erkennen, welcher kern wieviel geleistet hat.
Oha, ja da bin ich sehr dran interessiert - habe auch einen Q6600, hatte aber noch nie das Bedürfnis mir das so genau anzugucken.
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#9

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 13:47
ein memo und ein button brauchts für das beispiel. leider funktioniert die threadzuweisung irgendwie nicht korrekt, wenn man den button mehrfach drückt, jemand eine idee warum?

also wenn ich das programm starte und ein benchmark mache sehe ich das alte phänomen, das cpu-kern 3 bei mir immer der langsamste ist. wenn ich allerdings nochmal den button drück scheint die threadzuweisung nicht mehr hinzuhauen (ist dann nicht mehr nr. 3 der langsamste). wenn ich das programm neustarte ist wieder alles beim alten...

naja hoffe das nützt irgendwem was:

Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TBenchmarkThread = class(TThread)
    protected
      procedure Execute; override;
    public
      counter, dummy: Integer;
      constructor Create(ThreadNumber: Word); virtual;
  end;

var
  Form1: TForm1;
  BenchmarkThreads: Array of TBenchmarkThread;

implementation

{$R *.dfm}


constructor TBenchmarkThread.Create(ThreadNumber: Word);
begin
  SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); //set highest prio
  SetThreadAffinityMask(GetCurrentThread, 1 shl ThreadNumber); //only run on one cpu core (so you can compare the cores..)
  FreeOnTerminate:=True;
  counter:=0;
  inherited Create(True); //create suspended
end;

procedure TBenchmarkThread.Execute;
begin
  while not Terminated do
    begin
      inc(counter);
      dummy:=round(counter / 25); //do some stuff to benchmark
    end;
end;

function GetCPUCount: DWord;
var
  SysInfo: TSystemInfo;
begin
  GetSystemInfo(SysInfo);
  Result:=SysInfo.dwNumberOfProcessors;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  PriorityClass, i: Integer;
  ThreadCount: Word;
  result: integer;
begin
  PriorityClass:=GetPriorityClass(GetCurrentProcess); //save old state
  SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
  ThreadCount:=GetCPUCount;
  SetLength(BenchmarkThreads, ThreadCount);
  for i:= 0 to ThreadCount - 1 do BenchmarkThreads[i]:=TBenchmarkThread.Create(i); //create all benchmark threads
  for i:= 0 to ThreadCount - 1 do BenchmarkThreads[i].Start; //start all benchmark threads
  sleep(3000); //wait time can be changed here
  for i:=0 to ThreadCount - 1 do BenchmarkThreads[i].Suspend;
  SetPriorityClass(GetCurrentProcess, PriorityClass); //set old prio
  result:=0;
  for i:=0 to ThreadCount - 1 do
    begin
      memo1.Lines.Add('Thread' + IntToStr(i) + ': ' + IntToStr(BenchmarkThreads[i].counter));
      result:=result + BenchmarkThreads[i].counter;
      BenchmarkThreads[i].Resume;
      BenchmarkThreads[i].Terminate;
    end;
  memo1.Lines.add('--------------------------');
  memo1.lines.add(IntToStr(result));
end;

end.

Geändert von mkinzler (20. Nov 2010 um 13:52 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#10

AW: Leistungsindex von Mehrkernprozessoren ermitteln

  Alt 20. Nov 2010, 17:25
??? Halte ich momentan für Quatsch. Hast du dazu irgendwelche Quellen?
In Zukunft mag das vll. irgendwann passieren (zumal die GPU jetzt ja mit drauf wandert, aber die wird ja noch nicht als CPU Kern behandelt. AMD Bulldozer geht vll. ein wenig in die Richtung ist aber noch nicht draußen) aber noch nicht jetzt.
Quellen hab ich dazu leider keine (würde mich auch genauer interessieren). Hab dies nur auf einer Konfernz erfahren als ich mit einem Firewall Entwickler gesprochen habe.

Aber auf Google findet sich sicher was dazu. Die Frage ist nur mit welchen Suchbegriff
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz