Để chương trình CUDA hoạt động được trong môi trường windows hoặc linux, cần phải có các thư viện hỗ trợ. Các thư viện này do NVIDIA cung cấp gồm có các phần sau: Trình điều khiển thiết bị đồ họa cho GPU của NIVIDA, bộ công cụ
- 41 -
phát triển CUDA (gọi là CUDA Toolkit) và bộ CUDA SDK (xem hướng dẫn cài đặt ở phụ lục A).
2.2.3.1. Cơ chế hoạt động một chương trình CUDA
Sử dụng CUDA vì mong muốn chương trình chạy nhanh hơn nhờ khả năng xử lý song song. Vì thế tốt hơn hết cần loại bỏ các ảnh hưởng làm một chương trình chạy chậm đi. Một chương trình CUDA hoạt động theo mô hình SIMD (single instruction multiple data) do vậy ảnh hưởng chính đến tốc độ của chương trình là sự không thống nhất và tranh chấp vùng nhớ trong quá trình đọc và lưu dữ liệu. Điều này buộc trình biên dịch phải chọn giải pháp an toàn trong truy cập dữ liệu. Điều này biến một chương trình song song theo mô hình SIMD thành mô hình nối tiếp.
Kích thước của kiểu dữ liệu rất quan trọng trong việc truy cập dữ liệu một cách thống nhất (coalescing) kích thước dữ liệu phải bằng 4, 8, 16 bytes. Ngoài ra nếu số lệnh tính toán lớn thì nên sao chép dữ liệu từ bộ nhớ chung (global memory) vào bộ nhớ chia sẻ (shared memory) để hạn chế việc truy cập thường xuyên vào bộ nhớ chung làm chậm chương trình (do việc truy cập vào bộ nhớ chung mất rất nhiều thời gian hơn truy cập vào bộ nhớ chia sẻ).
Cấu trúc của một chương trình CUDA thường sử dụng hai hàm: Một hàm dành cho việc truy cập dữ liệu và hàm còn lại gọi là hàm kernel dùng cho việc xử lý dữ liệu.
Để hiểu cách hoạt động một chương trình CUDA (Xem Hình 1.1. ), cần thống nhất một số các khái niệm sau:
- Host: Là những tác vụ và cấu trúc phần cứng, phần mềm được xử lý từ CPU. - Divice: Là những tác vụ và cấu trúc phân cứng, phần mềm được xử lý tại GPU.
- 42 -
Hình 1.1. Sơ đồ hoạt động truyền dữ liệu giữa Host và Device
Cách hoạt động được mô tả như sau:
Bước 1: Dữ liệu cần được tính toán luôn ở trên bộ nhớ của Host vì vậy bước đầu tiên là truyền dữ liệu cần tính toán từ bộ nhớ Host qua bộ nhớ Device.
Bước 2: Sau đó Device sẽ gọi các hàm riêng của mình để tính toán dữ liệu đó. Sau khi tính toán xong, dữ liệu cần được trả về lại cho bộ nhớ của Host.