У меня есть общая библиотека 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
Потенциальные фреймворки, которые я уже рассматривал, это
MPI: Клиент (Haskell) <-- MPI --> Broker (C++) <-- MPI --> Worker ( C++) <--> Lib (C++)
ZeroMQ: Client (Haskell) <-- ZeroMQ --> Broker (C++) <-- ZeroMQ --> Worker (C++) <--> Lib ( C++)
Cloud Haskell: Клиент (Haskell) <-- CloudHaskell --> Worker (Haskell) <-- FFI --> Lib (C++)
Gearman
Erlang: Клиент (Haskell) <-- Erlang --> Broker (Erlang) <-- Erlang C Node --> Worker (C++)
Каждый подход имеет свои преимущества и недостатки.
MPI создает много проблем с безопасностью и является довольно тяжелым решением.
ZeroMQ — хорошее решение, но оно требует, чтобы я сам написал брокера/балансировщика нагрузки и т. д. (особенно нетривиальной задачей является правильное обеспечение надежности).
CloudHaskell выглядит не очень зрелым.
Gearman не работает в Windows и не имеет привязок к Haskell. Я знаю о java-gearman-service, но он гораздо менее развит, чем демон C, и имеет некоторые другие проблемы (например, отсутствие документа, отключение, если в течение некоторого времени нет входящего потока задач и т. д.).
Аналогичен пункту 1 и требует использования третьего языка.
Спасибо!