Tôi có một nguồn đóng không phải luồng an toàn C++ dùng chung lib cung cấp một hàm f :: ByteString -> ByteString. Thời gian chạy của chức năng này có thể là một cái gì đó giữa một giây và một vài giờ.Khuôn khổ Haskell để song song hóa không an toàn C++ lib
Tôi đang tìm cách phân phối phép tính cho nhiều lõi/máy chủ (SIMD).
Tóm lại, tôi đang tìm một khuôn khổ mà cung cấp một chức năng
g :: Strategy b -> (a -> b) -> a -> b
để nâng một chức năng mà chỉ có thể được gọi là tuần tự vào một chức năng mà ứng xử như bất kỳ chức năng tinh khiết khác trong Haskell.
Ví dụ, tôi muốn để có thể viết:
parMap rwhnf f args -- will not work
Kể từ f gọi một hàm C trong lib phi thread-safe qua FFI, điều này sẽ không làm việc. Do đó, tôi có thể thay thế hàm f bằng hàm g có chứa một hàng đợi công việc và gửi các nhiệm vụ đến N các tiến trình riêng biệt. Các quá trình có thể chạy cục bộ hay phân phối:
parMap rwhnf g args -- should works
khung Potential Tôi đã nhìn vào là
MPI: Khách hàng (Haskell) < - Bộ KH & ĐT -> Broker (C++) < - - Bộ KH & ĐT -> Worker (C++) < -> Lib (C++)
ZeroMQ: khách hàng (Haskell) < - ZeroMQ -> Broker (C++) < - ZeroMQ -> Worker (C++) < -> Lib (C++)
Mây Haskell: Khách hàng (Haskell) < - CloudHaskell - > Worker (Haskell) < - FFI -> Lib (C++)
gearman
Erlang: khách hàng (Haskell) < - Erlang -> Broker (Erlang) < - - Erlang CN ode -> Công nhân (C++)
Mỗi phương pháp đều có ưu điểm và nhược điểm.
MPI sẽ tạo ra rất nhiều vấn đề về bảo mật và là giải pháp khá nặng.
ZeroMQ là một giải pháp tốt đẹp nhưng sẽ yêu cầu tôi viết các nhà môi giới/cân bằng tải vv tất cả một mình (đặc biệt là nhận được độ tin cậy phải không phải là tầm thường).
CloudHaskell trông không hoàn thiện.
Gearman không chạy trên Windows và không có ràng buộc Haskell.Tôi biết về dịch vụ java-gearman nhưng nó kém trưởng thành hơn so với daemon C và có một số vấn đề khác (ví dụ: không có tài liệu, tắt nếu không có luồng công việc đến trong một thời gian, v.v.).
Tương tự như 1 và yêu cầu sử dụng ngôn ngữ thứ ba.
Cảm ơn!
Bạn đang xem xét việc phân phối một hàm hoạt động trên cùng một dữ liệu với nhiều lõi để làm cho nó không an toàn? Nếu không, làm thế nào chức năng nguồn đóng của bạn có thể được song song? –
Tôi đang tìm một giải pháp SIMD. Nguồn đóng có nghĩa là tôi không thể thực hiện bất kỳ sửa đổi nào đối với bản thân lib để làm cho nó an toàn chỉ. Do đó, tôi sẽ phải chạy từng cuộc gọi hàm trong một tiến trình riêng biệt. Những gì tôi đang tìm kiếm là một giải pháp đơn giản để cân bằng tải/kết nối các quá trình. Trong Scala, tôi sẽ sử dụng Akka với các công nhân như các nút từ xa chạy trong một JVM riêng biệt. – Chronos
ah, vì vậy bạn muốn tính toán hàm nhiều lần trên các đầu vào khác nhau? đây không phải là tất cả rõ ràng từ câu hỏi của bạn, bạn có thể muốn chỉnh sửa vài câu đầu tiên đề cập đến nó :) –