2012-02-29 8 views
5

Giả sử rằng tôi có hai hàm lớn. Tốt hơn là viết chúng trong một hạt nhân riêng biệt và gọi chúng liên tục, hoặc tốt hơn là chỉ viết một hạt nhân? (Tôi không muốn đọc dữ liệu trở lại và hình thức lực giữa máy chủ và thiết bị ở giữa). Điều gì về tốc độ lên nếu tôi muốn gọi hạt nhân nhiều lần?Viết nhiều hạt nhân hoặc một hạt nhân

+0

có một cái nhìn tại đây, thảo luận tương tự: stackoverflow.com/questions/9208535/how-to-handle-a-variable-number-of-algorithms-in-a-kernel – rdoubleui

Trả lời

11

Một điều cần xem xét là ảnh hưởng của áp suất đăng ký đến việc sử dụng phần cứng và hiệu suất.

Theo nguyên tắc chung, hạt nhân lớn có dấu chân đăng ký lớn. Các thiết bị OpenCL điển hình (ví dụ GPU) có kích thước tệp đăng ký rất hữu hạn và hạt nhân lớn có thể dẫn đến đồng thời thấp hơn (ít warps đồng thời/wavefront) hơn, ít cơ hội ẩn thời gian chờ hơn và hiệu suất tổng thể kém hơn. Mặt khác, chi phí khởi chạy hạt nhân khá thấp trên hầu hết các nền tảng, vì vậy nếu thuật toán của bạn không có số lượng lớn trạng thái để tiết kiệm giữa các giai đoạn thực thi, mức phạt sử dụng nhiều hạt nhân có thể khá thấp.

Sử dụng nhiều hạt nhân cũng có một lợi ích phụ khác - bạn nhận được đồng bộ hóa ngầm giữa tất cả các đơn vị công việc miễn phí. Thường thì điều đó có thể loại bỏ sự cần thiết cho các hoạt động bộ nhớ nguyên tử và các nguyên tắc đồng bộ hóa có thể có tác động tiêu cực đến hiệu năng mã.

Hướng dẫn cuối cùng phải được đo lường hiệu suất. Không có quy tắc chung nào cho loại thứ này. Đo điểm chuẩn là cách duy nhất để biết chắc chắn.

+0

Apple đồng ý: https: // nhà phát triển. apple.com/library/mac/documentation/Performance/Conceptual/OpenCL_MacProgGuide/TuningPerformanceOntheGPU/TuningPerformanceOntheGPU.html –

3

Nói chung, đây là câu hỏi về (có thể) hiệu suất tốt hơn một chút so với khả năng đọc mã của bạn. Sao chép bộ đệm là không có vấn đề miễn là bạn giữ chúng trong cùng một bối cảnh. Ví dụ. bạn có thể đặt một bộ đệm đầu ra của một hạt nhân làm bộ đệm đầu vào của hạt nhân tiếp theo, mà sẽ không liên quan đến việc sao chép bất kỳ.

3

Cách thích hợp để mã trong OpenCL là tách mã của bạn thành các tác vụ song song và mỗi mã trong số đó là một hạt nhân. Điều này là, mỗi "cho vòng lặp" nên là một hạt nhân. Một số lần một chức năng mã CPU duy nhất có thể dẫn đến việc thực hiện hạt nhân 4 trong OCL.

Nếu bạn cần lưu trữ dữ liệu giữa các thực thi hạt nhân chỉ sử dụng bộ đệm OpenCL và không sao chép vào máy chủ lưu trữ (điều này giải quyết nút cổ chai DEVICE < -> HOST).

Nếu cả hai chức năng hoạt động với dữ liệu khác nhau, bạn có thể viết một hạt nhân, nhưng điều đó phụ thuộc vào độ phức tạp của hoạt động đang chạy.