Hi, I am

Ngô Tôn

I am a programmer.

Home / HCMUS / Parallel Programming on a GPU / Tính tổng các phần tử trong mảng – Lập trình song song trên GPU bằng CUDA

Tính tổng các phần tử trong mảng – Lập trình song song trên GPU bằng CUDA

Phần tiếp theo của bài viết Cộng các phần tử trong mảng – Lập trình song song trên GPU bằng CUDA

Bài viết này, chúng ta sẽ cải tiến lại bài toán tính tổng các phần tử trong mảng thực thi song song trên GPU bằng CUDA.

Kiến trúc phần cứng cơ bản của GPU

– GPU bao gồm các SM (Streaming Multiprocessor) – bộ xử lý đa luồng

  • Mỗi SM bao gồm các SP (Streaming Processor) – bộ xử lý luồng (còn gọi là CUDA core)

– “Compute capability” = SM version

CUDA “ảo hóa” (virtualize) kiến trúc phần cứng của GPU

  • Block = bộ-xử-lý-đa-luồng “ảo”
  • Thread = bộ-xử-lý-luồng “ảo”

Khi host gọi hàm kernel, hệ thống sẽ tạo ra một grid gồm các block và mỗi block (bộ xử lý đa luồng “ảo”) sẽ được phân vào một SM (bộ xử lý đa luồng thật) để thực thi

  • Mỗi SM có thể chứa nhiều hơn một block để thực thi
  • Các block chưa được thực thi sẽ được đưa vào một hàng đợi
  • Khi có một block được thực thi xong, hệ thống sẽ lấy một block chưa được thực thi ở hàng đợi và đưa vào thực thi

Hiện tượng phân kỳ warp

Trong SM, với mỗi block, hệ thống không quản lý và thực thi riêng lẻ từng thread mà làm theo các nhóm 32 thread – gọi là warp

Cách làm này được gọi là SIMT (Single Instruction Multiple Thread) – một câu lệnh được thực thi đồng thời cho tất các thread trong warp (mỗi thread có dữ liệu riêng của mình)

Warp bị phân kỳ (warp divergence)

  • Nếu các thread trong warp không thể thực thi cùng một câu lệnh

Ví dụ: câu lệnh rẽ nhánh, vòng lặp

Tính tổng các phần tử trong mảng

Chúng ta cùng xem lại hàm reduceOnDevice của bài viết Cộng các phần tử trong mảng – Lập trình song song trên GPU bằng CUDA. Ta thấy wrap sẽ bị phân kỳ do có những thread lẻ sẽ không thực thi, vậy ta sẽ sửa lại 1 chút.

Vậy chúng ta có thể tối ưu hóa sử dụng phần cứng của GPU hơn không?

Phiên bản Interleaved Pairs

Phiên bản Unrolling

Phiên bản Unrolled Warps

Phiên bản Complete Unrolling

 

About ngoton

Ngô Tôn is a programmer with passion for tailored software solutions. Comes with 7+ years of IT experience, to execute beautiful front-end experiences with secure and robust back-end solutions.

Check Also

Cộng 2 vector – Lập trình song song trên GPU bằng CUDA

Mục lục Nội dungThực hiệnKết quả Bài viết đầu tiên trong chuỗi bài viết về …

Leave a Reply

avatar
  Subscribe  
Notify of