2012-05-12 20 views
6

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à

  1. MPI: Khách hàng (Haskell) < - Bộ KH & ĐT -> Broker (C++) < - - Bộ KH & ĐT -> Worker (C++) < -> Lib (C++)

  2. ZeroMQ: khách hàng (Haskell) < - ZeroMQ -> Broker (C++) < - ZeroMQ -> Worker (C++) < -> Lib (C++)

  3. Mây Haskell: Khách hàng (Haskell) < - CloudHaskell - > Worker (Haskell) < - FFI -> Lib (C++)

  4. gearman

  5. 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.

  1. 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.

  2. 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).

  3. CloudHaskell trông không hoàn thiện.

  4. 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.).

  5. Tương tự như 1 và yêu cầu sử dụng ngôn ngữ thứ ba.

Cảm ơn!

+0

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? –

+0

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

+1

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ó :) –

Trả lời

1

Vì thư viện bạn đang sử dụng không an toàn cho luồng nên bạn muốn có một giải pháp dựa trên việc sử dụng các quy trình làm trừu tượng của bạn cho tính song song. Ví dụ mà bạn muốn xem bằng cách sử dụng đơn nguyên Par sử dụng tia lửa hoặc mô hình song song dựa trên nhiệm vụ, nơi nhiều tia lửa có thể sống trong cùng một luồng. Rõ ràng đây không phải là những gì bạn đang tìm kiếm.

Sợ hãi không!

Chỉ có một vài mô hình trong Haskell hoạt động theo cách này và bạn đã đề cập đến một trong số chúng trong bài đăng của bạn, Cloud Haskell. Trong khi Cloud Haskell không "trưởng thành" nhưng nó có thể giải quyết vấn đề của bạn, nhưng nó có thể là một chút nặng cho nhu cầu của bạn. Nếu bạn thực sự chỉ cần tận dụng lợi thế của nhiều lõi địa phương bằng cách sử dụng trừu tượng song song mức độ quá trình sau đó nhìn vào thư viện Eden:

http://www.mathematik.uni-marburg.de/~eden/

Với Eden bạn hoàn toàn có thể thể hiện những gì bạn đang sau. Dưới đây là một ví dụ rất đơn giản dọc theo dòng của phiên bản Mệnh Monad dựa của bạn:

f $# args 

Hoặc trong trường hợp của nhiều đối số bạn chỉ có thể kéo ra Ye Olde bản đồ:

map f $# args 

Để biết thêm thông tin về các $ # cú pháp và cho hướng dẫn về Eden xem:

http://www.mathematik.uni-marburg.de/~eden/paper/edenCEFP.pdf

YMMV như hầu hết các mô hình song song trưởng thành hơn trong Haskell giả sử bạn ha có một mức độ an toàn thread hoặc sử dụng có thể làm công việc song song một cách tinh khiết.

Chúc may mắn và Hacking vui vẻ!

+0

Tuyệt vời - Cảm ơn! Tôi sẽ có một cái nhìn. – Chronos