Платформа Haskell для распараллеливания библиотеки C++ без поддержки потоков

У меня есть общая библиотека C++ с закрытым исходным кодом, не поддерживающая потоки, которая предоставляет одну функцию f :: ByteString -> ByteString. Время выполнения этой функции может составлять от одной секунды до пары часов.

Я ищу способ распределения вычислений по нескольким ядрам/серверам (SIMD).

Короче говоря, я ищу фреймворк, предоставляющий функцию

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

для преобразования функции, которую можно вызывать только последовательно, в функцию, которая ведет себя как любая другая чистая функция в Haskell.

Например, я хочу иметь возможность написать:

    parMap rwhnf f args -- will not work

Так как f вызывает функцию C в не потокобезопасной библиотеке через FFI, это не сработает. Следовательно, я мог бы заменить функцию f функцией g, которая хранит очередь заданий и распределяет задачи по N отдельным процессам.Процессы могут выполняться локально или распределенно:

    parMap rwhnf g args -- should works

Потенциальные фреймворки, которые я уже рассматривал, это

  1. MPI: Клиент (Haskell) <-- MPI --> Broker (C++) <-- MPI --> Worker ( C++) <--> Lib (C++)

  2. ZeroMQ: Client (Haskell) <-- ZeroMQ --> Broker (C++) <-- ZeroMQ --> Worker (C++) <--> Lib ( C++)

  3. Cloud Haskell: Клиент (Haskell) <-- CloudHaskell --> Worker (Haskell) <-- FFI --> Lib (C++)

  4. Gearman

  5. Erlang: Клиент (Haskell) <-- Erlang --> Broker (Erlang) <-- Erlang C Node --> Worker (C++)

Каждый подход имеет свои преимущества и недостатки.

  1. MPI создает много проблем с безопасностью и является довольно тяжелым решением.

  2. ZeroMQ — хорошее решение, но оно требует, чтобы я сам написал брокера/балансировщика нагрузки и т. д. (особенно нетривиальной задачей является правильное обеспечение надежности).

  3. CloudHaskell выглядит не очень зрелым.

  4. Gearman не работает в Windows и не имеет привязок к Haskell. Я знаю о java-gearman-service, но он гораздо менее развит, чем демон C, и имеет некоторые другие проблемы (например, отсутствие документа, отключение, если в течение некоторого времени нет входящего потока задач и т. д.).

  5. Аналогичен пункту 1 и требует использования третьего языка.

Спасибо!

6
задан Chronos 13 May 2012 в 15:59
поделиться