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 № 1Per 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.