Multithreading/wie viele Threads sind sinnvoll?



  • Hallo,
    ich habe ein Programm, das ich auf Multi-Threading umstellen will. Ich dachte mir, je CPU eine Thread laufen zu lassen.
    Frage(n):
    - gibt es irgendwo etwas nachzulesen, wie viele Threads im Verhältnis zu vorhandenen CPUs Sinn machen? Mir scheint es z.B. unsinnig bei 2 CPUs (phys. oder virtuell) z.B. mehr als 2 Threads laufen zu lassen, da die sich dann gegenseitig verdrängen.

    - macht es Sinn heutzutage die API SetProcessAffinity...() zu benutzen? Oder sollte man besser alles dem Windows-Scheduler überlassen?

    Grüße!



  • dadiduck schrieb:

    - gibt es irgendwo etwas nachzulesen, wie viele Threads im Verhältnis zu vorhandenen CPUs Sinn machen?

    nicht, dass ich wüsste.

    Mir scheint es z.B. unsinnig bei 2 CPUs (phys. oder virtuell) z.B. mehr als 2 Threads laufen zu lassen, da die sich dann gegenseitig verdrängen.

    also du darfst davon ausgehen, dass die zeit für das umschalten zwischen 2 threads klein im verhältnis zur zeitscheibe (ich habe da irgendwann einmal 16ms gemessen) ist, von daher ist das wohl nicht so schlimm.
    wenn du jetzt natürlich für jede funktion einen eigenen thread aufmachst und die threads dann alle voneinander abhängen und sich gegenseitig blockieren, also gar nichts parallelisiert wird, solltest du es natürlich lassen.

    - macht es Sinn heutzutage die API SetProcessAffinity...() zu benutzen? Oder sollte man besser alles dem Windows-Scheduler überlassen?

    das kommt darauf an. wenn du z.b. intensive rechenarbeiten ausführen hast, kannst du die doch prima auf einen eigenen kern auslagern.


  • Mod

    Wurde hier ausgiebig diskutiert:
    https://stackoverflow.com/questions/1718465/optimal-number-of-threads-per-core

    Solange Deine Threads alle was tun, ist ein Thread pro Core richtig.
    Da ist auch ein netter Graph dabei.

    Sobald Du Synchronisationen hast wird es komplexer... dann solltest Du für jeden Thread der in einen "Wartezustand" wechseln könnte einen Thread in Reserve haben der laufen kann.

    Aus meiner Erfahrung bringt das herumspielen mit SetProcessAffinity nichts. Eher ist es sogar kontraproduktiv.



  • OK, Danke!



  • Wobei man vielleicht noch dazusagen sollte dass (snychroner) IO bzw. jegliche (snychrone) Kommunikation mit "devices" (Treibern) auch zu solchen Wartezuständen führen kann. (Bzw. auch der Aufruf bestimmter Betriebssystem-Funktionen die ihrerseits wieder IO machen bzw. synchronisieren müssen.)

    Weswegen man z.B. auch typischerweise mit mehr als 1 Thread/Core compiliert.

    Kommt natürlich auch stark darauf an wie viel der Files auf die man zugreift schon im Cache steht bzw. wie gross der Druck auf den Write-Cache ist wenn man schreibt.


Anmelden zum Antworten