2.2.4.1. Bộ đồng xử lý đa luồng mức cao
Trong lập trình CUDA, GPU được xem như là một thiết bị tính toán có khả năng thực hiện một số lượng rất lớn các luồng song song. GPU hoạt động như là một bộ đồng xử lý với CPU chính. Nói cách khác, dữ liệu song song, phần tính toán chuyên dụng của các ứng dụng chạy trên host được tách rời khỏi thiết bị.
Chính xác hơn, một phần của một ứng dụng được thực hiện nhiều lần, nhưng độc lập về mặt dữ liệu, có thể nhóm thành một chức năng được thực hiện trên thiết bị như nhiều luồng khác nhau. Để có điều đó, một chức năng được biên dịch thành các tập lệnh của thiết bị và tạo ra chương trình, gọi là nhân (kernel), được tải vào thiết bị.
Cả hai host và thiết bị duy trì DRAM riêng của nó, được gọi là bộ nhớ host và bộ nhớ thiết bị. Có thể sao chép dữ liệu giữa DRAM của host và thiết bị thông qua API đã tối ưu hóa có sử dụng cơ chế truy cập bộ nhớ trực tiếp tốc độ cao (DMA) của thiết bị.
- 43 -
2.2.4.2. Gom lô các luồng (Thread Batching)
Lô các luồng thực hiện được nhân (kernel) tổ chức thành một lưới các khối luồng được miêu tả trong phần khối luồng và lưới các khối luồng dưới đây.
Khối luồng
Một khối luồng là một tập các luồng, có thể đồng thời xử lý với nhau bằng cách dùng dữ liệu trong bộ nhớ dùng chung và thực thi đồng bộ để phối hợp truy cập bộ nhớ. Chính xác hơn, có thể xác định các điểm đồng bộ trong nhân, nơi các luồng trong khối sẽ dừng cho đến khi tất cả các luồng tới điểm đồng bộ.
Mỗi luồng được xác định bởi ID, đó là số hiệu của luồng trong khối. Để hỗ trợ việc định địa chỉ phức tạp dựa trên ID luồng, một ứng dụng cũng có thể chỉ định một khối như một mảng hai hoặc ba chiều có kích thước tùy ý và xác định từng luồng bằng cách sử dụng chỉ số hai hoặc ba thành phần để thay thế. Đối với các khối kích thước hai chiều (Dx, Dy), ID luồng của phần tử có chỉ số (x, y) là (x + y Dx) và cho một khối kích thước ba chiều (Dx, Dy, Dz), ID luồng của phần tử (x, y, z) là (x + yDx + z Dx Dy).
Lưới các khối luồng (Grid of Thread Blocks)
Số lượng luồng tối đa trong một khối có giới hạn. Tuy nhiên, các khối cùng số chiều và kích thước thực thi trên cùng nhân có thể nhóm với nhau thành lưới các khối, do vậy tổng số luồng chạy trên một nhân là lớn hơn nhiều. Điều này xuất phát tại các chi phí hợp tác giữa các luồng giảm, vì các luồng trong các lô khác nhau trong lưới không thể trao đổi và đồng bộ với nhau. Mô hình mô tả ở Hình 2.1. cho phép các nhân chạy hiệu quả mà không phải dịch lại trên các loại thiết bị khác nhau với khả năng chạy song song khác nhau: Một thiết bị có thể chạy trên tất cả khối của lưới một cách tuần tự nếu thiết bị đó có rất ít khả năng chạy song song hoặc chạy song song nếu nó có khả năng chạy song song nhiều hoặc kết hợp cả hai.
- 44 -
Mỗi khối được xác định bởi ID của nó, đó là số khối trong lưới. Để hỗ trợ việc định địa chỉ phức tạp dựa trên khối ID (block ID), một ứng dụng có thể xác định một lưới như một mảng hai chiều với kích thước cố định và định danh mỗi khối sử dụng chỉ mục hai thành phần. Với khối hai chiều kích thước (Dx, Dy), ID của khối (x,y) là (x + y Dx).
Hình 2.1. Khối luồng