2012-04-11 16 views
5

Piszę równoległy program Haskell za pomocą strategii. Nie robi tego, co ma robić, i chciałbym sprawdzić, która funkcja Haskell Execution Context (HEC) jest wykonywana w.Identyfikacja bieżącego HEC dla funkcji w Haskell

Czy istnieje wywołanie getHEC lub coś podobnego, które mógłbym użyć w moim wyjściu debugowania?

Odpowiedz

4

Możesz dowiedzieć się, która zdolność (tj. Rdzeń procesora) wątku Haskell działa, dzwoniąc pod numer threadCapability z Control.Concurrent.

Jeśli prowadzisz swój program z +RTS -N, będzie jeden wątek OS-poziom (HEC) zrodził się na rdzeń, więc liczba możliwości zwrócony przez threadCapability powie, który OS nici Twój forkIO zielony wątek jest uruchomiony. Jeśli jednak jednoznacznie określasz liczbę wątków systemu operacyjnego za pomocą +RTS -Nn, gdzie n jest liczbą całkowitą inną niż liczba rdzeni w systemie, prawdopodobnie będzie to mniej użyteczne dla ciebie.

Może się okazać, że ThreadScope będzie przydatny do debugowania i wizualizacji wykonywania programów równoległych.

+0

Dokładnie tego chciałem. Dziękuję Ci! – Jonatan

+1

Jeszcze jedna rzecz, o której powinienem był wspomnieć: należy pamiętać, że system operacyjny może dowolnie zmieniać kolejność wątków na różne rdzenie, więc funkcja threadCapability dwukrotnie wywoływana w tym samym wątku Haskell ma niewielką szansę na zwrócenie różnych wartości, co staje się bardziej prawdopodobne, ponieważ więcej czasu upływa między połączeniami. Możesz tego uniknąć w celu debugowania, jeśli zablokujesz wątek do określonego rdzenia, odradzając wątek za pomocą 'forkOn' zamiast' forkIO'. – bitbucket