2011-08-31 37 views
28

Có bất kỳ nghiên cứu nào so sánh OpenCL với hiệu suất OpenMP không? Cụ thể là tôi quan tâm đến chi phí trên không khi khởi chạy chủ đề với OpenCL, ví dụ, nếu người ta phân chia tên miền thành một số lượng lớn các mục công việc riêng lẻ (mỗi chủ đề chạy bằng một công việc nhỏ) so với các chủ đề trọng lượng nặng hơn trong OpenMP tên miền được phân tách thành các tên miền phụ có số bằng số lõi.OpenCL và hiệu suất OpenMP

Có vẻ như mô hình lập trình OpenCL được nhắm mục tiêu nhiều hơn đến các chip song song ồ ạt (ví dụ GPU), chứ không phải các CPU có ít lõi hơn nhưng mạnh hơn.

OpenCL có thể là sự thay thế hiệu quả cho OpenMP không?

+1

Tôi cũng muốn biết liệu/khi sử dụng OpenMP và OpenCL cùng nhau có hiệu quả hay không. OpenCL là thread-safe (ngoại trừ phương thức clSetKernelArg()), vì vậy nó có vẻ như có chỗ để tận dụng cả hai công nghệ. –

+0

Nếu định nghĩa của bạn về "hiệu quả" bao gồm khả năng đọc và tiến hóa, thì câu trả lời phải là "không". OpenCL không thể được bắt vít vào mã hiện tại theo cách mà OpenMP có thể, và nó có cú pháp cú pháp đáng kể so với OpenMP. Mặt khác, việc viết mã OpenMP để sử dụng hiệu quả hệ thống phân cấp bộ nhớ thường ít dễ đọc hơn so với OpenCL. – Jeff

+0

Câu hỏi của bạn cần được thu hẹp một chút. Bạn đang tìm kiếm một so sánh của GPU vs CPU đa luồng, hoặc OpenMP vs OpenCL? Để so sánh cả hai ngôn ngữ, chúng thực sự cần phải chạy trên cùng một kiến ​​trúc. Nếu không, đó là táo và cam. – orodbhen

Trả lời

24

Các tiêu chuẩn tôi đã thấy cho thấy OpenCL và OpenMP chạy trên cùng một phần cứng thường có thể so sánh về hiệu suất, hoặc OpenMP có hiệu suất tốt hơn một chút. Tuy nhiên, tôi đã không thấy bất kỳ điểm chuẩn nào mà tôi sẽ xem xét kết luận, bởi vì chúng hầu như thiếu các giải thích chi tiết về phương pháp luận của chúng. Tuy nhiên, có một vài điều hữu ích cần xem xét:

  • OpenCL sẽ luôn có thêm một số chi phí khi biên dịch hạt nhân khi chạy. Bất kỳ điểm chuẩn nào cũng cần liệt kê riêng thời gian này, sử dụng hạt nhân đã được biên dịch trước hoặc chạy đủ lâu để biên dịch hạt nhân không đáng kể.

  • Triển khai OpenCL sẽ thay đổi. Các nhà cung cấp GPU như NVidia không có động cơ để đảm bảo việc triển khai OpenCL dựa trên CPU của họ càng nhanh càng tốt. Không có triển khai OpenCL nào có khả năng là trưởng thành như một triển khai OpenMP tốt.

  • Đặc tả OpenCL nói về cơ bản không có gì về cách triển khai dựa trên CPU sử dụng luồng dưới mui xe, vì vậy bất kỳ cuộc thảo luận nào cho dù luồng tương đối nhẹ hoặc nặng sẽ nhất thiết phải được triển khai cụ thể.

  • Khi bạn đang chạy mã OpenCL trên CPU, các mục công việc của bạn không cần phải nhỏ và nhiều. Bạn có thể chia nhỏ vấn đề theo cách tương tự với OpenMP.

Ngay cả khi OpenCL có phí cao hơn một chút, có thể có các lý do khác để thích nó.

  • Rõ ràng, nếu mã của bạn có thể tận dụng tốt GPU, bạn sẽ muốn có triển khai OpenCL. Hiệu suất OpenCL trên CPU có thể đủ tốt để không duy trì được đường dẫn mã dự phòng OpenMP cho người dùng không có GPU mạnh mẽ.

  • Triển khai OpenCL dựa trên CPU tốt có nghĩa là bạn sẽ tự động nhận được lợi ích của bất kỳ phần mở rộng bộ lệnh nào mà CPU và hỗ trợ triển khai OpenCL hỗ trợ. Với OpenMP, bạn phải thực hiện thêm công việc để đảm bảo rằng tệp thực thi của bạn bao gồm cả đường dẫn mã SSEx và AVX.

  • Nguyên tắc véc tơ OpenCL có thể giúp bạn thể hiện một số tính song song rõ ràng mà không có tính linh hoạt và khả năng đọc mà bạn nhận được từ việc sử dụng nội tại SSE.

+0

Tôi tự hỏi liệu trường hợp người dùng không có GPU thực sự có thực tế hay không. Thay vì duy trì mã dự phòng OpenMP, bạn phải duy trì mã dự phòng OpenCL, vì CPU sẽ không hỗ trợ kích thước công việc cục bộ 2D, có vấn đề với bộ nhớ __local và không có gì. Không có nhiều thu được ở đó nếu bạn đã tối ưu hóa hạt nhân GPU. –

+2

Tại sao bạn nghĩ rằng việc triển khai dựa trên CPU không thể hỗ trợ kích thước nhóm làm việc cục bộ 2D hoặc bộ nhớ cục bộ? Trên CPU, bộ nhớ cache được quản lý bởi phần cứng thay vì phần mềm, do đó, sự khác biệt duy nhất giữa bộ nhớ cục bộ và cục bộ là liệu có cần khóa hay không để truy cập nó. Các kích thước nhóm công việc sẽ tính đến các gợi ý lập lịch cho các hệ thống NUMA. Có, rất nhiều nỗ lực tối ưu hóa đưa vào mã OpenCL để làm cho nó chạy tốt trên một GPU sẽ không ảnh hưởng đến hiệu suất trên CPU, nhưng nó cũng sẽ không phá vỡ mã. Bất kỳ hạt nhân nào chạy trên GPU đều có thể chạy trên một CPU thực thi tương thích. – user57368

+0

@ user57368: Chỉ cần thêm rằng việc sử dụng tối ưu hóa như sử dụng rõ ràng bộ nhớ cục bộ có ý nghĩa đối với GPU. Trên các CPU, việc tối ưu hóa "có thể tiêu cực" sẽ ảnh hưởng đến hiệu suất, ít nhất là khi sử dụng triển khai Intel OpenCL cho CPU x86. – usman

6

Tôi có một chương trình có tùy chọn sử dụng openCL hoặc openMP trên một số tắc nghẽn chính, về cơ bản thêm vectơ và thực hiện giảm.

Trong trường hợp của tôi, openMP mất 13 giây trong đó openCL mất 10 giây, trên CPU. Intel I5.

Cấu hình nhanh nhất cho tôi cho đến thời điểm này là thêm các vec-tơ bằng cách sử dụng GPU openCL, và thực hiện việc cắt giảm trên openMP khiến tôi giảm xuống 7 giây. Khi tôi làm giảm hạt nhân mởCL, trên GPU, phải mất tổng cộng 8 giây.

Vì vậy, từ kinh nghiệm của tôi, tôi có thể nói có lẽ nó phụ thuộc vào việc sử dụng và bạn có thể tối ưu hóa hạt nhân mởCL của mình.

+0

Bạn có ý nghĩa gì ở đây chính xác bằng cách "giảm"? – nbro

+0

@nbro Một "Giảm" là khi bạn lấy nhiều phần tử (nói một mảng chiều dài 10.000, từ [0] đến [9999]) và sau đó xử lý dữ liệu thành một phần nhỏ hơn. Ví dụ: tìm số "tối đa" trong mảng hoặc giá trị của [0] + a [1] + a [2] + ... a [9999]. Việc cắt giảm phổ biến nhất là "Max", "Min" và "Add", nhưng khái niệm về quá trình xử lý và nhiều dữ liệu song song với đầu ra một số (hoặc ít nhất là: số ít đại diện cho toàn bộ) là phổ biến "mô hình" trong lập trình song song. – Dragontamer5788

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