CUDA là gì?
CUDA (Compute Unified Device Architecture) là ngôn ngữ C/C++ được mở rộng, cho phép viết chương trình chạy trên CPU (những phần tính toán tuần tự) và GPU (những phần tính toán song song).
CPU có một vài core, mỗi core mạnh và phức tạp. Tập trung tối ưu hóa độ trễ (latency)
Độ trễ = thời gian hoàn thành một công việc
GPU có rất rất nhiều core, mỗi core yếu và đơn giản. Tập trung tối ưu hóa băng thông (throughput)
Băng thông = số lượng công việc hoàn thành trong một đơn vị thời gian
Cấu trúc của một chương trình CUDA
Một số khái niệm:
– Host: CPU và bộ nhớ của nó
– Device: GPU và bộ nhớ của nó
– Hàm kernel <<<…>>>: cấu hình thực thi, được gọi từ host
__global__: hàm sẽ chạy trên device và được gọi từ host
__host__: hàm sẽ chạy trên host và được gọi từ host
__device__: hàm sẽ chạy trên device và được gọi từ device
Những phần tính toán tuần tự chạy ở host (CPU), những phần tính toán song song (mức độ lớn) chạy ở
device (GPU)
Từ host, để nhờ device tính toán song song:
- Host cấp phát các vùng nhớ ở device bằng hàm cudaMalloc
- Host chép các dữ liệu cần thiết sang các vùng nhớ ở device bằng hàm cudaMemcpy
- Host gọi hàm kernel
- Host chép kết quả từ device về bằng hàm cudaMemcpy
- Host giải phóng các vùng nhớ ở device bằng hàm cudaFree
Hàm kernel dược thực thi song song ở device bởi rất nhiều tiểu trình (thread)
Các tiểu trình này được tổ chức thành 2 cấp: lưới tiểu trình (grid) gồm các khối tiểu trình (block) có cùng kích thước, khối gồm các tiểu trình.
Khi host gọi hàm kernel cần cho biết grid gồm bao nhiêu block, mỗi block có bao nhiêu thread (blockSize, gridSize).
Trong hàm kernel, mỗi biến tiểu trình có thể sử dụng các biến hệ thống blockIdx, threadIdx, blockDim, gridDim để xác định phần dữ liệu mà mình sẽ phụ trách tính toán
Một tính chất của hàm kernel là “không đồng bộ” (asynchronous): sau khi host gọi hàm kernel ở device, host sẽ được tự do tiếp tục làm các công việc của mình mà không phải chờ hàm kernel ở device thực hiện xong.
Ở các bài sau, Ngô Tôn .IT xin giới thiệu một số chương trình CUDA đơn giản như cộng 2 vector, cộng 2 ma trận, nhân 2 ma trận,… để các bạn có thể thực thành lập trình song song trên GPU.
Leave a Reply