Frage

schrieb ich ein Multi-Threaded-Programm, das mit vielen Gleitkommaoperationen einige CPU schwere Berechnung des Fall ist. Genauer gesagt, es ist ein Programm, das Animationssequenz Frame für Frame vergleicht. D. h sie vergleicht Rahmendaten von Animation A mit allen Rahmen in der Animation B, für alle Frames in der Animation A. I für verschiedene Animationen parallel diesen intensiven Betrieb durchzuführen, so kann das Programm auf AB Paar arbeiten, BC und CA Paar Paare in parallel. Das Programm wird mit QtConcurrent und eine Funktion „Karte“ die Karten einen Behälter mit Bewegungen auf eine Funktion. QtConcurrent schafft Thread-Pool für mich, ich bin auf Intel Quad-Core-Prozessor, so dass es 4 Threads laicht.

Nun, das Problem ist, dass mein Prozess meine CPU zerstört. Die Nutzung ist 100% konstant und ich tatsächlich eine Blue Screen of Death, wenn ich mein Programm auf einer große genug Reihe von Bewegungen (Seite Fehlern in nicht ausgelagerten Bereich) ausgeführt werden. Ich vermute, dass dies, weil mein Computer übertaktet ist. Allerdings könnte dies wegen der Art und Weise sein, ich mein Programm codiert? Einige sehr intensive benchamrking Werkzeuge, die ich verwenden, um meine Maschine Stabilität zu testen abgestürzt nie meinen PC. Gibt es eine Möglichkeit zu kontrollieren, wie mein Programm verwendet meine CPU die Belastung zu reduzieren? Oder vielleicht mein Problem, das ich bin Missverständnis?

War es hilfreich?

Lösung

Es gibt einige ausgezeichnete Antworten hier.

würde ich nur noch hinzufügen, aus der Perspektive getan viele Performance-Tuning hat, es sei denn, jeder Thread aggressiv optimiert wurde, stehen die Chancen es viel Platz für die zyklus Reduktion hat.

Um eine Analogie zu einem Langstreckenautorennen zu machen, gibt es zwei Möglichkeiten, um zu gewinnen, um zu versuchen:

  1. Machen Sie das Auto schneller gehen
  2. Stellen weniger Zwischenstopps und Abstechern

Nach meiner Erfahrung der meisten Software als erstes geschrieben ist ziemlich weit von dem direkten Weg nehmen, insbesondere , da die Software groß wird.

Um verschwendete Zyklen in Ihrem Programm zu finden, wie Kenneth Cochran sagte, nie erraten. Wenn Sie etwas, ohne zu haben bewiesen, zu beheben, dass es ein Problem ist, sind Sie investng in einer Vermutung.

Die beliebte Art und Weise Performance-Probleme zu finden, ist Profilometer zu verwenden.

Allerdings habe ich das viel, und meine Methode ist dies: http: //www.wikihow.com/Optimize-Your-Program%27s-Performance

Andere Tipps

Overclocking-PCs kann auf alle möglichen seltsamen Problemen führen. Falls Sie Fragen zu der Ursache des Problems vermuten, versuchen Sie es in angemessenen Bereichen zu takten und die Tests wiederholen.

Es könnte auch eine Art ziemlich seltsamer Erinnerung-Bug, wo Sie korrupten RAM in einer Art und Weise sein, in der Windows (Ich denke, das Betriebssystem, weil der BSOD) kann nicht mehr erholen (sehr unwahrscheinlich, aber wer weiß).

Eine andere Möglichkeit kann ich mir vorstellen, ist, dass Sie in Ihrer Threading-Implementierung einige Fehler haben, die Fenster tötet.

Aber zuerst, ich an der Overclocking-Ausgabe aussehen würde ...

die Art der Operation, die Sie beschrieben haben, ist schon sehr parallelizable. eigentlich weh Leistung mehr als ein Job laufen kann. Der Grund dafür ist, dass der Cache eines Prozessors von begrenzten Größe ist, und je mehr Sie versuchen, gleichzeitig zu tun, desto kleiner ist der Anteil jeden Thread des Cache wird.

Sie können auch die Optionen schau dir in die GPU einen Teil der Verarbeitungslast aufzusaugen verwenden. Moderne GPUs sind erheblich effizienter für die meisten Arten von Video-Transformation als CPUs ähnlicher Generationen.

  

Ich vermute, dass dies, weil mein Computer übertaktet ist.

Es ist definitiv möglich. Versuchen Sie es mit normaler Geschwindigkeit für eine Weile zu setzen.

  

dies wegen der Art und Weise könnte ich mein Programm codiert?

Ein Programm im User-Modus läuft, ist sehr unwahrscheinlich, dass ein BSOD verursachen.

Bei einer Vermutung, würde ich sagen Sie nicht mit einer 3-Core-Maschine (oder 4, da 100% Nutzung) und Parallelisierung aktiv Ihrer Leistung schaden, wenn Sie mehr Threads verwenden, als Kern. Machen Sie nur ein Thread pro CPU-Kern, und was auch immer Sie tun, haben nie von verschiedenen Threads gleichzeitig zugegriffen Daten . Die Cache-Sperralgorithmen in den meisten Multi-Core-CPUs werden auf jeden Fall Ihre Leistung schlachten. In diesem Fall wird auf einer CPU-Verarbeitung L-Frame-Animationen N-Kerns, würde ich Gewinde 1 auf Rahmen 0- (L / N), Gewinde 2 auf Rahmen (L / N) verwenden, - (2 * L / N). .. Gewinde N auf Rahmen ((n-1) * L / N) -L. Sie die verschiedenen Kombinationen (A-B, B-C, C-A) in der Reihenfolge, damit Sie nicht Ihren Cache dreschen, auch, sollte es einfacher Code.

Als Seite beachten? Real Berechnung wie folgt sollte 100% CPU verwenden, bedeutet dies, es wird so schnell wie möglich.

Das Overclocking ist die wahrscheinlichste Ursache für die Instabilität. Bei jeder CPU-Kapazität Algorithmus es wird einige CPU Dreschen sein. Die Overclocking nicht widerstehen, ich würde eine gute Performance Profiler finden Performance-Engpässe zu finden. Nie erraten, wo das Problem ist. Sie könnten verbringen Monate etwas zu optimieren, die keine wirkliche auf die Leistung oder schlechter Leistung könnte sogar verringern beeinflussen hat.

Es ist nur allzu leicht die Hardware schuld. Ich würde vorschlagen, Sie versuchen, Ihr Programm auf einem anderen System laufen und sehen, wie das stellt sich heraus, mit den gleichen Daten.

Wahrscheinlich haben Sie einen Fehler.

Schauen Sie in SIMD-Operationen. Ich glaube, Sie SSE in diesem Fall wollen würden. Sie sind oft ein besserer erster Schritt als Parallelisierung, da sie leichter sind korrekt zu erhalten und einen ziemlich heftigen Schub für die meisten die linearen Algebra Arten von Operationen zur Verfügung stellen.

Sobald Sie es mit SIMD bekommen, dann in Parallelisierung aussehen. Es klingt wie Sie die CPU auch sind Zuschlagen, so dass Sie vielleicht vielleicht mit einigen Betten statt busy waits tun konnte, und stellen Sie sicher, dass Sie Reinigung oder Fäden richtig wiederverwendet.

Mit dem Fehlen des BSOD Fehlercode (nützlich zum Nachschlagen) ist es ein bisschen schwieriger ist es, Ihnen mit diesen zu helfen.

Sie könnten versuchen, Ihren Speicher physisch erneutes Einsetzen ((nehmen Sie es aus und legen Sie es in.) Ich und einige andere, die ich kenne, haben sich auf ein paar Maschinen gearbeitet, wo dies notwendig war. So versuche ich einmal OS X auf ein Upgrade eine Maschine, und es hielt abstürzt ... endlich ich die Erinnerung tauchte aus und ließ ihn wieder an und alles war in Ordnung.

Sleep (1); wird die CPU-Auslastung in zwei Hälften geschnitten. Ich lief in das gleiche Problem mit einem CPU-intensiven Algorithmus arbeiten.

Wenn Ihr Prozessor zwei Kerne oder mehr können Sie die Task-Manager gehen und Prozesse gehen und die rechte Maustaste auf den Programmnamen und Set affinity klicken und das Programm festgelegt weniger Kern zu verwenden.

Es wird dann länger dauern, um die Aktionen zu tun Sie fordern aber eine signifikante Abnahme der CPU-Auslastung führen.

ich glaube, blauer Bildschirm des Todes verursacht wird, wenn Kernel-Speicherbereich beschädigt wird. So Multithreading unter Verwendung von parallelen Operationen auszuführen nicht der Grund dafür sein könnten.

Nun, wenn Sie mehrere Threads jeweils mit schwer Gleitkommaoperationen dann auf jedem Fall Ihre CPU-Auslastung bis zu 100% erreichen schaffen.

Es wäre besser, wenn Sie etwas Schlaf in jedem Thread geben können, so dass anderer Prozess eine Chance bekommen. Sie können auch versuchen, die Priorität von Threads zu reduzieren.

Wenn in der Windows-Plattform setzen nach einiger Arbeit einen Anruf funktionieren CPU informieren Sie die CPU für andere Prozesse machen wollen. Machen Sie einen Anruf Funktion schlafen wie folgt aus:

Slepp (0);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top