2011-12-25 42 views
9

Đồ họa là một trong những vấn đề "lúng túng song song". Haskell được cho là thực sự, thực sự tốt cho việc xử lý song song. Vì vậy, câu hỏi của tôi là:Xử lý đồ họa song song trong Haskell

  1. Cách tốt nhất để ném nhiều lõi CPU nhất có thể vào vấn đề hiển thị là gì?

  2. Có thể thay thế GPU để thực hiện tác vụ không?

By "render vấn đề", ý tôi là các vấn đề như:

  • màu của mỗi pixel là một chức năng thuần túy của tọa độ của nó.

  • Chúng tôi bắt đầu với hình ảnh "đầu vào" hiện tại và mỗi màu của "đầu ra" là một chức năng thuần túy của pixel đầu vào tương ứng hoặc có thể là một vùng nhỏ pixel như vậy.


Về # 1: Đây có vẻ như nó là tầm thường, nhưng thực sự nó không phải là. Có một số lựa chọn có thể có của cấu trúc dữ liệu để lưu trữ các điểm ảnh được tính toán (điều này ảnh hưởng đến cách bạn có thể truy cập vào nó, và bạn có thể dễ dàng kết xuất kết quả vào đĩa hoặc màn hình như thế nào). Có một số cách để thực hiện trên nhiều lõi. Và cứ thế.

Dường như với tôi rằng Dữ liệu song song Haskell sẽ là một lựa chọn lý tưởng cho loại điều này. Tuy nhiên, lần cuối tôi kiểm tra, DPH vẫn chưa hoạt động. Vì vậy, đó là điều đó. Thậm chí giả sử nó đã hoạt động, bạn có thể tạo một mảng song song để giữ các pixel, và sau đó bạn phải sao chép các pixel để hiển thị chúng trên màn hình hoặc ghi chúng vào đĩa.

Tôi sẽ thử phát ra mọi pixel đơn lẻ, nhưng điều đó có thể quá chi tiết. Tôi có thể làm cho các điểm ảnh một danh sách và sử dụng một trong các chiến lược danh sách song song. Hoặc tôi có thể biến nó thành mảng không thay đổi (unboxed?) Và viết một số mã thủ công để bắt đầu tia lửa. Hoặc tôi có thể đi với chủ đề rõ ràng và mảng có thể thay đổi. Hoặc tôi có thể có một loạt các luồng công nhân mà họ truyền các giá trị pixel thông qua một kênh tới một chuỗi chủ để đưa kết quả vào đúng vị trí. Hoặc ...

Tóm lại, có một số khả năng đáng ngạc nhiên ở đây và tôi không chắc chắn điều nào là tốt nhất.


Về # 2: Rõ ràng vấn đề kiểu này là toàn bộ lý do rằng GPU tồn tại ở nơi đầu tiên. Rõ ràng GPU là lý tưởng để tấn công các loại vấn đề này. Câu hỏi của tôi là nhiều hơn "thật khó để làm điều này từ Haskell?"

+1

Tôi không nghĩ rằng nó có thể nhắm mục tiêu GPU, nhưng mục tiêu của Data Parallel Haskell là để có thể làm điều này. –

Trả lời

7

Nếu bạn tuân thủ các ngôn ngữ trộn, thì OpenCL rất linh hoạt. Mặc dù ngôn ngữ OpenCL rất gần với C (do đó chắc chắn là không phải là Haskell), bạn có thể viết mã hạt nhân của mình theo kiểu ít hoặc nhiều chức năng và nghĩ về nó như ánh xạ hạt nhân trên tọa độ không gian. Một lợi thế của việc làm với một khuôn khổ lập trình song song chính thống như OpenCL là bạn có thể dựa vào khối lượng kiến ​​thức ngày càng tăng của cả HPC và các nhân vật đồ họa đã tích luỹ qua nhiều năm trên nhiều miền ứng dụng. Việc nhắm mục tiêu lại giữa CPU và GPU hầu như không gây đau đớn, nhưng bạn cần phải lưu ý đến các loại dữ liệu (ví dụ: một số GPU không hỗ trợ độ chính xác gấp đôi).

Tôi đã viết a tutorial on calling into OpenCL from Haskell. Nó dựa trên các ràng buộc tương đối mới OpenCL (có một số ràng buộc OpenCL về hackage, tôi không thể chứng thực chất lượng tương đối của chúng).

+0

Tôi đoán tôi đã thực sự hỏi các câu hỏi _two_ ở đây - cách sử dụng hiệu quả CPU và cách sử dụng hiệu quả GPU. Mục nhập blog được liên kết thực hiện công việc khá tốt để giải thích cách sử dụng GPU, với OpenCL hoặc OpenGL. Tôi chấp nhận điều này như một câu trả lời cho toàn bộ câu hỏi. – MathematicalOrchid

5

raw OpenCL bindings, nhưng nếu bạn muốn một cái gì đó giúp bạn chạy mã cấp cao - nếp gấp và kéo khóa và bản đồ và vân vân - trên GPU ngày hôm nay, hãy nhìn vào accelerate (CUDA backend) và GPipe (OpenGL backend , đối với đồ họa làm việc, một chút bitrotten ngày nay, không may). Khi các cấu trúc biểu diễn một hình ảnh kết xuất, một mảng không có hộp có lẽ là đặt cược tốt nhất của bạn: nó phù hợp nhất với phần cứng, và bạn thường không làm các bản cập nhật "gia tăng" thuần túy trên một kết xuất.

2

Câu trả lời ngắn cho câu hỏi 1, trong trường hợp không cụ thể hơn, là:

  1. Viết mã của bạn như bình thường, sử dụng một thư viện vector hoặc mảng chế biến.

  2. Nếu thư viện chưa thực hiện việc này cho bạn, hãy chèn các cuộc gọi hoặc tổ hợp 'par' thích hợp dựa vào nó để tính toán trang trại cho nhiều CPU.

+2

Xem xét việc sử dụng Repa cho các vectơ của bạn - thật dễ dàng để có được các hoạt động Repa để sử dụng N CPU. –

Các vấn đề liên quan