Kiến trúc đa lõi của GPU

Một phần của tài liệu Giải pháp thiết kế và đánh giá hiệu năng siêu máy tính sử dụng CPU GPU (Trang 41 - 46)

Hình 16 hiển thị kiến trúc của một bộ xử lý đa nhân dòng thông thƣờng. Một bộ xử lý đa nhân dòng có số lƣợng nhân cố định tùy thuộc vào mẫu GPU. Thế hệ G80 và GT200 có 8 nhân, còn kiến trúc Fermi có 32 nhân và 192 nhân ở mẫu Kepler

43

SMX [22]. Mỗi một bộ xử lý đa nhân dòng có một bộ nhớ chia sẻ. Các luồng trong một khối đều có quyền truy cập dữ liệu trong bộ nhớ chia sẻ.

Hình 16: Kiến trúc đa luồng của bộ xử lý đa nhân

Mỗi một nhân xử lý dòng có các đơn vị xử lý số học dấu phẩy động và số nguyên vô hƣớng để thực thi hầu hết các chỉ thị. Tùy theo kiến trúc phần cứng mà cơ chế phần luồng phần cứng hỗ trợ từ 32 đến 96 luồng. Lõi xử lý dòng tƣơng tự nhƣ đƣờng ống dẫn có thể xử lý nhiều luồng cùng một lúc. Phần mềm phải khai báo số lƣợng thanh ghi dùng cho mỗi luồng trong tổng số 1024 thanh ghi của lõi. Nếu mỗi luồng càng sử dụng ít thanh ghi thì số luồng có thể xử lý đồng thời càng lớn và ngƣợc lại. Ví dụ một chƣơng trình shader pixel thƣờng sử dụng không quá 16 thanh ghi một luồng do đó 1024 thanh ghi có thể đƣợc gán cho 64 luồng, tức là một nhân xử lý dòng có thể xử lý 64 luồng shader pixel tại một thời điểm.

Bộ xử lý đa nhân dòng xây dựng trên mô hình tƣơng tự nhƣ SIMD, gọi là Đa luồng đơn lệnh (SIMT - Single Instruction Multiple Thread). Nó tạo ra một nhóm các luồng gọi là cuộn. Một cuộn bao gồm 32 luồng đƣợc chỉ định cho cùng một nhân [31]. Một nhân SM thông thƣờng sẽ thực thi nhiều cuộn, nhảy qua lại giữa các cuộn để che giấu độ trễ nhƣ ở hình 17. Một khối các luồng không bao giờ nhỏ hơn

44

một cuộn, một khối các luồng có thể bao gồm nhiều cuộn [31]. Từng luồng đơn lẻ gộp lại tạo nên một cuộn bắt đầu từ cùng một chỗ của chƣơng trình nhƣng chúng có bộ đếm địa chỉ lệnh và trạng thái thanh ghi riêng do đó hoàn toàn có thể rẽ nhánh và thực thi độc lập.

Hình 17: Sắp xếp cuộn đa luồng SIMT

Trong kiến trúc Tesla, các cuộn đƣợc gán cho các nhân trong một đơn vị 4 chu kì đồng hồ, một cuộn 32 luồng sẽ đƣợc phân phối giữa 8 nhân với 4 luồng một nhân [20]. Qua bốn chu kì đồng hồ, mỗi luồng trong bốn luồng bắt đầu thực thi một lệnh. Do đó sau bốn chu kì đồng hồ, 32 luồng mỗi luồng đều đã thực thi xong một lệnh. Trong kiến trúc Ferrmi, mỗi một bộ xử lý đa nhân có hai bộ sắp xếp cuộn và hai đơn vị gửi chỉ thị lệnh, do đó cho phép hai cuộn cùng đƣợc tạo ra và xử lý một lúc. Bộ sắp xếp cuộn kép sẽ lựa chọn hai cuộn và phát ra một chỉ thị lệnh cho mỗi cuộn tới nhóm mƣời sáu lõi, mƣời sáu đơn vị tải/lƣu trữ hoặc bốn đơn vị SFU. Việc xử lý hai cuộn song song cùng một lúc sẽ giúp che giấu độ trễ do truy cập bộ nhớ. Trong kiến trúc Kepler, mỗi một bộ xử lý dòng SMX có bốn bộ sắp xếp cuộn và tám đơn vị gửi chỉ thị lệnh cho phép bốn luồng đƣợc xử lý thực thi cùng một lúc. Trong kiến trúc Kepler, bốn bộ sắp xếp cuộn sẽ chọn bốn cuộn, và thực thi hai lệnh độc lập mỗi cuộn mỗi chu kì [28]. Hình 18 cho ta thấy hoạt động bên trong của một trong bốn bộ sắp xếp cuộn. Không giống với kiến trúc Fermi không cho phép một lệnh có độ

45

chính xác kép kết đôi với một lệnh khác, Kepler GK110 cho phép lệnh có độ chính xác kép ghép đôi với một lệnh khác.

Hình 18: Bộ gửi chỉ thị lệnh kép trong kiến trúc Kepler

Vì các luồng đƣợc thực thi theo những lộ trình khác nhau nên một số luồng tại một số thời điểm phải chuyển sang trạng thái không hoạt động (nếu không nó sẽ bị thực thi sai lệnh). Do đó các điều kiện rẽ nhánh sẽ ƣớc lƣợng trên các dữ liệu khác nhau và do đó các luồng sẽ đƣợc đi theo các lộ trình khác nhau nên thông lƣợng sẽ bị suy giảm. Khi các luồng tái hợp lại với nhau thì chúng sẽ đƣợc cùng thực thi lệnh tiếp. Nếu các lộ trình đi qua các đoạn mã có độ dài bằng nhau thì hao phí hiệu năng sẽ ít hơn nếu đoạn mã ở các nhánh có độ dài khác nhau.

Kiến trúc Tesla sử dụng đa luồng tinh để sắp xếp 24 cuộn cùng một lúc (chạy một gói bốn cuộn một) [20]. Hình 19 mô tả các cuộn đƣợc sắp xếp nhƣ thế nào trên một bộ đa xử lý dòng Tesla. Nhƣ đã nói ở trên, một cuộn đƣợc phân phối trên tám nhân. Do đó có 32 cuộn nên theo kịch bản tối ƣu nhất thì mất 4 chu kì để xử lý hết số cuộn. Trong thực tế thời gian thực thi lệnh sẽ lâu hơn do có nhiều điều kiện rẽ nhánh và trạng thái không hoạt động của các luồng.

46

Hình 19: So sánh Sun UltraSPARC T2 với một chip Tesla, 8 Lõi SM

Đơn vị chỉ thị đa luồng SIMT của bộ xử lý đa lõi luồng sẽ chọn một cuộn sẵn sàng để thực thi lệnh tiếp theo (vì số lƣợng các luồng hoạt động đã đạt đến giá trị lớn nhất) và gửi chỉ thị lệnh đến các luồng hoạt động trong cuộn đó. Có thể có trƣờng hợp các cuộn thuộc kiểu khác nhau đƣợc thực thi cùng một lúc ở trong một SM (ví dụ nhƣ một cuộn pixel có thể đƣợc thực thi cùng với một cuộn đỉnh).

Thực thi luồng SIMT và phân kì

Một cuộn thực thi một lệnh chung tại một thời điểm và cơ chế này đạt hiệu suất lớn nhất khi cả 32 luồng của một cuộn đều đi một lộ trình thực thi chung. Nếu các luồng của một cuộn phân nhánh qua các nhánh rẽ độc lập dữ liệu thì cuộn sẽ tuần tự thực thi từng nhánh một, chuyển trạng thái các luồng sang trạng thái không hoạt động với các luồng không thực thi câu lệnh hiện hành và khi tất cả các nhánh đƣợc xử lý xong, các luồng hội tụ lại với nhau và quay trở lại lộ trình xử lý chung. Việc phân nhánh chỉ xảy ra trong một cuộn, các cuộn khác nhau thì thực thi một cách độc lập với nhau bất chấp việc chúng có cùng thực thi một lệnh hay khác lệnh nhau hay không.

47

Một phần của tài liệu Giải pháp thiết kế và đánh giá hiệu năng siêu máy tính sử dụng CPU GPU (Trang 41 - 46)