Come programmare l'allocazione dei thread sui processori multicore?

13

Vorrei sperimentare i thread su un processore multi-core, ad es. per creare un programma che utilizza due thread diversi che vengono eseguiti da due diversi core del processore.

Tuttavia, non mi è chiaro a quale livello i thread vengono assegnati ai diversi core. Posso immaginare i seguenti scenari (a seconda del sistema operativo e dell'implementazione del linguaggio di programmazione):

  1. L'allocazione dei thread è gestita dal sistema operativo. I thread vengono creati utilizzando le chiamate di sistema del sistema operativo e, se il processo viene eseguito su un processore multi-core, il sistema operativo tenta automaticamente di allocare / pianificare thread differenti su core diversi.
  2. L'allocazione dei thread è gestita dall'implementazione del linguaggio di programmazione. L'allocazione di thread a core diversi richiede chiamate di sistema speciali, ma le librerie di thread standard del linguaggio di programmazione gestiscono automaticamente questo quando utilizzo l'implementazione di thread standard per quella lingua.
  3. L'allocazione del thread deve essere programmata esplicitamente. Nel mio programma devo scrivere codice esplicito per rilevare quanti core sono disponibili e allocare diversi thread a core differenti usando, ad esempio, le funzioni di libreria.

Per rendere la domanda più specifica, immagina di aver scritto la mia applicazione multi-thread in Java o C ++ su Windows o Linux. La mia applicazione vedrà e utilizzerà magicamente più core quando viene eseguita su un processore multi-core (perché tutto è gestito dal sistema operativo o dalla libreria thread standard), oppure devo modificare il mio codice per essere a conoscenza dei più core ?

    
posta Giorgio 01.01.2013 - 12:37
fonte

2 risposte

11

Will my application magically see and use multiple cores when run on a multi-core processor (because everything is managed either by the operating system or by the standard thread library), or do I have to modify my code to be aware of the multiple cores?

Risposta semplice: Sì, verrà solitamente gestita dal sistema operativo o dalla libreria di threading.

Il sottosistema di threading nel sistema operativo assegnerà i thread ai processori su base prioritaria (opzione 1). In altre parole, quando un thread ha terminato l'esecuzione per l'allocazione temporale o i blocchi, lo scheduler cerca il thread con la priorità più alta e lo assegna alla CPU. I dettagli variano da sistema operativo a sistema operativo.

Detto questo, le opzioni 2 (gestite dal linguaggio di programmazione) e 3 (esplicitamente) esistono. Ad esempio, la libreria Tasks e async / await nelle versioni recenti di .Net danno allo sviluppatore un modo molto più semplice di scrivere codice parallelizable (cioè che può essere eseguito contemporaneamente a se stesso). I linguaggi di programmazione funzionale sono parallelamente innestabili e alcuni runtime eseguiranno diverse parti del programma in parallelo, se possibile.

Come per l'opzione 3 (esplicitamente), Windows consente di impostare l'affinità del thread (specificando su quale processore può essere eseguito un thread). Tuttavia, questo di solito non è necessario in tutti i sistemi critici più veloci, in termini di tempo di risposta. L'effettiva allocazione da thread a processore è altamente dipendente dall'hardware ed è molto sensibile alle altre applicazioni in esecuzione contemporaneamente.

Se vuoi sperimentare, crea un lavoro intensivo a lungo termine con CPU come generare un elenco di numeri primi o creare un set Mandelbrot. Ora crea due thread nella tua libreria preferita ed esegui entrambi i thread su una macchina multiprocessore (in altre parole, praticamente tutto ciò che è stato rilasciato negli ultimi anni). Entrambe le attività dovrebbero essere completate all'incirca nello stesso tempo perché vengono eseguite in parallelo.

    
risposta data 01.01.2013 - 13:01
fonte
-1

Una volta avevo un enorme ambiente SGI IRIX. Solo per il gusto di farlo, ho scritto un piccolo programma java multi-thread (che non ha fatto altro che consumare cicli CPU) e creato 12 thread in esso. Il lavoro è ripartito su 12 CPU in architettura NUMA. Può essere che cercherò il programma ed eseguirlo su Dell R910s e controllare ..

    
risposta data 21.03.2015 - 18:48
fonte

Leggi altre domande sui tag