2012-05-12 13 views
6

Posiadam udostępnioną bibliotekę C++, która nie jest wątkowo bezpieczna i udostępnia jedną funkcję f :: ByteString -> ByteString. Czas działania tej funkcji może wynosić od jednej sekundy do kilku godzin.Haskell framework do równoległego nietwardego bezpieczeństwa C++ lib

Szukam sposobu na rozdzielenie obliczeń na wiele rdzeni/serwerów (SIMD).

W skrócie, szukam ramy, które obsługuje funkcję

g :: Strategy b -> (a -> b) -> a -> b 

podnieść funkcję, która może być wywołana tylko kolejno do funkcji, która zachowuje się jak każdy inny czystej funkcji w Haskell.

Na przykład, chcę być w stanie napisać:

parMap rwhnf f args -- will not work 

Ponieważ f wywołuje funkcję C w non-thread-safe lib poprzez FFI, to nie będzie działać. W związku z tym mogłem zastąpić funkcję f funkcją g, która przechowuje kolejkę zadań i przekazuje zadania do N osobnych procesów. Procesy może uruchomić lokalnie lub dystrybuowane:

parMap rwhnf g args -- should works 

Potencjalne ramy już spojrzał są

  1. MPI: Klient (Haskell) < - MPI -> Broker (C++) < - - MPI -> Pracownik (C++) < -> Lib (C++)

  2. ZeroMQ: Klient (Haskell) < - ZeroMQ -> Broker (C++) < - ZeroMQ -> Pracownik (C++) < -> Lib (C++)

  3. Chmura Haskell: Client (Haskell) < - CloudHaskell - > Pracownik (Haskell) < - FFI -> Lib (C++)

  4. Gearman

  5. Erlang: Klient (Haskell) < - Erlang -> Broker (Erlang) < - - Erlang CN Ode -> Pracownik (C++)

Każde podejście ma zalety i wady.

  1. MPI stworzy wiele problemów bezpieczeństwa i jest dość ciężkim rozwiązaniem.

  2. ZeroMQ to dobre rozwiązanie, ale wymagałoby samodzielnego napisania brokera/load balancera itp. (W szczególności poprawa niezawodności nie jest banalna).

  3. CloudHaskell nie wygląda na bardzo dojrzałego.

  4. Gearman nie działa w systemie Windows i nie ma powiązań Haskell.Wiem o usłudze java-gearman, ale jest ona znacznie mniej dojrzała niż demon C i ma inne problemy (na przykład brak dokumentu, wyłącza się, jeśli nie ma napływających zadań przez jakiś czas itp.).

  5. Podobny do 1 i wymaga użycia trzeciego języka.

Dzięki!

+0

Czy chcesz dystrybuować funkcję działającą na tych samych danych do wielu rdzeni, aby zapewnić jej bezpieczeństwo? Jeśli nie, w jaki sposób można zrównoleglić funkcję zamkniętego źródła? –

+0

Szukam rozwiązania SIMD. Zamknięte źródło oznacza, że ​​nie mogę dokonać żadnych modyfikacji samej biblioteki, aby była bezpieczna dla wątków. W związku z tym będę musiał uruchomić każde wywołanie funkcji w osobnym procesie. To, czego szukam, to proste rozwiązanie do równoważenia obciążenia/łączenia procesów. W Scali używałbym Akka z pracownikami jako zdalnymi węzłami, które działają w oddzielnej maszynie JVM. – Chronos

+1

ah, więc chcesz obliczyć funkcję wiele razy na różnych wejściach? nie jest to wcale jasne z twojego pytania, możesz chcieć edytować pierwsze kilka zdań, aby o tym wspomnieć :) –

Odpowiedz

1

Ponieważ biblioteka, której używasz, nie jest bezpieczna dla wątków, potrzebujesz rozwiązania opartego na wykorzystaniu procesów jako abstrakcji dla równoległości. Przykład, który chciałbyś zobaczyć używając Monady Par używa modelu paralelizmu opartego na iskrze lub zadaniu, w którym wiele iskier może żyć w tym samym wątku. Oczywiście nie tego szukasz.

Nie obawiaj się!

Jest tylko kilka paradygmatów w Haskell, które działają w ten sposób i wspomniałeś jeden z nich w swoim poście, Cloud Haskell. Chociaż Cloud Haskell nie jest "dojrzały", ale może rozwiązać twoje problemy, ale może być trochę ciężki dla twoich potrzeb. Jeśli naprawdę wystarczy skorzystać z wielu lokalnych rdzeni korzystających z poziomu procesu równoległego abstrakcję następnie szukać w bibliotece Eden:

http://www.mathematik.uni-marburg.de/~eden/

Z Edenu można absolutnie wyrazić to, czego po. Tutaj jest bardzo prosty przykład wzdłuż linii wersji opartej Par Monad:

f $# args 

Lub w przypadku wielu argumentów może po prostu wyciągnąć Ye Olde mapę:

map f $# args 

Aby uzyskać więcej informacji na temat $ # składnia i tutoriali na temat Eden patrz:

http://www.mathematik.uni-marburg.de/~eden/paper/edenCEFP.pdf

YMMV jak najbardziej z bardziej dojrzałych równoległych paradygmatów w Haskell Załóżmy, ha ve poziom bezpieczeństwa wątku lub użycie może wykonywać pracę równoległą w czysty sposób.

Powodzenia i szczęśliwego hackowania!

+0

Świetnie - dzięki! Spojrzę na to. – Chronos

Powiązane problemy