我有一个闭源非线程安全 C++ 共享库,它提供一个函数 f :: ByteString -> ByteString。此函数的运行时间可能在一秒到几个小时之间。
我正在寻找一种将计算分配到多个核心/服务器 (SIMD) 的方法。
简而言之,我正在寻找一个提供功能的框架
g :: Strategy b -> (a -> b) -> a -> b
将只能按顺序调用的函数提升为行为类似于 Haskell 中任何其他纯函数的函数。
例如,我希望能够编写:
parMap rwhnf f args -- will not work
由于 f 通过 FFI 在非线程安全库中调用 C 函数,因此这将不起作用。因此,我可以将函数 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++)
齿轮人
Erlang : Client (Haskell) <-- Erlang --> Broker (Erlang) <-- Erlang C Node --> Worker (C++)
每种方法都有优点和缺点。
MPI 会产生很多安全问题,是一个相当重量级的解决方案。
ZeroMQ 是一个不错的解决方案,但需要我自己编写代理/负载均衡器等(尤其是获得正确的可靠性并非易事)。
CloudHaskell 看起来不是很成熟。
Gearman 不在 Windows 上运行,也没有 Haskell 绑定。我知道 java-gearman-service,但它比 C 守护程序成熟得多,并且还有一些其他问题(例如,没有文档,如果一段时间内没有传入的任务流则关闭,等等)。
与 1 类似,需要使用第三种语言。
谢谢!