Wie die Struktur einer C++ - Anwendung für die Verwendung eines Mehrkern-Prozessor
Ich Baue eine Anwendung, die einige Objekt-tracking aus dem video-Kamera-Feeds und die Verwendung von Informationen aus, die zum ausführen von ein-Teilchen-system in OpenGL. Der code zum verarbeiten der video-feed ist etwas langsam, 200 - 300 Millisekunden pro frame jetzt. Das system, dass dies läuft auf einen dual-core-Prozessor. Um die Leistung zu maximieren möchte ich zur Entlastung der Kamera-Verarbeitung Zeug zu einem Prozessor und nur die Kommunikation relevanten Daten an die Hauptanwendung zurückzugeben, wie es ist, während die wichtigste Anwendung treten auf den anderen Prozessor.
Was muss ich tun, um auslagern der Kamera arbeiten, um anderen Prozessor-und wie gehe ich mit der Kommunikation mit der Haupt-Anwendung?
Bearbeiten:
Ich bin mit Windows 7 64-bit.
InformationsquelleAutor der Frage Mr Bell | 2010-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundsätzlich müssen Sie den Multi-Thread Ihrer Anwendung. Jeder thread der Ausführung kann nur sättigen einen Kern. Separate threads neigen dazu, auf unterschiedlichen Kernen. Wenn Sie hartnäckig sind, dass jeder thread IMMER ausführen, die auf einem bestimmten Kern, dann jedes Betriebssystem hat seine eigene Art der Angabe dieses (affinity Masken & so)... aber ich würde nicht empfehlen es.
OpenMP ist groß, aber es ist ein bisschen Fett in den Arsch, vor allem, wenn der Beitritt von einer Parallelisierung. YMMV. Es ist einfach zu bedienen, aber nicht bei allen die beste Leistung-option. Es erfordert auch, die compiler-Unterstützung.
Wenn Sie auf Mac OS X 10.6 (Snow Leopard) verwenden, können Sie Grand Central Dispatch. Es ist interessant, darüber zu Lesen, auch wenn Sie es nicht verwenden, da Ihr design implementiert einige best practices. Es ist auch nicht optimal, aber es ist besser als OpenMP, obwohl es erfordert auch, die compiler-Unterstützung.
Wenn Sie können, wickeln Sie Ihren Kopf um das Aufbrechen Ihrer Anwendung in "Aufgaben" oder "Aufträge" können Sie schieben diese Arbeitsplätze nach unten so viele Rohre, wie Sie Kerne haben. Denke der Dosierung Ihrer Verarbeitung als Atomare Arbeitseinheiten. Wenn Sie segment es richtig, starten Sie Ihre Kamera-Verarbeitung auf beide Kerne, und Ihre Haupt-thread zur gleichen Zeit.
Wenn die Kommunikation minimiert wird für jede Einheit Arbeit, dann Ihren Bedarf für Mutexe und andere locking-primitive wird minimiert. Natürlich genarbtem threading ist viel einfacher als die feinkörnigen. Und, Sie können eine Bibliothek oder ein framework zu entlasten. Betrachten Erhöhung der Thread-Bibliothek wenn Sie die manuelle Methode. Es bietet portable Wrapper und eine schöne Abstraktion.
InformationsquelleAutor der Antwort pestilence669
Ich würde empfehlen, gegen OpenMP OpenMP ist mehr für die numerische codes, die eher als consumer - /producer-Modell, das Sie zu haben scheinen.
Ich denke, Sie können etwas tun, einfach mit boost threads, um zu laichen worker-thread, der gemeinsamen segment des Speichers (für die Kommunikation von erfassten Daten) und einige notification-Mechanismus zu sagen, auf Ihre Daten ist erhältlich (schauen Sie in boost-thread unterbricht).
Ich weiß nicht, welche Art der Verarbeitung Sie tun, aber möchten Sie vielleicht einen Blick auf die Intel thread building blocks und Intel integrated primitives, Sie haben mehrere Funktionen für video-Verarbeitung, die schneller sein (vorausgesetzt, Sie haben Ihre Funktionalität)
InformationsquelleAutor der Antwort Anycorn
Müssen Sie eine Art Rahmen für die Behandlung multicores. OpenMP scheint eine ziemlich einfache Wahl.
InformationsquelleAutor der Antwort Kornel Kisielewicz
Es hängt davon ab, wie viele Kerne haben. Wenn du nur 2 Kerne (cpu, Prozessoren, Hyper-Threads, Ihr wisst was ich meine), dann OpenMP nicht so eine enorme Steigerung in der Leistung, sondern helfen. Die maximale Verstärkung, die Sie haben können, teilen Sie Ihre Zeit, indem Sie die Anzahl der Prozessoren, so wird es noch 100 - 150 ms pro frame.
Ist die Gleichung
parallel-Zeit = (([Gesamtzeit für die Durchführung einer Aufgabe] - [code, der nicht parallelisiert werden kann]) /[Anzahl der cpus]) + [code, der nicht parallelisiert werden kann]
Grundsätzlich OpenMP Felsen in parallele Schleifen-Verarbeitung. Seine ziemlich einfach zu bedienen
bang, Ihr parallelisiert. Es funktioniert nicht für jeden Fall, nicht jeder Algorithmus parallelisiert werden kann, aber viele können umgeschrieben werden (gehackt) kompatibel zu sein. Das wichtigste Prinzip ist Single Instruction, Multiple Data (SIMD), die Anwendung der gleichen convolution code auf mehrere Pixel zum Beispiel.
Aber einfach die Anwendung dieses Kochbuch Rezept geht gegen die Regeln der Optimierung.
1-Benchmark-code
2-Finden Sie das ECHTE Engpässe mit "wissenschaftlichen" beweisen (zahlen), statt einfach zu raten, wo Sie denken, es gibt einen Engpass
3-Wenn es wirklich Verarbeitung von Schleifen, dann OpenMP ist für Sie
Vielleicht einfache Optimierungen Ihrer vorhandenen code können bessere Ergebnisse erzielen, wer weiß?
Anderen Straße wäre zum ausführen von opengl in einem thread und Verarbeitung der Daten auf einen anderen thread. Dies wird helfen, eine Menge, wenn opengl oder Ihre Partikel-rendering-system braucht viel Strom, aber denken Sie daran, dass threading kann dazu führen, dass andere Art der Synchronisation Engpässe.
InformationsquelleAutor der Antwort Eric
Gefällt, was Pestilence sagt, Sie benötigen nur Ihre app auf Multithread. Viele frameworks wie OpenMP erwähnt worden sein, so ist hier eine andere:
Intel Thread Building Blocks
Ich habe es nie benutzt, bevor, aber ich habe gehört, große Dinge über es.
Hoffe, das hilft!
InformationsquelleAutor der Antwort blwy10