2012-04-11 11 views
5

Sto scrivendo un programma Haskell parallelo che utilizza Strategie. Non sta facendo quello che dovrebbe fare, e vorrei verificare quale funzione Haskell Execution Context (HEC) è eseguita in.Identificazione dell'HEC corrente per una funzione in Haskell

C'è una chiamata getHEC o qualcosa di simile che potrei usare nella mia uscita di debug?

risposta

4

È possibile scoprire quale funzionalità (ad es. CPU core) su cui è in esecuzione un thread Haskell chiamando lo threadCapability da Control.Concurrent.

Se si sta eseguendo il programma con +RTS -N, ci sarà un filo-livello di sistema operativo (HEC) generato per core, in modo che il numero di capacità restituito da threadCapability vi dirà che OS Infila la forkIO filo verde è in esecuzione. Se, tuttavia, si specifica esplicitamente il numero di thread del sistema operativo con +RTS -Nn, dove n è un numero intero diverso dal numero di core sul sistema, questo probabilmente sarà meno utile per l'utente.

È inoltre possibile trovare ThreadScope utile per eseguire il debug e visualizzare l'esecuzione di programmi paralleli.

+0

Questo è esattamente quello che volevo. Grazie! – Jonatan

+1

Un'altra cosa che avrei dovuto menzionare: tenere presente che il sistema operativo è libero di ripianificare i thread su core diversi, quindi 'threadCapability' chiamato due volte nello stesso thread Haskell ha una piccola possibilità di restituire valori diversi, diventando più probabile più tempo trascorre tra le chiamate. Puoi evitarlo a scopo di debugging se blocchi un thread su un core particolare creando il thread con 'forkOn' invece di' forkIO'. – bitbucket

Problemi correlati