/ / Posso contare che il sistema operativo pianifica i thread "ottimale" (Parallelizzazione) - java, multithreading, sistema operativo

Posso contare sul fatto che il sistema operativo pianifica i thread in modo "ottimale" (Parallelizzazione) - java, multithreading, sistema operativo

Afaik: il numero ottimale di thread per i dati che è adatto per l'elaborazione parallela è il numero di core - dal momento che ogni thread ha (teoricamente) un core a sé stante per funzionare. Per le CPU che sono in grado di eseguire hyper-threading, il numero di core è 2x. Perfavore, correggimi se sbaglio.

La mia domanda è se il sistema operativo sottostante (Linux,Winodws OSX) realizzerà automaticamente la mia "intenzione" e ad es. assegna ciascun thread a un singolo core assumendo che io abbia ad es. 8 core e di conseguenza 8 thread in cui ognuno di essi lavora su un "richiede tempo" compito?

O viceversa: è possibile assegnare i thread ai core (soprattutto in Java)?

risposte:

2 per risposta № 1

Per quanto ne so: Il numero ottimale di thread per i dati che è adatto per l'elaborazione parallela è il numero di core - dal momento che ogni thread ha (teoricamente) un proprio core per l'esecuzione. Per le CPU che sono in grado di eseguire hyper-threading, il numero di core è 2x. Perfavore, correggimi se sbaglio.

È molto, molto più complicato di così.

Dipende da cosa stai ottimizzando. Se si sta ottimizzando l'efficienza dell'uso dell'hardware disponibile (cioè economicamente conveniente), allora è raramente ottimale. Se uno qualsiasi dei thread deve attendere un periodo significativo per qualsiasi ragione, quindi un'allocazione one-to-one di thread ai nuclei fisici determinano la sottoutilizzazione dei nuclei. Se questi nuclei potrebbero essere utilizzati per qualcos'altro (ad esempio, esegui programmi di qualcun altro!), Il tuo utilizzo non è ottimale.

Anche se si sta ottimizzando esclusivamente per la velocità dell'applicazione, un'allocazione one-to-one non è necessariamente la migliore strategia.

  • Ogni carico applicativo + ha un "punto debole" intermini del numero di thread. Ciò dipende dalla quantità e dalla natura di ogni conflitto interno e dalla quantità e natura della comunicazione con sistemi esterni (file system, reti, ecc.).

  • Se si dispone di una regola rigida a thread singolo per core, è possibile avere al massimo N thread su un sistema N core.

  • Se quella N è significativamente inferiore al numero di thread "sweet spot", potresti scoprire che i nuclei sono inattivi per un sacco di tempo.

Ora per hyper-threading.

Gli hyperthreads potenzialmente ti danno una CPU extracicli per ciclo di clock. Tuttavia, non forniscono cicli aggiuntivi nel sistema di memoria: le caratteristiche di rendimento di un "nucleo virtuale" di hyperthread saranno diverse rispetto a un nucleo fisico ... e per le applicazioni reali la differenza sarà significativa. x l'assunzione è senza base.

La mia domanda è se il sistema operativo sottostante (Linux,Winodws OSX) realizzerà automaticamente la mia "intenzione" e ad es. assegna ciascun thread a un singolo core assumendo che io abbia ad es. 8 core e di conseguenza 8 thread in cui ognuno di essi lavora su un'attività "che richiede tempo"?

Non necessariamente.

  • Il sistema operativo deve tenere conto di altre cosestanno accadendo sul sistema. Altre applicazioni, i daemon ecc. Che gestiscono il desktop, le cose che riguardano i file system e i protocolli di rete.

  • Il sistema operativo (e JVM) generalmente reagirà solo alcosa è già successo nel prendere decisioni di programmazione. Predire il comportamento futuro basato sul comportamento passato (a questo livello) non è economico ... e i moderni sistemi operativi non tentano di farlo se non a un livello molto crudo / euristico. La previsione perfetta (ottimale) è impossibile, e anche se tu avere una perfetta conoscenza del problema di programmazione è NP-difficile.

In teoria, un programmatore di applicazioni potrebbe progettareun programma ottimale In pratica, la maggior parte delle applicazioni è troppo complicata per questo E è difficile tenere conto delle altre cose "casuali" che stanno accadendo nel sistema.

O viceversa: è possibile assegnare i thread ai core (specialmente in Java)?

Non c'è un modo pratico per farlo. (Vedi la risposta di @ksmonkey123) Certamente, non portabile.

Ed è improbabile che funzioni in JavaComunque. Java ha il problema di aggiungere che ci sono thread nascosti che fanno cose dietro la parte posteriore dell'applicazione (ad esempio il garbage collector e i thread di finalizzazione), e la gestione della memoria Java è più difficile da prevedere e più difficile da sintonizzare.


2 per risposta № 2

No, non puoi assegnare una discussione a un nucleo specifico in Java (Multithreading Java - Assegna thread ai core del processore)

In genere è possibile che il sistema operativo gestisca più o meno in modo ottimale il runtime dei thread. Questo include per es. prevenzione della fame.