C'è un modo per calcolare se generare un nuovo thread o usare il thread corrente

2

Sto costruendo un'interpretazione DSL in cui il parallelismo è parte del linguaggio - l'utente afferma semplicemente che un calcolo può essere fatto in parallelo e l'interprete può decidere se effettuare il calcolo in parallelo o non. Dal momento che non è sempre utile fare calcoli paralleli, specialmente per lavori molto piccoli (cambio di contesto, copia di memoria tra core, ecc. Può effettivamente rallentare il programma).

Voglio sapere se ci sono delle "migliori pratiche" disponibili che possono calcolare (con un alto grado di certezza) se fare un nuovo calcolo nel thread corrente o generare un nuovo thread per il calcolo. Nota che dal momento che il mio linguaggio è interpretato, posso eseguire tutti i tipi di monitoraggio sul programma eseguito e prendere questa decisione a seconda di come si esegue il programma (una sorta di compilatore JIT).

Aggiornamento di "Spawn" Non intendevo creare un nuovo thread, ma trasferire l'elaborazione su un thread diverso, magari da un pool di thread. Nota che anche quando usi un pool di thread c'è un sovraccarico del possibile trasferimento di memoria tra i core del processore e cose del genere, quindi anche in questo caso la quantità di lavoro dovrebbe essere relativamente alta.

    
posta vainolo 11.03.2013 - 10:32
fonte

3 risposte

1

Non a mia conoscenza, sembra estremamente difficile avere ragione. Anche se tu potessi farlo, devi comunque considerare il carico del sistema, il numero di core, altre attività del sistema operativo ecc.

Alcuni approcci alternativi a cui posso pensare:

  • Hai considerato un pool di thread o un coda di dispatch ? Almeno questo ti permette di evitare alcuni problemi con il cambio di contesto ecc. E puoi bilanciare il sistema nel suo insieme in modo dinamico in base alla quantità totale di utilizzo e di lavoro.

  • È possibile modellare i calcoli come problemi di riduzione della mappa (o altrimenti separare i dati di input dal codice)? Quindi è possibile calcolare quanto sia difficile un problema in base alla dimensione dei dati di input e alla velocità effettiva per ciascun articolo. Dopo un gruppo di campioni dovresti essere in grado di determinare quanto tempo impiegare in totale per il completamento del calcolo, e quindi decidere di eseguirlo localmente o distribuito.

  • Sarebbe possibile iniziare il calcolo e aspettare semplicemente fino a quando non è trascorso un certo tempo e allora spostarlo in un thread separato, una volta capito che questo calcolo non è banale?

risposta data 11.03.2013 - 11:29
fonte
0

Il mio pensiero iniziale è che ogni volta che trovi un costrutto parallelo, lo esegui per prima cosa misurando in serie il tempo necessario per completare. Se è necessario molto tempo, passare a parallelo la volta successiva che l'operazione viene eseguita. La teoria è che l'operazione richiede probabilmente una quantità di tempo simile ogni volta che viene eseguita.

    
risposta data 11.03.2013 - 18:43
fonte
-1

Da una prospettiva di alto livello, un thread probabilmente non dovrebbe conoscere abbastanza bene il sistema abbastanza da risolvere questo problema. La solita soluzione a questo problema è utilizzare un pool di thread (molte lingue e sistemi operativi offrono supporto automatico per questo). Passate le attività del pool di thread e alloca i thread secondo necessità, riutilizzando i thread esistenti quando è ragionevole. Ciò offre il vantaggio in termini di prestazioni di evitare l'allocazione di thread sprecati senza aggiungere responsabilità inappropriate ai thread worker.

    
risposta data 11.03.2013 - 14:06
fonte

Leggi altre domande sui tag