69 Stimmen

Wie kann ich Threads auf verschiedenen CPU-Kernen erzeugen?

Nehmen wir an, ich hätte ein Programm in C#, das etwas rechenintensives macht, wie das Kodieren einer Liste von WAV-Dateien in MP3s. Normalerweise würde ich die Dateien einzeln kodieren, aber ich wollte, dass das Programm herausfindet, wie viele CPU-Kerne ich habe und auf jedem Kern einen Kodierungsthread startet. Wenn ich das Programm also auf einer Quad-Core-CPU ausführe, stellt das Programm fest, dass es sich um eine Quad-Core-CPU handelt, findet heraus, dass es vier Kerne gibt, mit denen es arbeiten kann, und legt dann vier Threads für die Codierung an, von denen jeder auf einer eigenen CPU läuft. Wie würde ich das machen?

Und wäre das anders, wenn die Kerne auf mehrere physische CPUs verteilt wären? Wenn ich also eine Maschine mit zwei Quad-Core-CPUs hätte, gibt es dann irgendwelche besonderen Überlegungen oder werden die acht Kerne auf den beiden Dies in Windows als gleichwertig betrachtet?

3voto

Eric Z Beard Punkte 36325

Sie sollten sich nicht darum kümmern müssen, dies selbst zu tun. Ich habe .NET-Anwendungen mit mehreren Threads, die auf Dual-Quad-Maschinen laufen, und egal, wie die Threads gestartet werden, ob über den ThreadPool oder manuell, sehe ich eine schöne gleichmäßige Verteilung der Arbeit auf alle Kerne.

2voto

Adam Haile Punkte 29829

Wo jeder Thread hingeht, wird in der Regel vom Betriebssystem selbst gehandhabt... also erzeugen Sie 4 Threads auf einem 4-Kern-System und das Betriebssystem wird entscheiden, auf welchen Kernen jeder laufen soll, was normalerweise 1 Thread auf jedem Kern sein wird.

2voto

wvdschel Punkte 11690

Es ist die Aufgabe des Betriebssystems, Threads auf verschiedene Kerne aufzuteilen, und es wird dies automatisch tun, wenn Ihre Threads viel CPU-Zeit beanspruchen. Machen Sie sich darüber keine Sorgen. Um herauszufinden, wie viele Kerne Ihr Benutzer hat, versuchen Sie Environment.ProcessorCount in C#.

2voto

Amit Puri Punkte 21

Können Sie dies nicht tun, da nur das Betriebssystem die Berechtigung dazu hat. Wenn Sie sich dafür entscheiden....., wird es schwierig sein, Anwendungen zu programmieren. Denn dann müssen Sie sich auch um die Kommunikation zwischen den Prozessoren kümmern. kritische Abschnitte. für jede Anwendung müssen Sie eigene Semaphoren oder Mutex...... erstellen, wofür das Betriebssystem eine gemeinsame Lösung bietet, indem es dies selbst erledigt.......

1voto

Will Dean Punkte 38365

Einer der Gründe, warum Sie (wie bereits erwähnt) nicht versuchen sollten, diese Dinge selbst zuzuordnen, ist, dass Sie einfach nicht genug Informationen haben, um es richtig zu tun, insbesondere in Bezug auf die Zukunft mit NUMA usw.

Wenn Sie einen Thread lesen, der ausgeführt werden soll, und ein Kern im Leerlauf ist, wird der Kernel se führen Sie Ihren Faden, keine Sorge.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X