Seite 1 von 2

[PureBasic] Wie die CPU am besten voll auslasten?

Verfasst: 20.08.2009 20:55
von Mok
Servus.

Ich will mit meinem FPS-Programm testen, wie stark sich die FPS verschlechtern können, wenn man die ach so liebe CPU mal richtig unter Druck setzt. Schön wär ein PureBasic-Code. Ich hab's bereits mit AllocateMemory(1073741824) probiert (das macht genau 1 GB aus). Allerdings war die CPU nicht bis garnicht ausgelastet, außerdem sollte das Programm auf alten Rechnern mit 512 MB RAM auch lauffähig sein...
Vorschläge?

MfG, Mok

Verfasst: 20.08.2009 21:08
von NicTheQuick
Der Arbeitsspeicher hat ja nichts mit der CPU zu tun.
Und wenn du 1 GB Speicher anforderst, ist er noch lange nicht belegt. Und wenn Windows
merkt, dass mit dem Speicher nichts gemacht wird, dann wird er sowieso ausgelagert,
sodass du für dein anderes Programm wieder mehr Arbeitsspeicher zur Verfügung hast.

Einfacher wäre eine Schleife zu machen, die nur im Kreis läuft.

Code: Alles auswählen

Define i.i
While #True
  i + 1
Wend

Verfasst: 20.08.2009 21:37
von Mok
NicTheQuick hat geschrieben: Einfacher wäre eine Schleife zu machen, die nur im Kreis läuft.

Code: Alles auswählen

Define i.i
While #True
  i + 1
Wend
Whoa, 5 fps wegen (beinahe) Endlosschleife :o
Hab nicht gedacht, dass die CPU soviel zur Grafikdarstellung beiträgt.
Danke ;)

Verfasst: 20.08.2009 22:35
von cxAlex
Mok hat geschrieben: Hab nicht gedacht, dass die CPU soviel zur Grafikdarstellung beiträgt.
Die CPU ist alles...

http://www.golem.de/showhigh2.php?file=/0908/69099.html

Verfasst: 21.08.2009 14:13
von kswb73
Nunja, es kommt auch die Technik an. Rendest du deine Spielwelt sperat in einem Threat, kannst du recht ungetrost die CPU belasten, ohne das die Framerate einbricht. Berechnest du jetzt allerdings mitten in deiner Renderschleife Sachen, wartet dein Programm bis der CPU fertig ist.

@cxAlex
Für manche Sachen ist die CPU sicher besser. Aber für Physikberechnungen und Realtimerendering (in etwa Anzeigen bewegter Animiation) ist die GPU (Prozessor der Grafikkarte) deutlich besser, einfach weil sie entsprechend dafür konstruiert ist. Außerdem kommen heutzutage immer mehr Prozessoren gleichzeitg zum Einsatz. Selbst vier Graphikkarten + Quad Prozessoren (4 Stück), welche alle zusammenarbeiten sind heute realistisch. Mit DirectX 10 ist es außerdem möglich Berechnungen auf die GPU zu verlegen. Meiner Meinung nach sind die GPU's noch nicht am Ende.

Verfasst: 21.08.2009 15:53
von NicTheQuick
Dazu braucht man noch nicht mal DirectX, sondern einfach nur CUDA von nVidia oder das
ATI-Äquivalent. Außerdem kommt jetzt durch OpenCL eine offene Schnittstelle zu Karten
beider Hersteller hinzu, die auch nVidias PhysX unterstützt.

Ohne paralleles Rechnen geht bei uns in der Bioinformatik gar nichts mehr. Die rechnen da
auch mit Verbünden von 4 Grafikkarten mit jeweils 128 Cores oder mehr. Dazu ein oder
mehrere Quadcores, die die Arbeit verteilen. Raus kommt dann sowas: BALLView

Re: [PureBasic] Wie die CPU am besten voll auslasten?

Verfasst: 21.08.2009 18:01
von AND51
Mok hat geschrieben:wenn man die ach so liebe CPU mal richtig unter Druck setzt. Schön wär ein PureBasic-Code.
Einfach geht's nicht:

Code: Alles auswählen

Repeat : ForEver

Verfasst: 21.08.2009 19:51
von cxAlex
Das lastet die CPU VOLL aus:

(Benutzung auf eigene Gefahr!)

Code: Alles auswählen

Procedure KillCPU_Thread(Core)
  Protected Thread = GetCurrentThread_() ; Aktuellen Thread ermitteln
  SetThreadPriority_(Thread, #THREAD_PRIORITY_TIME_CRITICAL) ; Zeitkritisch oOOO
  SetThreadAffinityMask_(Thread, Core) ; Auf einen Kern festlegen
  
  ; Und ab gehts endlos
  !@@:
  !JMP @b
EndProcedure

Procedure KillCPU()
  Protected Thread, Core, SI.SYSTEM_INFO
  GetSystemInfo_(@SI)
  For Core = 0 To SI\dwNumberOfProcessors-1
    Thread = CreateThread(@KillCPU_Thread(), Core)
  Next
  WaitThread(Thread)
EndProcedure

KillCPU()

Verfasst: 21.08.2009 20:02
von RSBasic
Hallo Alex,

ich kenn mich damit nicht aus, aber könntest du mir sagen, was die zwei Zeilen genau machen?

Code: Alles auswählen

!@@:
!JMP @b

Verfasst: 21.08.2009 20:03
von cxAlex
Eine Endlosschleife. JMP @b springt zu @@: zurück.

Wollts halt in ASM machen.