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ą
MPI: Klient (Haskell) < - MPI -> Broker (C++) < - - MPI -> Pracownik (C++) < -> Lib (C++)
ZeroMQ: Klient (Haskell) < - ZeroMQ -> Broker (C++) < - ZeroMQ -> Pracownik (C++) < -> Lib (C++)
Chmura Haskell: Client (Haskell) < - CloudHaskell - > Pracownik (Haskell) < - FFI -> Lib (C++)
Gearman
Erlang: Klient (Haskell) < - Erlang -> Broker (Erlang) < - - Erlang CN Ode -> Pracownik (C++)
Każde podejście ma zalety i wady.
MPI stworzy wiele problemów bezpieczeństwa i jest dość ciężkim rozwiązaniem.
ZeroMQ to dobre rozwiązanie, ale wymagałoby samodzielnego napisania brokera/load balancera itp. (W szczególności poprawa niezawodności nie jest banalna).
CloudHaskell nie wygląda na bardzo dojrzałego.
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.).
Podobny do 1 i wymaga użycia trzeciego języka.
Dzięki!
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? –
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
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ć :) –