2009-06-05 6 views
46

Sono confuso sulla nozione di "scintilla"Che cos'è una "scintilla" in Haskell

È una discussione in Haskell? O è l'azione di generare un nuovo thread?

Grazie a tutti:

Quindi, per riassumere, le scintille non sono thread, ma più di unità di calcolo (compiti per dirla in termini C#/Java). Quindi è il modo Haskell di implementare il parallelismo dei compiti.

risposta

32

Vedi A Gentle Introduction to Glasgow Parallel Haskell.

parallelismo è introdotto nel GPH dal par combinatore, che prende due argomenti che devono essere valutati in parallelo. L'espressione p `par` e (qui viene utilizzata la notazione dell'operatore in infisso di Haskell) ha lo stesso valore di e e non è rigida nel suo primo argomento, ovvero bottom `par` e ha il valore di e. (bottom indica un calcolo non terminante o non riuscito.) Il suo comportamento dinamico è quello di indicare che p potrebbe essere valutato da un nuovo thread parallelo, con la valutazione continua del thread principale di e. Diciamo che p è stato innescato e che un thread può essere successivamente creato per valutare se un processore diventa inattivo. Poiché il thread non è necessariamente creato, p è simile a un pigro futuro .

[enfasi in originale]

+1

Come ho letto, una "scintilla" non è tanto un thread quanto un calcolo che può essere eseguito in una discussione. Il runtime potrebbe avere un limite di massimale fisso per i thread che ruotano e valutano le scintille. – ephemient

+1

Questo non è corretto. Le scintille non sono discussioni. GHC supporta le scintille, che sono calcoli non valutati in una coda, haskell (thread leggeri) e thread del sistema operativo. –

87

Sparks non sono thread. forkIO introduce i thread Haskell (che si mappano su un minor numero di thread OS reali). Le scintille creano voci nelle code di lavoro per ciascun thread, da cui eseguiranno le attività da eseguire se il thread diventa inattivo.

Come risultato le scintille sono molto economiche (potresti averne miliardi in un programma, mentre probabilmente non avrai più di un milione di thread Haskell e meno di una dozzina di thread OS su una mezza dozzina di core).

Pensate a come questo:

spark model

+0

Hai catturato l'immagine da qui: http://expcodes.com/125624? Alcune attribuzioni possono essere belle. –

+37

@phresnel questo è il mio lavoro originale, creato per questa domanda, usando inkscape. il tuo link utilizza effettivamente il mio lavoro senza attribuzione, come puoi dire guardando la data del contenuto. –

+4

Vedo; Mi sono principalmente chiesto perché il contenuto collegato sembra avere una risoluzione maggiore.La mia mancata visualizzazione della data, grazie per i chiarimenti :) –

3

Se ho ben capito, una scintilla è una voce in una coda di lavori che richiedono lavoro. Un pool di thread prende le voci da questa coda e le esegue. Di solito c'è un thread per processore fisico, quindi questo schema massimizza il throughput e minimizza il cambio di contesto del thread.

0

Sembra che sia simile a un "task" in Intel Threading Building Blocks.

+0

Vorrei dare un +1, ma sento che ha bisogno di un po 'di più per essere una risposta, in quanto è più simile a un commento. Aggiungi un paio di link e discuti di come i concetti sono simili, con particolare attenzione per aiutarci a capire le Sparks in modo specifico. – derekv