2014-11-07 15 views
14

Tôi thực sự không hiểu mục đích của Nhóm công việc trong OpenCL.OpenCL: khái niệm nhóm làm việc

Tôi hiểu rằng họ là một nhóm các mục công việc (được cho là, các chủ đề phần cứng), những mục được thực thi song song.

Tuy nhiên, tại sao cần phân vùng thô hơn này? Nó sẽ không được phép chỉ có lưới các chủ đề (và, de facto, chỉ một W-G)?

Nhóm công việc có nên ánh xạ chính xác đến một lõi vật lý không? Ví dụ, thẻ TESLA c1060 được cho là có 240 lõi. Làm thế nào các nhóm công việc sẽ lập bản đồ này?

Ngoài ra, theo như tôi hiểu, các mục công việc bên trong một nhóm làm việc có thể được đồng bộ nhờ vào hàng rào bộ nhớ. Nhóm làm việc có thể đồng bộ hóa hoặc thậm chí là cần thiết không? Họ có nói chuyện với nhau thông qua bộ nhớ chia sẻ hoặc là điều này chỉ dành cho các mục công việc (không chắc chắn về mục này)?

Trả lời

16

Một phần của sự nhầm lẫn ở đây tôi nghĩ đến thuật ngữ. Những gì mọi người GPU thường gọi là lõi, không thực sự, và những gì GPU người thường gọi chủ đề chỉ trong một ý nghĩa nhất định.

lõi Một lõi, về GPU tiếp thị có thể tham khảo một cái gì đó giống như một lõi CPU, hoặc nó có thể tham khảo một làn đường duy nhất của một đơn vị SIMD - có hiệu lực một lõi x86 CPU duy nhất sẽ được bốn lõi của việc này loại đơn giản hơn. Đây là lý do tại sao số lượng lõi GPU có thể rất cao. Nó không thực sự là một so sánh công bằng, bạn phải chia cho 16, 32 hoặc một số tương tự để có được một số lõi so sánh trực tiếp hơn.

Các mục công việc Mỗi mục công việc trong OpenCL là một luồng về luồng điều khiển và mô hình bộ nhớ của nó. Phần cứng có thể chạy nhiều mục công việc trên một chuỗi, và bạn có thể dễ dàng hình dung điều này bằng cách tưởng tượng bốn mục công việc OpenCL hoạt động trên các làn riêng biệt của một vector SSE. Nó sẽ chỉ đơn giản là trình biên dịch trickery mà đạt được điều đó, và trên GPU nó có xu hướng là một hỗn hợp của trình biên dịch trickery và hỗ trợ phần cứng. OpenCL 2.0 thực sự phơi bày khái niệm chuỗi phần cứng cơ bản này thông qua các nhóm con, vì vậy có một cấp bậc phân cấp khác để xử lý.

làm việc nhóm Mỗi công việc nhóm chứa một tập hợp các công việc mục mà phải có khả năng thực hiện tiến bộ trong sự hiện diện của các rào cản. Trong thực tế, điều này có nghĩa là nó là một tập hợp, tất cả trạng thái có thể tồn tại cùng một lúc, như vậy khi một nguyên thủy đồng bộ gặp phải có rất ít chi phí chuyển đổi giữa chúng và có đảm bảo rằng công tắc có thể thực hiện được.

Một nhóm làm việc phải ánh xạ tới một đơn vị tính toán, thực tế có nghĩa là toàn bộ nhóm làm việc phù hợp với một thực thể duy nhất mà mọi người gọi là lõi - CUDA sẽ gọi nó là bộ xử lý đa (tùy thuộc vào thế hệ), AMD là một đơn vị tính toán và những người khác có tên gọi khác nhau. Địa phương này thực hiện dẫn đến đồng bộ hóa hiệu quả hơn, nhưng nó cũng có nghĩa là tập hợp các mục công việc có thể có quyền truy cập vào các đơn vị bộ nhớ được xây dựng cục bộ. Họ dự kiến ​​sẽ giao tiếp thường xuyên, hoặc rào cản sẽ không được sử dụng, và để làm cho giao tiếp này hiệu quả có thể có cache địa phương (tương tự như CPU ​​L1) hoặc bộ nhớ scratchpad (bộ nhớ cục bộ trong OpenCL).

Miễn là rào cản được sử dụng, nhóm công việc có thể đồng bộ hóa nội bộ, giữa các mục công việc, sử dụng bộ nhớ cục bộ hoặc bằng cách sử dụng bộ nhớ chung. Các nhóm làm việc không thể đồng bộ hóa với nhau và tiêu chuẩn không đảm bảo về tiến độ tiến bộ của các nhóm công việc liên quan đến nhau, điều này làm cho việc xây dựng khóa cầm tay và các nguyên tắc đồng bộ hóa một cách hiệu quả là không thể.

Rất nhiều điều này là do lịch sử thay vì thiết kế. Phần cứng GPU từ lâu đã được thiết kế để xây dựng các chủ đề vectơ và gán chúng cho các đơn vị thực hiện theo cách tối ưu xử lý hình tam giác. OpenCL rơi ra khỏi generalising rằng phần cứng là hữu ích cho những thứ khác, nhưng không generalising nó rất nhiều mà nó trở nên không hiệu quả để thực hiện.

1

Việc sử dụng các nhóm công việc cho phép tối ưu hóa nhiều hơn cho trình biên dịch hạt nhân. Điều này là do dữ liệu không được chuyển giữa các nhóm làm việc. Tùy thuộc vào thiết bị OpenCL được sử dụng, có thể có bộ đệm có thể được sử dụng cho các biến cục bộ để cho phép truy cập dữ liệu nhanh hơn. Nếu chỉ có một nhóm làm việc, các biến cục bộ sẽ chỉ giống như các biến toàn cục sẽ dẫn đến truy cập dữ liệu chậm hơn.

Ngoài ra, thường các thiết bị OpenCL sử dụng các tiện ích mở rộng nhiều hướng dẫn dữ liệu (SIMD) để đạt được tính song song tốt. Một nhóm làm việc có thể chạy song song với các phần mở rộng SIMD.

Should a Work-Group exactly map to a physical core ? 

Tôi nghĩ rằng, cách duy nhất để tìm ra kích thước làm việc nhóm nhanh nhất, là để thử các kích thước làm việc nhóm khác nhau. Bạn cũng có thể truy vấn CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE từ thiết bị với clGetKernelWorkGroupInfo. Kích thước nhanh nhất nên là bội số của điều đó.

Can work-groups synchronize or is that even needed ? 

Nhóm làm việc cannot be synchronized. Bằng cách này không có sự phụ thuộc dữ liệu giữa chúng và chúng cũng có thể được chạy tuần tự, nếu đó được xem là cách nhanh nhất để chạy chúng. Để đạt được kết quả tương tự, hơn là đồng bộ hóa giữa các nhóm công việc, hạt nhân cần chia thành nhiều hạt nhân. Các biến có thể được chuyển giữa các hạt với bộ đệm.

2

Một lợi ích của các nhóm làm việc là chúng cho phép sử dụng bộ nhớ cục bộ dùng chung làm bộ nhớ cache do người lập trình xác định. Một giá trị đọc từ bộ nhớ toàn cục có thể được lưu trữ trong bộ nhớ cục bộ nhóm làm việc được chia sẻ và sau đó truy cập nhanh chóng bằng bất kỳ mục công việc nào trong nhóm làm việc. Một ví dụ tốt là trò chơi của cuộc sống: mỗi tế bào phụ thuộc vào chính nó và 8 xung quanh nó. Nếu mỗi mục công việc đọc thông tin này, bạn sẽ có bộ nhớ toàn cục 9x đọc. Bằng cách sử dụng các nhóm làm việc và bộ nhớ cục bộ chia sẻ, bạn có thể tiếp cận 1x bộ nhớ toàn cục đọc (chỉ tiếp cận vì có dư thừa đọc ở các cạnh).

3

Đã có rất nhiều câu trả lời hay, để hiểu thêm về thuật ngữ của OpenCL this paper thực sự mô tả tất cả các khái niệm rất tốt.