2016-04-12 16 views
2

Ich habe eine Frage, die ich versuchte, eine Antwort für zu finden, bekam aber mehr verwirrt von all den Informationen, die ich gefunden - leider konnte keine klare AntwortOptimale Anzahl von Threads, wenn Hyperthreading ist aus

So gewinnen, Nehmen wir an, ich habe einen Computer mit ausgeschaltetem Hyperthreading.

Was ist die optimale Anzahl von Threads, die ich in einem Programm verwenden sollte, das ich geschrieben habe?

Ich verstehe, dass, wenn mein Programm nicht 100% CPU gebunden ist (befasst sich mit IO), so die optimale Anzahl von Threads wird mehr als ein Thread pro Kern sein - da ich Multithreads warten und mehr haben (nicht zu viel aufgrund von Kontextwechsel Overhead) wird für diese Art von Programmen besser sein.

ABER, wenn mein Programm 100% CPU gebunden ist - ein Thread pro Kern ist der optimale? Ich bin verwirrt, da ich mehr Threads habe, was bedeutet, dass ich vielleicht für jeden Thread eine größere Zeit für die Slices bekomme - was die Performance verbessern kann.

Danke!

+1

Ich habe keine klare Antwort, aber Sie können immer Ihr Programm benchmarken. –

+0

Unmöglich zu antworten, ohne die Arbeitslast zu kennen. Mehr Threads bedeuten ein * kleineres * Segment und mehr Overhead, wenn alle laufen. –

Antwort

0

Mit rein CPU-gebundenen Lasten ohne Hyper-Threading ist die Antwort immer 1 Thread pro Kern.

Wenn HT aktiviert ist, kann es weniger als einen Thread pro HT-Kern geben, da die Threads über den gleichen Cache kämpfen. Aber normalerweise ist auch hier ein Thread pro HT-Kern am besten.

Mit IO-Workloads ist es viel komplizierter, aber das trifft hier nicht zu.

seit mehr Threads mit, was bedeutet, vielleicht ein größeres Stück Zeit für jeden

Faden immer

nicht sicher, ob ich die Argumentation folgen. Das Betriebssystem verteilt Zeitscheiben an Threads ungefähr in einer Art Round Robin. Zeitscheiben sind 4-40ms und ihre Größe ändert sich nicht abhängig von der Anzahl der Threads.

Im Idealfall gibt es keine Kontextwechsel, wenn die Anzahl der Threads genau richtig ist. Je mehr Threads du hinzufügst, desto mehr Kontextwechsel gibt es.

+0

OK danke! über die größere Zeit, es war ein Missverständnis von mir. Sie sagen, dass, wenn die HT auf 1 Thread pro Kern ist, in der Regel der beste ist? Ich würde erwarten, dass es tatsächlich 2 ist (wenn 2 Threads zusammen laufen können). Anderenfalls, wenn das geteilte Cache-Problem zu groß ist, warum HT überhaupt zu verwenden? –

+0

Wenn Sie 4x2-Kerne haben, laufen Sie 8 Threads (normalerweise). Der gemeinsam genutzte Cache funktioniert gut, es muss lediglich die Daten von zwei Threads aufnehmen. Dies kann zu keinerlei Problemen führen oder zu einer Verschlechterung führen. Ich denke, Degradierung ist ein seltener Randfall. Der sicherste Weg ist natürlich, beide Ansätze und Benchmarks auszuprobieren. Sie können sogar einen automatisierten 5-Sekunden-Benchmark auf Kundenmaschinen ausführen. – usr