Báo cáo Nghiên cứu về lập trình song song trên GPU và viết ứng dụng minh hoạ (Phần 1)

pdf 22 trang phuongnguyen 1500
Bạn đang xem 20 trang mẫu của tài liệu "Báo cáo Nghiên cứu về lập trình song song trên GPU và viết ứng dụng minh hoạ (Phần 1)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbao_cao_nghien_cuu_ve_lap_trinh_song_song_tren_gpu_va_viet_u.pdf

Nội dung text: Báo cáo Nghiên cứu về lập trình song song trên GPU và viết ứng dụng minh hoạ (Phần 1)

  1. BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH BÁO CÁO TỔNG KẾT ÐỀ TÀI KH&CN CẤP TRƯỜNG TRỌNG ÐIỂM NGHIÊN CỨU VỀ LẬP TRÌNH SONG SONG TRÊN GPU VÀ VIẾT ỨNG DỤNG MINH HOẠ Mã số: T2014 - 40 Chủ nhiệm đề tài: ThS. Trần Công Tú S K C0 0 5 4 6 8 Tp. Hồ Chí Minh, tháng 03/2015
  2. BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH BÁO CÁO TỔNG KẾT ĐỀ TÀI KH&CN CẤP TRƯỜNG NGHIÊN CỨU VỀ LẬP TRÌNH SONG SONG TRÊN GPU VÀ VIẾT ỨNG DỤNG MINH HOẠ Mã số: T2014 - 40 Chủ nhiệm đề tài: ThS. Trần Công Tú TP. HCM, 03/2015
  3. TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO TỔNG KẾT ĐỀ TÀI KH&CN CẤP TRƯỜNG NGHIÊN CỨU VỀ LẬP TRÌNH SONG SONG TRÊN GPU VÀ VIẾT ỨNG DỤNG MINH HOẠ Mã số: T2014 - 40 Chủ nhiệm đề tài: ThS. Trần Công Tú TP. HCM, 03/2015
  4. MỤC LỤC MỞ ĐẦU 1 Tính cấp thiết của đề tài 1 Mục tiêu đề tài 2 Đối tượng và phạm vi nghiên cứu 2 Phương pháp nghiên cứu 2 Cách tiếp cận 2 Phương pháp nghiên cứu 2 Nội dung nghiên cứu 2 CHƯƠNG I: TỔNG QUAN VỀ GPU 3 I.1. Bộ xử lý đồ hoạ GPU 3 I.2. Thuật ngữ GPGPU 3 I.3. GPU computing 3 I.4. Kiến trúc GPU hiện đại 4 I.5. So sánh GPU và CPU 6 CHƯƠNG II: GIỚI THIỆU CÔNG NGHỆ CUDA 8 II.1. Công nghệ CUDA 8 II.2. Ứng dụng của CUDA trong các lĩnh vực công nghệ 10 II.2.1 CUDA cho ngành công nghiệp trò chơi 10 II.2.2 CUDA cho các ứng dụng video số 11 II.3. Môi trường lập trình với CUDA 12 II.4. Cơ chế hoạt động một chương trình CUDA 14 II.5. Mô hình lập trình 15 II.5.1 Bộ đồng xử lý đa luồng mức cao 15 II.5.2 Gom lô các luồng (Thread Batching) 16 II.6. Mô hình bộ nhớ 18 II.7. Tìm hiểu ngôn ngữ lập trình CUDA 19 II.7.1 Ngôn ngữ lập trình CUDA là mở rộng của ngôn ngữ lập trình C 19 II.7.2 Những mở rộng của ngôn ngữ lập trình CUDA so với ngôn ngữ C 20 II.7.3 Từ khóa phạm vi kiểu hàm 21 Các hạn chế 21 II.7.4 Từ khóa phạm vi kiểu biến 22 Các ràng buộc 23 II.7.5 Thực hiện cấu hình 24 CHƯƠNG III: CÁC CHƯƠNG TRÌNH MINH HOẠ 33 III.1. Nhân hai ma trận 33 III.1.1 Cài đặt trên CPU 33 III.1.2 Cài đặt trên GPU 33 III.1.3 Cài đặt trên GPU – sử dụng tile 34 III.1.4 So sánh kết quả 34 Trang i
  5. III.2. Sắp xếp mảng một chiều 35 III.2.1 Cài đặt trên CPU 35 III.2.2 Cài đặt trên GPU 35 III.2.3 So sánh kết quả 36 III.3. Tìm kiếm một chuỗi trong file dữ liệu lớn 36 III.3.1 Cài đặt trên CPU 36 III.3.2 Cài đặt trên GPU 37 III.3.3 So sánh kết quả 37 KẾT LUẬN 39 IV.1. Kết quả đạt được 39 IV.2. Hạn chế 39 IV.3. Hướng phát triển 39 TÀI LIỆU THAM KHẢO 41 Trang ii
  6. TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM THÀNH PHỐ HỒ CHÍ MINH Độc lập - Tự do - Hạnh phúc KHOA CÔNG NGHỆ THÔNG TIN TP.HCM, ngày 6 tháng 3 năm 2015 THÔNG TIN KẾT QUẢ NGHIÊN CỨU 1. Thông tin chung: - Tên đề tài: Nghiên cứu về lập trình song song trên GPU và viết ứng dụng minh hoạ - Mã số: T201440 - Chủ nhiệm: ThS. Trần Công Tú - Cơ quan chủ trì: Trường ĐH Sư phạm Kỹ thuật TP.HCM - Thời gian thực hiện:1/2014 đến 12/2014 2. Mục tiêu: Tận dụng khả năng tính toán của GPU, lập trình song song giải một bài toán minh hoạ. 3. Tính mới và sáng tạo: Tính toán trên GPU đã là một xu hướng nghiên cứu nhưng vẫn còn mới mẻ ở trường ĐH Sư phạm Kỹ thuật TP.HCM. 4. Kết quả nghiên cứu: - Một báo cáo khoa học hoàn chỉnh có thể làm tài liệu tham khảo tốt cho các giáo viên và sinh viên quan tâm. - Một báo cáo khoa học đăng trên website khoa CNTT. 5. Sản phẩm: - Một chương trình máy tính minh họa việc lập trình song song trên GPU. 6. Hiệu quả, phương thức chuyển giao kết quả nghiên cứu và khả năng áp dụng: - Giúp giáo viên và sinh viên dễ dàng tiếp cận công nghệ mới. - Giúp các nhóm nghiên cứu về tính toán hiệu năng cao tận dụng thêm sức mạnh tính toán của GPU nhằm giải quyết các bài toán đòi hỏi khả năng tính toán cao. Trưởng Đơn vị Chủ nhiệm đề tài (ký, họ và tên) (ký, họ và tên) Trang iii
  7. MỞ ĐẦU Nhu cầu tính toán nhằm giải quyết các bài toán khoa học, công nghệ luôn vượt quá khả năng của máy tính (ví dụ như mô phỏng hệ sinh thái, số hóa mọi ký ức con người, dự đoán cấu trúc 3D của protein )[1]. Do đó con người luôn cố gắng tạo ra các hệ thống máy tính ngày càng mạnh, tuy nhiên, việc tăng khả năng của một bộ xử lý lại phụ thuộc nhiều vào công nghệ, cần có thời gian và còn nhiều hạn chế. Một giải pháp khác được đưa ra là sử dụng nhiều bộ xử lý để giải quyết một bài toán (gọi là xử lý song song). Một trong những giải pháp tận dụng công nghệ để xử lý song song nhằm tăng tốc độ tính toán là sử dụng bộ xử lý đồ họa (GPU - Graphic Proccessing Unit). GPU ban đầu thực chất chỉ hỗ trợ những tính toán phù hợp với khả năng là tăng tốc độ xử lý đồ họa, nhưng đến thời điểm GPU NV30 của NVIDIA ra đời, GPU đã có thể thực hiện những tính toán vượt qua giới hạn công việc đồ họa. Do đó GPU hiện nay không chỉ là một công cụ xử lý đồ họa mạnh mà còn là một bộ xử lý hỗ trợ lập trình song song ở mức cao, giúp xử lý các bài toán số học phức tạp và băng thông bộ nhớ tăng hơn đáng kể so với CPU cùng loại. Sự tăng tốc nhanh chóng của GPU trong cả khả năng hỗ trợ lập trình và năng lực tính toán của nó đã tạo ra một xu hướng nghiên cứu mới. Tính cấp thiết của đề tài Hiện nay, hầu hết các hệ thống máy tính mới đều có các bộ xử lý đồ họa (GPU), các GPU mới không chỉ là một bộ xử lý đồ họa mà còn là một công cụ hỗ trợ để lập trình song song. Sự phát triển mạnh mẽ về năng lực tính toán của GPU đã tạo ra một xu hướng nghiên cứu mới về tính toán hiệu năng cao bởi nó có khả năng đảm nhận thay cho CPU thực hiện những tính toán phức tạp thay vì chỉ dừng lại ở các ứng dụng trò chơi 3D. Trang 1
  8. Mục tiêu đề tài Tận dụng khả năng tính toán của GPU, lập trình song song giải một bài toán minh họa Đối tượng và phạm vi nghiên cứu Đối tượng nghiên cứu - Bộ xử lý đồ họa. - Kiến trúc CUDA Phạm vi nghiên cứu - Lập trình song song trên GPU, giải một bài toán minh họa. Phương pháp nghiên cứu Cách tiếp cận Nghiên cứu lý thuyết, cài đặt công cụ, tìm bài toán, lập trình minh họa. Phương pháp nghiên cứu Tìm hiểu kiến trúc CUDA, công cụ lập trình trên GPU, giải bài toán minh họa. Nội dung nghiên cứu - Tìm hiểu về GPGPU (General Purpose Computing on Graphics Processing Units). - Tìm hiểu công nghệ của NVIDIA và kiến trúc CUDA. - Lập trình song song trên GPU để giải quyết một bài toán minh họa. Trang 2
  9. CHƯƠNG I: TỔNG QUAN VỀ GPU I.1. Bộ xử lý đồ hoạ GPU GPU được đưa ra giới thiệu lần đầu tiên vào năm 1999 bởi NVIDIA và hiện nay, nó là bộ xử lý song song rất phổ biến. GPU là một bộ vi xử lý chuyên dụng đảm nhiệm việc tăng tốc, xử lý đồ họa cho bộ xử lý trung tâm CPU. Với cấu trúc mang tính xử lý song song mạnh mẽ, GPU cho thấy nó hiệu quả hơn CPU rất nhiều trong nhiều thuật toán phức tạp. GPU được sử dụng trong các hệ thống nhúng, điện thoại di động, máy tính cá nhân, máy trạm, máy chơi game v.v Trong máy tính cá nhân, một GPU có thể xuất hiện ở card đồ họa, hoặc nó cũng có thể được gắn trên mainboard. I.2. Thuật ngữ GPGPU Từ năm 2003, các nhà nghiên cứu đã cố gắng khai thác sức mạnh của GPU cho các ứng dụng không mang tính đồ họa. Đặc biệt trong khoa học máy tính, cùng với các nhà nghiên cứu trong các lĩnh vực như hình ảnh y khoa, điện từ Họ đã bắt đầu sử dụng GPU để chạy các ứng dụng điện toán đa dụng (general purpose) và nó đã cho thấy sự xuất sắc trong khả năng biểu diễn các phép tính dấu chấm động của các GPU, dẫn đến tăng hiệu suất rất lớn cho một loạt các ứng dụng khoa học. Từ đó dẫn đến sự ra đời của GPGPU – General Purpose computing (Điện toán đa dụng). I.3. GPU computing Mặc dù GPGPU có tốc độ tính toán nhanh nhờ khả năng xử lý song song, nó vẫn có một số hạn chế: 1. Đòi hỏi các lập trình viên phải có kiến thức sâu sắc về các giao diện lập trình ứng dụng đồ họa (graphics APIs) và kiến trúc của GPU. 2. Các tính năng lập trình cơ bản như truy xuất đọc, viết ngẫu nhiên vào bộ nhớ đã không được hỗ trợ, giới hạn phần nào mô hình lập trình. Trang 3
  10. 3. Việc thiếu hỗ trợ độ chính xác kép (double precision) khiến cho một số ứng dụng khoa học không thể chạy trên GPU. Để khắc phục những vấn đề này, NVIDIA đã giới thiệu 2 kỹ thuật then chốt: - Đồ họa hợp nhất và kiến trúc tính toán G80 (được giới thiệu trong các GPU GeForce 8800®, Quadro FX 5600® và Tesla C870®) - CUDA: một kiến trúc phần mềm và phần cứng cho phép lập trình trên GPU bằng nhiều ngôn ngữ lập trình cấp cao (C, C++, Fortran ) Hai kỹ thuật này đã giúp cho các lập trình viên có thể viết các chương trình C với sự mở rộng của kiến trúc CUDA và sử dụng vào các mục đích tổng quan hơn (không chỉ dành cho lập trình đồ họa) với bộ xử lý song song mạnh mẽ, qua đó hỗ trợ nhiều ứng dụng hơn, nhiều ngôn ngữ lập trình hơn. NVIDIA gọi đây là cách lập trình mới trên GPU – Điện toán GPU (GPU computing). I.4. Kiến trúc GPU hiện đại GPU được xây dựng cho các nhu cầu ứng dụng khác nhau so với CPU, đó là các yêu cầu tính toán lớn chạy song song, với trọng tâm là thông lượng hơn là độ trễ. Do đó, các kiến trúc của GPU phát triển theo một hướng khác so với CPU. GPU phân chia các nguồn lực của bộ xử lý theo các khung cảnh khác nhau, sao cho đường ống được chia theo không gian chứ không phải thời gian. Các phần của bộ vi xử lý làm việc trên một trong những khung cảnh cấp dữ liệu đầu ra trực tiếp vào một phần khác mà sẽ hoạt động trong giai đoạn tiếp theo. Cơ chế tổ chức này đã rất thành công tại GPU cố định chức năng vì hai lý do. Đầu tiên, phần cứng trong bất kỳ khung cảnh nào có thể khai thác cơ chế song song dữ liệu trong khung cảnh đó, xử lý nhiều phần tử cùng một lúc vì nhiều cơ chế song song công việc được chạy bất kỳ lúc nào, GPU có thể đáp ứng nhu cầu tính toán rất lớn của các đường ống dẫn đồ họa. Thứ hai, phần cứng của mỗi khung cảnh có thể được tùy chỉnh với phần cứng chuyên dụng cho công việc đã đưa ra Trang 4
  11. của nó, cho phép tính toán lớn hơn đáng kể và mức độ hiệu quả vượt qua giải pháp cho mục đích chung. Ví dụ, giai đoạn rasterization, cần tính thông tin bao phủ điểm ảnh của từng điểm ảnh tam giác đầu vào, hiệu quả hơn khi thực hiện trên phần ứng dụng. Theo các khung cảnh lập trình được (chẳng hạn như các chương trình vector và mảnh) thay thế khung cảnh cố định chức năng, các mục đích chuyên dụng, các thành phần cố định chức năng được đơn giản thay thế bằng thành phần lập trình được, nhưng nhiệm vụ tổ chức thực hiện song song không thay đổi. Kết quả là một đường ống GPU dài, có tính chất feed-forward có nhiều khung cảnh, mỗi khung cảnh thường tăng tốc cho một mục đích đặc biệt và thích hợp với phần cứng song song. Trong CPU, bất kỳ phép toán nào cũng có thể mất khoảng 20 chu kỳ hoạt động theo thứ tự tính từ lúc bắt đầu đến khi rời khỏi đường ống CPU. Trên GPU, một phép toán đồ họa cho trước có thể mất hàng ngàn chu kỳ từ khi bắt đầu đến khi kết thúc. Độ trễ của bất kỳ phép toán nào thường là lâu. Tuy nhiên, cơ chế song song tác vụ, dữ liệu từ khung cảnh này tới khung cảnh khác và giữa các khung cảnh tạo ra thông lượng cao. Bất lợi chính của đường ống GPU song song tác vụ là vấn đề cân bằng tải. Giống như bất kỳ đường ống nào, hiệu suất của đường ống GPU phụ thuộc vào khung cảnh chậm nhất của nó. Nếu các chương trình vector rất phức tạp và chương trình mảnh là đơn giản, tổng thể thông qua là phụ thuộc vào hiệu suất của các chương trình vector. Trong những ngày đầu của các khung cảnh lập trình được, tập chỉ thị của các chương trình vector và các chương trình mảnh khá khác nhau. Do đó, những khung cảnh này được tách biệt. Tuy nhiên, khi cả hai chương trình vector và chương trình mảnh trở nên đầy đủ tính năng và tập chỉ thị lệnh hội tụ như nhau, kiến trúc GPU xem xét lại đường ống song song tác vụ nghiêm ngặt trong lợi thế của kiến trúc đổ bóng hợp nhất (unified shader), trong đó tất cả đơn vị lập trình được trong đường ống chia sẻ một đơn vị phần cứng lập trình được duy nhất. Trong khi phần lớn các đường ống còn là song song tác vụ, các đơn vị lập trình bây giờ phân chia thời gian của nó giữa công việc vector, công việc mảnh và công việc hình học (với DirectX có bộ đổ bóng mười loại hình học khác nhau). Trang 5
  12. Các đơn vị này có thể khai thác cả hai cơ chế song song tác vụ và song song dữ liệu. Khi các bộ phận lập trình được của đường ống chịu trách nhiệm tính toán ngày càng nhiều trong các đường ống dẫn đồ họa thì kiến trúc của GPU chuyển từ kiến trúc song song tác vụ trong một đường ống nghiêm ngặt sang kiến trúc được phát triển xung quanh một đơn vị lập trình được theo cơ chế song song dữ liệu thống nhất. AMD giới thiệu các kiến trúc đổ bóng hợp nhất đầu tiên cho sản phẩm GPU Xenos GPU của nó trong Xbox 360 (2005). Ngày nay, cả GPU của AMD và NVIDIA đều có tính năng đổ bóng hợp nhất (unified shaders). Lợi ích cho người sử dụng GPU là cân bằng tải tốt hơn với chi phí cho phần cứng phức tạp hơn. Lợi ích cho người dùng GPGPU đã rõ ràng: Với tất cả nguồn lực lập trình được trong một đơn vị phần cứng duy nhất, lập trình viên GPGPU bây giờ có thể tiếp cận đơn vị lập trình được theo cách trực tiếp, hơn hẳn trước cách tiếp cận trước đây là phân chia công việc trên nhiều đơn vị phần cứng. I.5. So sánh GPU và CPU CPU là bộ vi xử lý trung tâm dùng để tính toán và xử lý các chương trình vi tính, dữ kiện và đóng vai trò điều phối hoạt động của các thiết bị khác. Còn GPU là bộ vi xử lý chuyên xử lý các dữ liệu về hình ảnh, đồ họa. Ngày nay cả CPU và GPU đều có những bước phát triển thần tốc, một GPU cao cấp có khả năng xử lý đạt tốc độ hàng tỷ phép tính trên giây ( TetaFLops /s). 0cho thấy số phần tử xử lý tính toán của GPU nhiều hơn hẳn CPU, giúp GPU có khả năng xử lý song song cực kỳ hiệu quả [2]. Hình 1.1. So sánh kiến trúc CPU và GPU Trang 6
  13. Sau đây là đồ thị so sánh khả năng xử lý floating-point giữa GPU và CPU được mô tả qua 0 Hình 1.2. So sánh floating-point của GPU và CPU Trang 7
  14. CHƯƠNG II: GIỚI THIỆU CÔNG NGHỆ CUDA II.1. Công nghệ CUDA CUDA là từ viết tắt của thuật ngữ Compute Unified Device Architecture, tạm dịch là kiến trúc thiết bị hợp nhất cho tính toán. CUDA bắt đầu xuất hiện từ tháng bảy năm 2007 với vai trò ban đầu là một bộ công cụ phát triển phần mềm dựa trên ngôn ngữ lập trình C. Bây giờ CUDA đang tiến hóa thành kiến trúc điện toán GPU, hay còn gọi là GPGPU của NVIDIA. CUDA có mặt trên hầu hết các GPU đời mới của NVIDIA, từ dòng GeForce giành cho giải trí đến Quadro giành cho điện toán hình ảnh chuyên nghiệp và dòng Tesla cho tính toán hiệu năng cao. Bộ phần mềm CUDA có các lớp mô tả trong hình 2.1 gồm: Bộ điều khiển (dirver) cho phần cứng, API lập trình, môi trường thực thi và hai thư viện toán học mức cao hơn của các hàm thường dùng: CUFFT và CUBLAS. Phần cứng được thiết kế để hỗ trợ bộ điều khiển hạng nhẹ và lớp môi trường thực thi. Từ đó cho tốc độ cao. Hình 2.1. Kiến trúc bộ phần mềm CUDA Trang 8
  15. Thư viện lập trình CUDA bao gồm các hàm mở rộng của ngôn ngữ C. CUDA cung cấp cách đánh địa chỉ DRAM thường dùng như mô tả trong hình 2.2 cho việc lập trình linh hoạt hơn, bao gồm cả thao tác cấp phát và thu hồi bộ nhớ. Từ góc độ lập trình, điều đó tương ứng với khả năng đọc và ghi dữ liệu tại bất kỳ địa chỉ nào trong DRAM, giống như CPU. Hình 2.2. Các thao tác thu hồi và cấp phát bộ nhớ CUDA có đặc tính lưu dữ liệu đệm song song, bộ nhớ chia sẽ trên bộ vi xử lý với tốc độ đọc ghi rất cao, các luồng dùng bộ nhớ này để chia sẻ dữ liệu với nhau. Như mô tả trong hình 2.3., ứng dụng có thể đạt kết quả tốt bằng cách tối thiểu việc lấy/trả dữ liệu từ DRAM. Từ đó giảm phụ thuộc băng thông truyền bộ nhớ DRAM. Trang 9
  16. Hình 2.3. Vùng nhớ dùng chung mang dữ liệu gần ALU hơn II.2. Ứng dụng của CUDA trong các lĩnh vực công nghệ II.2.1 CUDA cho ngành công nghiệp trò chơi Một trong những ứng dụng về sự thành công của công nghệ CUDA là trong ngành công nghiệp giải trí với lĩnh vực trò chơi. Hình ảnh trong trò chơi như thật là nhờ bộ công cụ PhysX SDK và khung hình làm việc có khả năng mở rộng động trên nhiều nền tảng có liên quan với nó gọi là APEX, cả hai đều do NVIDIA cung cấp. Đây là những công cụ đầy sức mạnh trong bộ các engine AXE, giành riêng cho vật lý trong trò chơi, hay nói cách khác, được thiết kế để xử lý các di chuyển phát sinh động và tương tác của các đối tượng trong từng cảnh của trò chơi. Vật lý trong trò chơi khiển cho tính năng đồ họa của một trò chơi trở nên sống động và chẳng bao lâu nữa chuyện hiển thị cảnh như phim với thời gian thực trong trò chơi sẽ trở thành hiện thực với sự hỗ trợ của PhysX và APEX. Bộ công cụ PhysX SDK hiện nay đã có trên hầu hết các nền tảng máy trò chơi thông dụng, từ XBOX 360 sang PlayStation 3 sang Wii rồi đến NVIDIA GPU, với hơn 150 tựa trò chơi mới trên thị trường. Trang 10
  17. II.2.2 CUDA cho các ứng dụng video số Có thể nói CUDA rất thành công trong với xử lý video. Rất nhiều ứng dụng video số hóa dựa trên CUDA, chẳng hạn như cải tiến chất lượng hình ảnh video với phần mềm vReveal của MotionDSP, mở rộng độ phân giải DVD với SimHD của ArcSoft. Một vài ví dụ trong số các ứng dụng hay này là vReveal đến từ MotionDSP là phần mềm cải thiện chất lượng hình ảnh như: Làm rõ nét, điều chỉnh độ tương phản và ổn định hóa (xóa run) các video. vReveal thường cần đến các hệ thống CPU đa bộ vi xử lý đắt tiền để hiển thị video một cách chậm chạp. Nhưng giờ đây với CUDA GPU đã có thể thực hiện nó theo thời gian thực đến khoảng năm lần nhanh hơn so với CPU. MotionDSP còn cung cấp một cung cấp một phiên bản cao cấp hơn, gọi là Ikenna, cho lĩnh vực tình báo và điều tra pháp luật. Trong thời gian gần đây, sự phát triển của những thiết bị di động có khả năng thu dữ liệu hình ảnh, video với chất lượng cao đã khiến con người thỏa mái hơn trong việc thưởng thức âm nhạc, phim, hình chụp cá nhân ở mọi lúc, mọi nơi. Tuy nhiên, phong cách giải trí mới trong cuộc sống hàng ngày sẽ không thể có được nếu không có những nỗ lực của riêng mình. Chẳng hạn như phải tốn nhiều thời gian để chuyển đổi nhạc, phim trong máy để bàn của mình sang chiếc iPod Touch yêu quý và ngược lại. Quá trình chuyển đổi đó hoàn toàn không đơn giản, nếu như chỉ là một người sử dụng máy tính bình thường. Trong trường hợp đó, phần mềm Badaboom của Elemental Technologies có thể giúp ích rất nhiều. Đó là bộ chuyển đổi media nhanh nhất và được thiết kế đầu tiên trên thế giới để chạy tối ưu với GPU và CUDA của NVIDIA. Khi so sánh bộ chuyển định dạng cuariTunes, Badaboom có thể nhanh hơn đến 20 lần hoặc tối thiểu cũng nhanh hơn hai đến ba lần ngay khi sử dụng CPU nhanh nhất và đắt tiền Core i7 của Intel. Trang 11
  18. II.3. Môi trường lập trình với CUDA Chương trình CUDA có thể hoạt động trên windows hoặc linux, tuy nhiên nó cần phải có các thư viện hỗ trợ do NVIDIA cung cấp gồm: driver cho GPU, CUDA Toolkit và bộ CUDA SDK. Các bước cài đặt thư viên hỗ trợ như bên dưới: Bước 1: Cài đặt driver Download từ trang (lưu ý phù hợp số serial của card) Cài mặc định vào C:\NVIDIA. Bước 2: Cài đặt CUDA toolkit Tiếp tục cài CUDA toolkit sau khi đã cài driver cho card như sau: download “NVIDIA_CUDA_Toolkit_1.0.exe” (hoặc mới hơn) ở trang web trên. Lưu ý chọn phiên bản 32 hay 64 bit cho phù hợp. Bước 3: Cài đặt CUDA SDK Tiếp tục download “NVIDIA_CUDA_SKD_1.0.exe” (hoặc mới hơn) cũng ở trang trên và kích đôi vào file này để cài đặt vào hệ thống, khi đó chương trình cài đặt tự động “Install Shied Wizard” sẽ được kích hoạt. Bước 4: Kiểm tra kết quả cài đặt Sau khi tiến hành cài đặt trình điều khiển thiết bị đồ họa cho GPU của NVIDIA, để kiểm tra kết quả cài đặt, bấm phím chuột phải trên màn hình desktop và chọn mục ‘NVIDIA Control Panel’. Trong trường hợp không quan sát thấy mục ‘NVIDIA Control Panel’ sau khi đã bấm phím chuột phải, quá trình cài đặt trình điều khiển thiết bị đã không được hoàn tất đúng cách và cần phải được tiến hành lại sau khi đã khởi động lại máy tính. Để kiểm tra phiên bản trình điều khiển đồ họa đã được cài đặt, chọn mục ‘System Information’ ở bên trái cuối cửa sổ hội thoại NVIDIA control panel, xuất hiện hộp thoại System Information như sau: Trang 12
  19. Ở phần item là nơi liệt kê các GPU của NVIDIA có trong hệ thống máy tính của người dùng. Hiện tại là GeForce 9500 GT. Tham số dirver version cho biết phiên bản của trình điều khiển đồ họa đã được cài đặt trên máy (257.51) và số lượng nhân CUDA có trong mỗi GPU kiểu GetForce 9500 (32 nhân). Bước 5: Cách thiết lập một dự án CUDA trên Microsoft Visual C++ 2012 Mở Microsoft Visual C++, vào menu “File->New->Project ” hộp thoại “New Project” hiển thị vào “Visual C++->Win32” sau đó chọn “Win32 Console Application”. Đặt tên cho dự án là “CudaStep1” và solution “CudaProgram”. Sau đó kích “OK->Next->Finish”. Cho đến thời điểm này đã có 1 dự án console nhưng chưa phải là dự án CUDA. Vào của sổ “Solution Explorer kích phải vào “Header Files->Add->New Item ” hộp thoại “Add new Item - CudaStep1” hiển thị. Tiếp theo vào ” Visual Trang 13
  20. C++-> Code” chọn “Header File(.h)” và đặt tên “CudaHeader.h” rồi kích Add. File này sẽ chứa thông tin về cấu hình của chương trình CUDA và prototype của các hàm kernel sẽ viết. Tiếp theo cần tạo file chứa mã nguồn cho một chương trình CUDA, file này sẽ có phần mở rộng là “.cu” tương tự như bước 2 vào cửa sổ “Solution Explorer kích phải vào “Header Files->Add->New Item ” hộp thoại “Add new Item- CudaStep1” hiển thị. Tiếp theo vào ” Visual C++->Utility” chọn “Text File (.txt)” và đặt tên là “CudaFunction.cu” rồi kích Add. II.4. 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 (hình 2.4.), cần thống nhất một số các khái niệm sau: Trang 14
  21. - 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. Hình 2.4. 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. II.5. Mô hình lập trình II.5.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 Trang 15