Also soweit ich das verstanden habe, gibt es entweder einen CPU Limit oder einen GPU Limit je nach Anwendung. Es kann sprich nicht sein, dass die CPU 40% belastet wird und die Grafikkarte 60% da Sie für die Anwendung sehr gut sind.
Du musst unterscheiden zwischen "Auslastung" und Limitierung. Auslastung gibt hierbei an, zu wieviel Prozent über einen Zeitraum gemittelt eine Hardwareressource ausgelastet ist, während Limitierung angibt ob die gesamte Laufzeit des Programms von einer gewissen Hardwareressource abhängig ist.
Ersteinmal lohnt es sich über die Auslastung nachzudenken. So ist ein Prozessor eine Agglomeration von verschiedenen Hardwareressourcen im wesentlichen: Caches, Verbindungsnetzwerken, Steuereinheiten, Registern, FPUs und ALUs für die Rechenbefehle. Jeder dieser Teilressourcen kann durch ihren Durchsatz oder durch die Latenzen, die sie verursacht, die Performance limitieren. Um herauszufinden ob eine bestimmte Teilressource die Performance zu einem bestimmten Zeitpunkt durch ihren Durchsatz limitiert, müsste man im Prinzip für jede dieser Komponente die Auslastung berechnen oder messen; ist die Auslastung 100% so wird wahrscheinlich von der Ressource mehr benötigt als vorhanden ist. In diesem Fall redet man von einer Limitierung. Eine Limitierung durch Latenzen lässt sich nicht von der Auslastung ableiten.
Ein gutes Beispiel für die Limitierung durch eine Teilressource ist ein Gleitkommabenchmark, welches nur FP-Befehle auf einen Kern bzw. mit einem Thread ausführt. Dadurch würde es im Wesentlichen eine einzige der FPUs auslasten; sämtliche anderen FPUs wären ungenutzt. Die Laufzeit hier wäre nur von der Performance einer einzigen der FPUs abhängig, wodurch sie durch eben diese limitiert werden würde, egal wie performant der Rest des Prozessors wäre.
Eigentlich müsste man um die Limitierung zu untersuchen die Auslastung auf Taktbasis betrachten; jedoch wird die Auslastung jedoch meist über einen kleinen Zeitraum gemittelt gemessen und angegeben, da die Auslastung auf Taktbasis nur schlecht auswertbar wäre. Betrachten wir hierfür einmal die Aulastung der Bandbreite eines DRAMs. Hier wird bei der Auslastung einmal über die Sekunde gemittelt angegeben, wieviel Prozent seiner maximalen Bandbreite übertragen worden ist. Diese Metrik ist jedoch nur sehr grob, so könnte es vorkommen, dass die ersten 100 ms die Sekunde mehr als 100 % der DRAM Bandbreite benötigt werden würden, in den restlichen 900 ms nur noch 0 %. In diesem Fall würde der DRAM über die ersten 100 ms Performance limitieren, während seine Auslastung über die Sekunde gemittelt nur 10 % betragen würde
Die Auslastung, welche im Taskmanager für jeden Prozessorkern angezeigt wird, ist auch nur eine sehr einfache Metrik. Windows misst hier im wesentlichen, zu wieviel Prozent über einen Zeitraum gemittelt ein Prozessorkern gerade keinen Thread bearbeitet, also untätig ist. Wenn man sich eine einzige Auslastung für alle Kerne anzeigen lässt, so wird die Auslastung zusätzlich über alle Kerne gemittelt. Diese sehr einfache Metrik sagt allerding nun eher an ob ein Kern etwas zu tun hat, und nicht wie gut oder schlecht er im Endeffekt ausgelastet ist. Einfaches Beispiel hierfür sei ein einthreadiges Programm, welches ständig Daten vom L3-Cache eines Prozessors anfordern würde so dass die Bandbreite des L3-Caches vollkommen ausgeschöpft werden und limitieren würde. Dadurch würde im Endeffekt der Prozessor die Performance limitieren, obwohl die über alle Kerne gemittelte Auslastung die im Taskmanager angezeigt werden würde, gerade einmal bei einem 4-Kerner 25 Prozent wäre.
Bei der GPU verhält es sich weitestgehend analog.
Zur gleichzeiten Limitierung: Ob im Endeffekt sowohl die GPU als auch die CPU die Performance limitieren können ist im wesentlichen eine Frage wie das Programm nun aufgebaut ist, und was für Abhängigkeiten nun im Programm auftreten.
Betrachten wir beispielhaft folgendes Programm im Pseudocode:
BerechnePhysikAufDerGPU();
KopierediePhysikZurückAufDieCPU();
WertePhysikAufDerCPUAus();
Während die Physik auf der GPU berechnet bzw. simuliert wird, so hat die CPU nichts zu tun und wartet auf die GPU bis zur sie fertig ist. Wird die Physik zurück auf die CPU kopiert, so haben weder GPU noch CPU etwas zu tun, hier limitiert alleine der PCI-E die Performance. Letztendlich wird die Physik auf der CPU ausgewertet. In diesem Zeitraum hat nun die GPU wieder nichts zu tun und wartet auf die CPU. Dadurch limitiert die CPU die Performance. Dadurch limitieren sowohl PCIE die CPU als auch GPU über einen kurzen Zeitraum die Performance, wodurch die gesamte Laufzeit des Programms von allen dreien abhängig ist.