2012-04-10 19 views
9
chuẩn

OpenCL định nghĩa các tùy chọn sau đây để nhận được thông tin về thiết bị và hạt nhân biên soạn:thuật toán là gì để xác định kích thước nhóm làm việc tối ưu và số workgroup

  • CL_DEVICE_MAX_COMPUTE_UNITS

  • CL_DEVICE_MAX_WORK_GROUP_SIZE

  • CL_KERNEL_WORK_GROUP_SIZE

  • CL_KERNEL_PREFERRED_W ORK_GROUP_SIZE_MULTIPLE

Với giá trị này, làm cách nào để tính toán kích thước tối ưu của nhóm làm việc và số nhóm làm việc?

Trả lời

7

Bạn khám phá các giá trị này một cách thử nghiệm cho thuật toán của mình. Sử dụng một profiler để có được số cứng.

Tôi thích sử dụng CL_DEVICE_MAX_COMPUTE_UNITS làm số lượng nhóm công việc, vì tôi thường dựa vào việc đồng bộ hóa các mục công việc. Tôi thường chạy hạt nhân với ít nhánh, do đó, cùng một lúc để thực hiện trong mỗi đơn vị tính toán.

Một số bội số của CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE sẽ tối ưu cho thiết bị của bạn. Những gì mà nhiều thực sự là phụ thuộc vào mẫu truy cập bộ nhớ của bạn và loại công việc bạn đang làm với mỗi mục công việc. Sử dụng 1 làm bội số khi bạn đang chạy một hạt nhân nặng, tính toán ràng buộc (ALU). Hãy thử một số lớn hơn để ẩn độ trễ của bộ nhớ nếu bạn bị tắc nghẽn bởi truy cập bộ nhớ. Sử dụng một profiler để xác định thời gian truy cập của bạn và thời gian ALU của bạn là tối ưu.

Tỷ lệ tối ưu cho ALU để tìm nạp là 1: 1 cho bất kỳ thiết bị nào. Điều này hiếm khi đạt được trong thực tế, vì vậy bạn muốn giữ cho các ngân hàng ALU/SIMD bão hòa. Điều này có nghĩa ALU: fetch phải lớn hơn 1 bất cứ khi nào có thể. Ít hơn 1 nghĩa là bạn nên thử kích thước nhóm làm việc lớn hơn để che giấu độ trễ của bộ nhớ tốt hơn.

+0

Tôi đang nhắm mục tiêu để hỗ trợ một loạt các thiết bị. Điều này có nghĩa là, tôi phải kiểm tra hạt nhân của tôi trên mỗi người trong số họ để có được giá trị tối ưu cho enqueuing hạt nhân? – Kentzo

+0

Kiểm tra thuật toán của bạn trên các thiết bị bạn có quyền truy cập - kết quả không thay đổi quá nhiều. Tôi khuyên bạn nên thử nó trên một thiết bị từ mỗi kiến ​​trúc chính mà bạn muốn nhắm mục tiêu. Nếu bạn có thể, điều chỉnh các tham số trong thời gian chạy để thử tối ưu hóa. Điều này có thể tinh chỉnh các giá trị tối ưu bạn đã phát hiện trong quá trình phát triển. Nhận phản hồi từ người dùng cuối/khách hàng về số phần cứng thực tế sẽ cho phép bạn tập trung cải tiến trên các thiết bị phổ biến nhất. – mfa

+0

Nói chung, sử dụng 'CL_DEVICE_MAX_COMPUTE_UNITS' sẽ không cho bạn hiệu năng tối ưu (trừ khi bạn có thể thực hiện nhiều đồng bộ hóa giữa các nhóm làm việc, nhưng đó thường là một ý tưởng tồi). Tôi thường sẽ yêu cầu các tài liệu cho các giá trị tốt, nhưng tôi chưa bao giờ thấy nhiều nhóm làm việc làm tổn thương hiệu suất, do đó, càng có nhiều marrier. Lưu ý rằng phần chọn workgroupsize cao hơn để ẩn độ trễ của bộ nhớ là (ít nhất là cho gpus) chỉ đúng nếu bạn không sử dụng đủ nhóm làm việc (như CL_DEVICE_MAX_COMPUTE_UNITS, vì CUs thường có thể duy trì nhiều hơn một nhóm làm việc tại một thời điểm). – Grizzly

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