2013-04-12 13 views
11

Poszukuję sposobu uruchomienia dwóch obliczeń równolegle w ST-Monadzie. Buduję raczej dużą tablicę (używając STUArray) i chciałbym to zrobić równolegle.Równoległa mapa monad w Haskell? Coś jak parMapM?

tej pory znalazłem this i this Q & tutaj na stackoverflow, jednak pierwszy nie ma zastosowania w moim przypadku, ponieważ dotyczy tylko czysty kod i drugich zajmuje się monady IO - ale jestem w wątek stanu.

Znalazłem również pakiet monad-parallel, ale wymaga on wystąpienia instancji "MonadParallel" dla ST. Również pakiet monad-par obsługuje tylko czyste obliczenia lub monadę IO.

Czy istnieje sposób wykonywania równoległych monadycznych obliczeń w ST?

+1

Tworzenie dużej macierzy w równoległych dźwiękach, takich jak najlepiej zrobione w czystym kodzie zamiast ST. Nie przypuszczam, że mógłbyś podać trochę więcej informacji o tym, co chcesz umieścić w każdej komórce i dlaczego chcesz używać ST? Mogą wystąpić problemy, na przykład, jeśli uruchamiasz osobne akcje w monadach ST dla każdej komórki, to naprawdę nie da się tego zrobić w prosty sposób, ponieważ (inaczej niż IO) ST naprawdę nie dostarcza prymitywów do komunikacji między wątkami. – DarkOtter

Odpowiedz

7

Przede wszystkim, za pomocą zaledwie dwóch słów z twojego pytania: równoległego i tablicowego - muszę ci polecić, aby rzucić okiem na repa. Powinieneś również sprawdzić numer Data Parallel Haskell, który zapowiada się jako kolejny wielki kamień milowy na drodze Haskella. Z tym projektem jest some great people involved.

Odnośnie swoje konkretne pytanie, istnieją biblioteki w stanie zrobić dokładnie to, o co prosisz, tylko z IO monady, już nazwany monad-parallel i async with mapConcurrently. Czy rozważałeś użycie stToIO, aby uciec przed IO?

Jest też lifted-async biblioteka, która rozszerza standardową wersję do pracy z MonadBaseControl, który ma wystąpienie ST, więc prawdopodobnie można użyć jego wersji mapConcurrently lub przynajmniej go używać jako inspiracja do realizacji własnych.

3

Nie jestem pewien, czy można bezpiecznie zrównoleglować monadę ST, czy nawet to ma sens, ponieważ zwykle obliczenie w monadzie stanu zależy od stanu, który jest wynikiem poprzednich obliczeń.

Można jednak utworzyć tablicę z listy, a tworzenie listy można łatwo wykonać równolegle, np. przez coś podobnego do parMap z pakietu .

Podanie nam dodatkowych informacji o tym, jak utworzyć dane w tablicy, może pomóc w uzyskaniu lepszej odpowiedzi.

+0

Można go zrównoleglić, wystarczy polegać na programatorze, który sam sobie radzi z niedeterminizmem –