Đề tài này nhằm tìm hiểu môi trường tính toán hiệu năng cao trên bộ xử lý đồ họa sử dụng công nghệ CUDA của hãng nVidia, và bước đầu thử nghiệm thành công bài toán mô phỏng N-Body trên đ
Trang 2-
luËn v¨n th¹c sÜ khoa häc
NGHI£N CøU C¤NG NGHÖ TÝNH TO¸N TæNG QU¸T TR£N C¸C Bé Xö Lý §å HäA Vµ øNG DôNG TRONG BµI TO¸N M¤ PHáNG N-BODY
Trang 3sửa dưới mọi hình thức từ bất kỳ các đồ án nào đã có trước đó Các tài liệu tham khảo, thông tin tham khảo được lấy, trích dẫn từ các nguồn có thật, chính xác, không bịa đặt
Trang 4T óm tắt
Bài toán N-Body là một bài toán kinh điển, ứng dụng trong nhiều lĩnh vực của khoa học như vật lý, y sinh, thiên văn học, Trong bài toán mô phỏng này, khi số lượng Body mô phỏng trong bài toán là một số rất lớn, việc tính toán
tương tác trên tất cả các cặp N-Body mất rất nhiều thời gian (độ phức tạp trong
trường hợp tồi nhất O(N2)) Vì vậy chúng ta cần nghiên cứu một phương pháp mới nhằm tăng tốc độ tính toán của bài toán mô phỏng N-Body, đó là tận dụng sức mạnh tính toán của các bộ xử lý đồ họa
Đề tài này nhằm tìm hiểu môi trường tính toán hiệu năng cao trên bộ xử lý
đồ họa sử dụng công nghệ CUDA của hãng nVidia, và bước đầu thử nghiệm thành công bài toán mô phỏng N-Body trên đơn GPU, cũng như đưa ra một số
đề xuất giải thuật trên GPU cluster
Trang 5Abstract
N-body algorithms are applicable to a number of common problems in computational physics including gravitation, electrostatics, and fluid dynamics Fast algorithms (those with better than O(N2) performance) exist, but have not been successfully implemented on GPU hardware for practical problems In the present work, we introduce not only best-in-class performance for a all-pairs method, but a series of improvements that support implementation of this solver
on highly-data-parallel graphics processing units (GPUs) The greatly reduced computation times suggest that this problem is ideally suited for the current and next generations of single and cluster CPU-GPU architectures We believe that this is an ideal method for practical computation of large-scale turbulent flows
on future supercomputing hardware using parallel vortex particle methods
Trang 6MỤC LỤC
LỜI MỞ ĐẦU 6
CHƯƠNG 1 TÍNH TOÁN HIỆU NĂNG CAO VỚI GPU 9
1.1 Tính toán hiệu năng cao và vai trò ứng dụng trong thực tiễn 9
1.1.1 Thách thức tính toán hiệu năng cao trong khoa học và công nghệ 10
1.1.2 Giải pháp 11
1.2 Một số tiếp cận trong tính toán hiệu năng cao 12
1.2.1 Các hệ thống máy tính đa vi xử lý với mô hình lập trình song song chia sẻ bộ nhớ chung 12
1.2.2 Cụm máy tính với mô hình lập trình song song truyền thông điệp 14
1.2.3 Các bộ xử lý đồ họa với mô hình lập trình song song dữ liệu 15
CHƯƠNG II GIỚI THIỆU KIẾN TRÚC TESLA VÀ MÔ HÌNH LẬP TRÌNH SONG SONG CUDA 20
2.1 Giới thiệu kiến trúc phần cứng Tesla của Nvidia (Tesla Architecture) 20
2.2 Kiến trúc tính toán trên GPU Tesla và mô hình lập trình song song CUDA 21
2.2.1 Kiến trúc tính toán trên GPU Tesla 22
2.2.2 Mô hình lập trình song song CUDA 26
2.2.3 Những mặt hạn chế của CUDA 35
2.3 Thiết lập môi trường tính toán CUDA 36
2.3.1 Môi trường phân cứng 37
2.3.2 Bộ công cụ phát triển phần mềm 37
2.3.3 Quy trình cài đặt 38
CHƯƠNG III BÀI TOÁN MÔ PHỎNG N-BODY 39
3.1 Giới thiệu bài toán 39
3.2 Ứng dụng của bài toán N-Body 40
3.3 Các giải thuật với bài toán mô phỏng N-Body 41
3.3.1 Giải thuật tương tác hạt-hạt (The Particle-Particle (PP) method) 41
Trang 73.3.2 Giải thuật Barnes-Hut (The Barnes-Hut Algorithm) 41
3.3.3 Phương pháp đa cực nhanh (The Fast Multipole Method – FMM) 42
3.3.4 Giải thuật cây đa cực song song (Parallel Multipole Tree Algorithm – PMTA) 43
3.4 Tổng kết các giải thuật 44
CHƯƠNG IV MÔ PHỎNG N-BODY VỚI ĐƠN GPU 45
4.1 Mục đích mô phỏng N-Body trên GPU 45
4.2 Tính toán lực tương tác các cặp N-Body 46
4.3 Sự thực thi CUDA của giải thuật tất cả các cặp N-Body 48
4.3.1 Tính toán lực body - body 49
4.3.2 Tính toán tile 51
4.3.3 Xếp nhóm các tile vào trong các Thread Block 52
4.3.4 Định nghĩa một Grid của các Thread Block 55
4.4 Môi trường thử nghiệm bài toán 56
4.5 Cách thử nghiệm bài toán N-Body trên hệ thống 58
4.6 Các kết quả thực hiện 59
4.7 Sự tối ưu hóa 63
4.7.1 Gia tăng hiệu năng với lặp không cuộn (loop unrolling) 63
4.7.2 Hiệu năng tăng khi kích thước Block thay đổi 65
4.7.3 Cải thiện hiệu năng khi N nhỏ 66
4.8 Phân tích các kết quả thực hiện 69
4.9 Các phương pháp trước đây sử dụng GPU mô phỏng N-Body 69
4.10 Các phương pháp N-Body phân cấp 71
4.11 Kết luận 72
CHƯƠNG V XÂY DỰNG GIẢI THUẬT MÔ PHỎNG N-BODY VỚI ĐA GPU 74
5.1 Tính chất của các hệ thống tính toán đa GPU 74
5.2 Kiến trúc hệ thống GPU cluster 74
Trang 85.2.1 Cấu hình CPU/GPU 74
5.2.2 Cấu hình mạng 78
5.2.3 Phần mềm MPI 79
5.3 Thiết kế giải thuật mô phỏng N-Body trên hệ thống đa GPU 79
5.3.1 Sự thực thi song song đầu tiên 79
5.3.2 Giải thuật N-Body cho các hệ thống đa GPU 81
5.3.3 Tối ưu hóa giải thuật song song 82
5.4 Kết luận 84
CHƯƠNG VI KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 85
6.1 Kết luận 85
6.1.1 Những vấn đề đạt được 85
6.1.2 Những vấn đề chưa đạt được 85
6.2 Hướng phát triển 86
DANH SÁC H TÀI LIỆU THAM KHẢO 87
PHỤ LỤC 89
Trang 9LỜI MỞ ĐẦU
Trong vài năm gần đây, khái niệm tính toán thông dụng trên các bộ xử lý
đồ họa (GPGPU – General-Purpose Computing on Graphics Processing Units) thu hút được nhiều sự quan tâm từ các nhà nghiên cứu phương pháp tính toán khoa học Những lý do căn bản cho mối quan tâm này là:
• Hiệu năng tính toán của các bộ xử lý đồ họa (GPU) ngày càng vượt trội so với các bộ xử lý trung tâm truyền thống
• Các hãng sản xuất bộ xử lý đồ họa như nVidia, AMD liên tục đưa ra
những hệ thống phần mềm trung gian (middleware) và môi trường phát triển ứng dụng (trình dịch, trình gỡ rối,…) cho phép người phát triển dễ dàng xây dựng các ứng dụng phi đồ họa trên các bộ xử lý đồ họa này
• Giá thành cũng như các chi phí năng lượng cho hoạt động của các bộ xử lý
đồ họa thấp hơn nhiều so với các hệ thống máy tính cùng chỉ số hiệu năng
lý thuyết
Các GPU có khả năng Tính toán thông dụng như vậy có mặt ở khắp nơi, từ máy tính cơ quan cho tới trường học, đến máy tính nhà riêng của mọi người Sự phát triển rộng rãi về mặt số lượng của các GPU này dẫn đến một yêu cầu hết sức cấp bách và đầy thách thức đối với cộng đồng phát triển phần mềm (đặc biệt
là các phần mềm tính toán khoa học), đó là làm thế nào tận dụng được sức mạnh song song của các GPU đối với những phần mềm ứng dụng đang và sẽ được phát triển trong một vài năm nữa
Trong bối cảnh đó, tôi đã lựa chọn đề tài: “Nghiên cứu công nghệ Tính toán
Trang 10N-Body” để làm đồ án tốt nghiệp cao học của mình Bài toán N-Body là một bài toán kinh điển, ứng dụng trong nhiều lĩnh vực của khoa học như vật lý, y sinh, thiên văn học, Trong bài toán mô phỏng này, khi số lượng Body mô phỏng trong bài toán là một số rất lớn, việc tính toán tương tác trên tất cả các cặp N-Body mất rất nhiều thời gian (O(N2)) Vì vậy chúng ta cần nghiên cứu một
phương pháp mới nhằm tăng tốc độ tính toán của bài toán mô phỏng N-Body, đó
là tận dụng sức mạnh tính toán của các bộ xử lý đồ họa
Qua đề tài này, tôi đã tìm hiểu được môi trường tính toán hiệu năng cao trên
bộ xử lý đồ họa sử dụng công nghệ CUDA của hãng nVidia, và bước đầu thử nghiệm thành công bài toán mô phỏng N-Body
Nội dung luận văn bao gồm có 6 chương chính:
Ch ương 1: Tính toán hiệu năng cao với các bộ xử lý đồ họa
Ch ương 2: Kiến trúc Tesla và Môi trường lập trình song song CUDA
Ch ương 3: Bài toán mô phỏng N-Body
Ch ương 4: Mô phỏng N-Body với đơn GPU
Ch ương 5: Xây dựng giải thuật mô phỏng N-Body với đa GPU
Ch ương 6: Kết luận và hướng phát triển
Để hoàn thành đồ án tốt nghiệp “Nghiên cứu công nghệ Tính toán thông
dụng trên các bộ xử lý đồ họa và ứng dụng trong bài toán mô phỏng N-Body”,
tôi xin chân thành cảm ơn tới Tiến sỹ Nguyễn Hữu Đức – Thầy đã là người trực tiếp hướng dẫn và giúp đỡ tôi Tôi cũng xin gửi lời cảm ơn tới các thầy cô, các anh chị quản lý tại Trung tâm Tính toán hiệu năng cao, trường Đại học Bách
Trang 11Khoa Hà Nội, đã giúp đỡ và tạo điều kiện cho tôi rất nhiều trong thời gian tôi làm đồ án
Trang 12CH ƯƠNG I TÍNH TOÁN HIỆU NĂNG CAO VỚI GPU
Chương này nhằm mục đích giới thiệu về vai trò, mô hình tiếp cận, và các công nghệ trong tính toán hiệu năng cao, giải pháp và ứng dụng của chúng vào trong thực tiễn
1.1 Tính toán hiệu năng cao và vai trò ứng dụng trong thực tiễn
Trong các ngành khoa học như hóa học, vật lý hạt nhân, vũ trụ học, động học chất lỏng, sinh học, y học… những bài toán phức tạp đòi hỏi sự tính toán lớn luôn luôn được đặt ra Một số bài toán có độ phức tạp khá lớn tới mức khó có thể giải được trong một khoảng thời gian chấp nhận với các loại máy tính thông dụng ngày nay Vấn đề càng phức tạp khi các bài toán này đòi hỏi việc mô phỏng và hiển thị mô hình đồ họa Mặt khác yêu cầu về thời gian xử lý của bài toán cũng quan trọng không kém Ví dụ một bài toán dự báo thời tiết được giải trong hai ngày để có thể cho kết quả dự báo thời tiết trong một ngày là không có
ý nghĩa Chính yêu cầu về tính toán phức tạp này đã thúc đẩy các siêu máy tính
có khả năng tính toán mạnh ra đời và đi kèm với đó là các phương pháp giải
quyết các bài toán này trên các hệ thống siêu máy tính
Tính toán hiệu năng cao (High Performance Computing) là phương cách
giải quyết các bài toán lớn dùng các máy tính hiệu năng cao (siêu máy tính) Đây
là một hướng nghiên cứu cho cả các tổ chức nghiên cứu, các trường đại học và
cả các công ty vì nó đòi hỏi không chỉ ở giải pháp phần cứng mà cả ở phần mềm
để vận hành và khai thác hệ thống máy tính một cách hiệu quả cao, với chi phí thấp
Trang 131.1.1 Thách th ức tính toán hiệu năng cao trong khoa học và công nghệ
Sự đòi hỏi về sức mạnh tính toán của máy tính không ngừng tăng lên nhằm
để giải quyết các bài toán trong lĩnh vực khoa học và công nghệ Các vấn đề trong nhiều lĩnh vực đa số đều đưa về mô hình số và mô phỏng Tùy theo độ lớn
của bài toán cần giải quyết hay độ chính xác của kết quả bài toán mà khối lượng tính toán sẽ lớn đến mức nào Ví dụ như trong bài toán dự báo thời tiết bằng phương pháp số, để có kết quả dự báo chính xác thì ta phải giải bài toán trên một không gian rộng hơn và như thế số lượng phép tính cũng nhiều hơn
Trong thực tế còn nhiều bài toán có độ phức tạp rất lớn mà sức mạnh siêu máy tính hiện tại cũng chưa giải quyết được, vì vậy người ta gọi đây là các bài toán thách đố Hiện nay có rất nhiều lĩnh vực khoa học cần khoa học tính toán như hóa học, vật lý hạt nhân, khoa học vũ trụ, sinh học, y học… Khoa học tính toán giúp giải quyết nhiều vấn đề trên mô hình toán để tiên đoán trước kết quả
thử nghiệm và như vậy giúp rút ngắn quá trình thử nghiệm
Hình 1.1 Các ứng dụng tính toán hiệu năng cao
Trang 14Hình 1.1 đưa ra kết thống kê những ứng dụng phổ biến của tính toán hiệu năng cao được thực hiện bởi top500 Số lượng bài toán cần giải quyết bằng môi trường tính toán hiệu năng cao càng cho thấy sự cần thiết của sức mạnh tính toán trong các lĩnh vực khoa học và công nghệ
1.1.2 Gi ải pháp:
Nhằm đáp ứng yêu cầu tính toán trong khoa học và công nghệ, ba giải pháp
đã được đề nghị: (1) Tăng tốc độ tính toán của bộ xử lý, (2) Tìm một giải thuật tốt hơn để giải quyết, và (3) Sử dụng kỹ thuật xử lý song song Giải pháp (1) và (2) đòi hỏi nhiều thời gian để có kết quả cũng như có nhiều hạn chế Để giải quyết các bài toán có khối lượng tính toán lớn đòi hỏi một giải pháp mới, đó chính là giải pháp (3) Chính động lực này đã thúc đẩy việc ra đời các hệ thống máy tính có khả năng tính toán song song mạnh
Máy tính song song có nhiều bộ xử lý và các bộ xử lý này sẽ tham gia giải quyết các phần khác nhau của bài toán cùng lúc Như vậy thời gian giải quyết cho vấn đề sẽ được giảm đi Theo lý thuyết, nếu có n bộ xử lý thì thời gian giải
quyết vấn đề sẽ giảm đi n lần so với dùng một bộ xử lý Tuy nhiên, thời gian dài giải quyết trong thực tế sẽ lớn hơn thời gian tính toán trong lý thuyết do nhiều nguyên do Thứ nhất là ngoài thời gian xử lý trong bài toán thì còn thời gian đồng bộ và giao tiếp giữa các tác vụ song song Thứ hai là không phải bài toán
nào cũng có thể chia thành n phần nhỏ bằng nhau để giao cho các bộ xử lý
Nguyên do thứ hai phải giải quyết bằng cách xây dựng các giải thuật hợp lý và
có thể thực thi song song được Để giải quyết nguyên do thứ nhất thì ngoài việc
phải chú ý đến giải thuật giải quyết vấn đề, ta nên chú ý đến khả năng truyền dữ
liệu trong hệ thống máy tính Vậy hiệu quả của việc xây dựng một ứng dụng
Trang 15song song không chỉ phụ thuộc vào giải thuật giải quyết mà còn phụ thuộc nhiều vào hệ thống máy tính
1.2 Một số tiếp cận trong tính toán hiệu năng cao
1.2.1 Các h ệ thống máy tính đa vi xử lý với mô hình lập trình song song
chia s ẻ bộ nhớ chung
SMP (symmetric multiprocessor) là kiến trúc truyền thống trong việc xây dựng các hệ thống máy tính mạnh Kiến trúc này cho phép một hệ thống máy tính có thể chứa 2 hay nhiều bộ vi xử lý đồng nhất chia sẻ cùng một vùng bộ nhớ chung Các hệ thống SMP sử dụng một hệ điều hành duy nhất và lập trình viên thường sử dụng phương pháp lập trình đa luồng để tận dụng được tối đa sức
mạnh tính toán của hệ thống Ứng dụng được phân chia thành nhiều luồng công việc, mỗi luồng công việc này có thể được thực hiện trên một bộ xử lý và chúng
có thể trao đổi thông tin cho nhau thông qua một vùng bộ nhớ chia sẻ
Hai yếu tố cơ bản ảnh hưởng đến hiệu năng hoạt động của một hệ thống SMP: hiệu năng tính toán của các bộ xử lý, băng thông của bộ nhớ chia sẻ Hiệu năng tính toán của một hệ thống SMP được tính theo số lượng và hiệu năng tính toán của từng bộ xử lý đơn lẻ Thông số này đảm bảo năng lực tính toán tối đa
của hệ thống Tuy nhiên một ứng dụng hiếm khi tận dụng được tối đa năng lực tính toán của hệ thống Ngoài nguyên nhân liên quan tới thiết kế giải thuật song song (nguyên nhân khó có thể cải thiện bằng sự hỗ trợ kỹ thuật) thì độ trễ tính toán do băng thông truy nhập vào bộ nhớ chia sẻ thấp cũng là một lý do quan trọng ảnh hưởng tới hiệu năng ứng dụng trên các hệ thống SMP
Một ví dụ điển hình cho các hệ thống SMP chính là các máy tính cá nhân
với bộ vi xử lý đa lõi (Intel DualCore, Intel QuadCore,…) được sử dụng phổ
Trang 16biến hiện nay Tuy nhiên năng lực tính toán của các hệ thống máy tính cá nhân như vây chưa thật sự cao để thỏa mãn các nhu cầu tính toán trong công nghệ do
số lượng (cũng như hiệu năng) của các bộ xử lý dành cho máy tính cá nhân còn thấp
Hình 1.2 Siêu máy tính NEC SX9
NEC SX9 (hình 1.2) là một ví dụ khác về một hệ thống SMP Hệ thống có thể được xây dựng từ nhiều nút, mỗi nút có thể có tối đa 16 bộ xử lý với hiệu năng tối đa lên tới 1.6Tflops Bộ nhớ dành cho mỗi nút có thể lên tới 1TB với băng thông lên tới 4TB/s
Mặc dù có năng lực tính toán lớn, phù hợp nhiều ứng dụng thực tiễn, nhưng các hệ thống SMP như SX9 không thực sự phổ biến do chi phí sản xuất
và vận hành của những hệ thống này quá lớn và quan trọng nhất là tính khả mở của những hệ thống SMP thường thấp Hiện tại các kiến trúc máy tính khác như
kiến trúc phân cụm được ưa chuộng hơn so với SMP (điều này thể hiện ở tỷ lệ 83.4%/16.2% về các số lượng hệ thống cluster/SMP được thống kê vào tháng 11/2009)
Trang 171.2.2 C ụm máy tính với mô hình lập trình song song truyền thông điệp
Hệ thống tính toán song song phân cụm (Cluster) là các hệ thống máy tính song song được xây dựng từ các nút tính toán và thiết bị mạng thông dụng, mỗi nút tính toán hay các nút đóng vai trò điều khiển vào/ra là một hệ thống hoàn
chỉnh, có khả năng làm việc độc lập Hệ thống tính toán song song phân cụm là
một máy tính song song, trong đó:
• Các tài nguyên tính toán là bộ vi xử lý và bộ nhớ trong tại mỗi máy tính
• Các tài nguyên tính toán này có khả năng truyền thông và kết hợp với nhau thông qua cáp mạng Thường thì quy mô của hệ thống chỉ giới hạn trong một mạng cục bộ (LAN), trong đó có một máy tính đóng vai trò máy
chủ (server), các máy tính còn lại đón vai trò nút tính toán (computing node)
Hình 1.3 Mô hình m ột Cluster
Một hệ thống tính toán song song phân cụm rẻ hơn nhiều so với một siêu máy tính SMP cùng sức mạnh, điều này làm cho các hệ thống tính toán song
Trang 18song phân cụm ngày càng phổ biến và đặc biệt phù hợp cho các nước đang phát triển cũng như các trường đại học Tuy nhiên, các hệ thống tính toán song song phân cụm cũng có những hạn chế như: quá trình triển khai, cấu hình hệ thống tương đối phức tạp, hệ thống hoạt động không ổn định bằng các siêu máy tính,
và nhược điểm lớn nhất là vấn đề truyền thông giữa các nút tính toán Việc nghiên cứu nhằm nâng cao khả năng truyền thông là một trong những vấn đề quan trọng hàng đầu trong quá trình phát triển các cấu trúc, mô hình hệ thống phân cụm
Đối với các hệ thống tính toán phân cụm, phần mềm càng có vai trò quan
trọng hơn Chính các phần mềm đảm bảo cho hệ thống gồm nhiều máy tính riêng
lẻ có thể hoạt động ổn định và cộng tác hiệu quả
1.2.3 Các b ộ xử lý đồ họa với mô hình lập trình song song dữ liệu
Trong khi những nhà chế tạo CPU (bộ xử lý trung tâm) rất khó khăn trong
việc tìm ra giải pháp để nâng cao hiệu năng của CPU thì những nhà chế tạo GPU (bộ xử lý đồ họa) lại tiếp tục hưởng lợi từ định luật Moore Trong hình 1.4, sẽ
thể hiện sự gia tăng về số lượng phép tính dấu chấm động/giây và dải thông đạt được giữa các dòng card đồ họa của Nvidia và CPU Intel
Trang 19Hình 1.4 Bi ểu đồ số phép tính dấu chấm động trên giây và dải thông bộ nhớ
• GPGPU (General-Purpose computation on GPUs – Tính toán thông dụng trên các bộ xử lý đồ họa)
Một câu hỏi được đặt ra, vậy tại sao không thiết kế CPU giống như GPU để đạt được cải thiện hiệu năng cao như vậy? Câu trả lời rất đơn giản: CPU được thiết kế để đạt được hiệu năng tối đa từ việc xử lý một dòng nhiều lệnh mà những lệnh đó vận hành trên những lọai dữ liệu khác nhau (chẳng hạn như những phép tính số nguyên và phép tính dấu chấm động) và thực hiện truy cập
bộ nhớ, tính toán rẽ nhánh Để thực hiện tất cả công việc đó, CPU phải làm việc bằng cách trích xuất ra nhiều lệnh song song Nhưng vấn đề phát sinh ở đây
là giới hạn của việc xử lý những lệnh song song đó và việc tăng các đơn vị xử lý những lệnh song song là không hữu ích [2]
Trang 20Ngược lại, cách vận hành của GPU lại rất đơn giản Trước tiên là tập hợp các đa giác và điểm ảnh thành một nhóm, và sau đó các dữ liệu này sẽ được xử
lý hoàn toàn độc lập với nhau Điều này có nghĩa rằng GPU có thể dành hầu hết tài nguyên của nó để xử lý các dữ liệu này
Hình 1.5 GPU dành nhi ều transistor hơn để xử lý dữ liệu
Ngoài ra, GPU cũng khác CPU ở việc truy cập bộ nhớ Khi một điểm ảnh được đọc, ở những chu kỳ sau đó điểm ảnh láng giềng cũng sẽ được đọc, và khi một điểm ảnh được ghi thì ở những chu kỳ sau đó điểm ảnh láng giềng cũng được ghi Việc tổ chức bộ nhớ thông minh như vậy làm cho hiệu năng của bộ
nhớ cũng đạt gần như mức lý thuyết Điều này có nghĩa rằng đối với GPU không giống như CPU không cần phải có bộ nhớ đệm (cache) lớn, vì phần lớn bộ nhớ được sử dụng để tăng tốc xử lý texture (bề mặt) và một phần còn lại của bộ nhớ dùng để chứa những điểm ảnh sử dụng cho việc lọc
Trang 21Trong một khoảng thời gian dài CPU và GPU được thiết kế để làm những công việc phù hợp với khả năng của nó, chẳng hạn như CPU dùng để gõ văn bản
và duyệt web thì GPU dùng để tăng tốc xử lý đồ họa cũng như các trò chơi Nhưng đến thời điểm xuất hiện GPU NV30 của NVIDIA (GeForce FX 5800), GPU bắt đầu tham dự vào những công việc khác ngoài đồ họa như :
- Hỗ trợ tính toán dấu chấm động đơn
- Hỗ trợ tính toán lên đến cả ngàn lệnh
Vì thế đã nảy ra ý tưởng dùng GPU để xử lý những chương trình không thuộc đồ họa Vào năm 2003 bắt đầu xuất hiện khái niệm GPGPU (viết tắt của từ General-Purpose computation on GPUs - Tính toán thông dụng trên các bộ xử lý
đồ họa)
SC08 đánh dấu sự ra đời của siêu máy tính đầu tiên trên thế giới sử dụng
GPU làm công cụ tính toán phức tạp và các bài toán kinh tế Siêu máy tính này đến từ Tokodai (TiTech, Tokyo Institute of Technology), với tên gọi Tsubame,
hệ thống gồm 170 khối Tesla dạng 1U, với mỗi khối gồm 4 card Tesla, tổng cộng hệ thống có thêm 170 x 4 = 680 Tesla GPU, với cấu hình này Tsubame
Trang 22được xếp vào vị trí 29 trong bảng tổng sắp LINPACK Benmark, với khả năng tính toán có độ chính xác kép trên số thực là 77.48 TFLOP Với một kinh phí khiêm tốn, ít hơn rất rất nhiều lần so với hệ thống ban đầu, và với thời gian lắp đặt kỷ lục, Tsubame với Tesla chứng tỏ khả năng sử dụng GPU trong các hệ thống HPC là hoàn toàn hiện thực
Chính vì vậy mà chỉ sau khi NVIDIA cho ra đời CUDA vào tháng 2 năm
2007 đến nay, lập trình viên trên khắp thế giới đã nhanh chóng phát triển các ứng dụng song song trong rất nhiều lĩnh vực khác nhau, từ điện toán hóa học đến sắp xếp, tìm kiếm, rồi mô phỏng các mô hình vật lý, hay chẩn đoán y khoa, thăm dò
dầu khí, v.v… Những ứng dụng này có một đặc thù gọi là “có thể mở rộng quy
mô thực thi một cách trong suốt” (tiếng Anh gọi là “scalable transparently“)[4], nghĩa là sẽ phát huy hiệu năng một cách phù hợp trên các GPU từ 8 lõi (thấp nhất) đến hàng trăm lõi, mà không cần phải viết lại chương trình (hay nói cách khác là trong suốt với số lượng lõi có trong GPU trên môi trường thực thi cụ thể) Điều này thực hiện được nhờ sự phối hợp nhịp nhàng của 2 yếu tố phần cứng và
phần mềm trong công nghệ CUDA, đó là:
• Mô hình lập trình song song CUDA
• Kiến trúc phần cứng Tesla
Trong chương II, chúng ta sẽ cùng tìm hiểu rõ hơn về kiến trúc phần cứng Tesla, GPU Tesla và mô hình lập trình song song CUDA, một công nghệ mới với khả năng ứng dụng rất lớn vào thực tiễn trong vòng vài năm sắp tới
Trang 23CHƯƠNG II GIỚI THIỆU KIẾN TRÚC TESLA VÀ MÔ HÌNH
2.1 Gi ới thiệu kiến trúc phần cứng Tesla của Nvidia (Tesla Architecture)
Hiệu năng tính toán của những bộ vi xử lý
đồ hoạ (GPU) ngày càng tăng thậm chí vượt xa
so với các bộ xử lý CPU thông thường Để tận
dụng được khả năng tính toán này cho những
bài toán phi đồ họa, các nhà sản xuất cũng như
nghiên cứu đưa ra một khái niệm mới GPGPU
(General-Purpose Computation on GPUs –
Tính toán thông dụng trên các bộ xử lý đồ họa)
đó là việc sử dụng GPU để làm những công
việc trước kia là của CPU để tăng cường hiệu suất làm việc Làm thế nào để làm được việc đó? Làm thế nào để chương trình lập trình cho GPU có thể tương thích với nhiều bộ xử lý đồ họa khác nhau Để giải quyết vấn đề này, hãng NVIDIA phát triển một ngôn ngữ mới dựa trên C cho phép lập trình viên dễ dàng xây dựng ứng dụng tính toán thông dụng cho các GPU (mà ban đầu là các GPU dòng G80[8])
Để tiến thêm một bước xa hơn nữa, NVIDIA tung ra dòng sản phẩm có tên gọi Tesla (AMD/ATI cũng có dòng sản phẩm với khái niệm tương tự có tên gọi Stream) Tesla ban đầu dựa trên sức mạnh của GPU GeForce 8800 nhưng không tạo ra tín hiệu Video: chúng được dùng như các bộ xử lý chuyên dụng cho mục đích tính toán Các chương trình viết cho Tesla phải được dịch bằng CUDA, do
đó những người dùng thông thường không được hưởng những lợi ích từ công
Hình 2.1 Biểu tượng
Tesla
Trang 24nghệ này (khi cài đặt Tesla vào máy tính, hiệu suất hệ thống sẽ không tự động tăng lên) Tesla chỉ phù hợp với những ứng dụng nặng về tính toán và những tính toán này có thể song song hóa được Ví dụ những chương trình trong lĩnh vực: Vật lý, Tài chính, Y tế, Sinh học và Hoá học
Lập trình viên cũng không nhất thiết phải có Tesla mới có thể sử dụng được CUDA Họ có thể sử dụng bất kỳ Card màn hình nào thuộc dòng GeForce
8800 trở lên (và GTX200 hiện nay) Nếu nó làm việc tốt thì những nhà lập trình
có thể nghĩ về việc mua những hệ thống mạnh hơn đó chính là giải pháp Tesla
2.2 Ki ến trúc tính toán trên GPU Tesla và mô hình lập trình song song CUDA
Trong kỹ thuật xử lý đồ họa 3D, quá trình chuyển đổi một hình ảnh dạng ba chiều sang dạng điểm ảnh đòi hỏi các thao tác xử lý đồ họa điểm và đồ họa véc-
tơ Xử lý đồ họa véc-tơ là các thao tác trên véc-tơ căn bản như các điểm, đường
thẳng, và các hình tam giác Các thao tác này sử dụng các mô hình hình học và
việc tô trát trên các mô hình đó để hiển thị đồ họa hay nói cách khác đó là các thao tác truyền tải các hệ thống tọa độ, thiết lập các tham số kết cấu và ánh sáng
để hiển thị hình ảnh Xử lý đồ họa điểm ảnh là thao tác chuyển đổi hình ảnh từ
mô hình hình học sang các điểm ảnh và thể hiện chúng trên các lưới điểm ảnh đầu ra, thao tác thường thấy là phủ đầy các điểm ảnh bên trong hình ảnh nguyên
Trang 25hình học sang các điểm ảnh, sau đó mới được hiển thị ở đầu ra), bộ lọc kết cấu
có độ chính xác thấp hơn…Và bình thường GPU phải xử lý nhiều điểm ảnh hơn các véc-tơ (với tỷ lệ 3:1) Rồi khả năng tăng cường tính phổ biến của GPU như tăng cường các thiết kế phức hợp, vùng miền, giá thành của hai cách xử lý riêng
biệt Thêm đó là khả năng tính toán phức hợp (lập trình được), và GPU loại này đang được lựa chọn với tỷ lệ nhiều hơn so với lựa chọn các GPU có các bộ xử lý không lập trình được, chính những điều này là động cơ thúc đẩy của kiến trúc xử
lý Tesla
2.2.1 Ki ến trúc tính toán trên GPU Tesla
Được NVIDIA giới thiệu vào tháng 11 năm 2006, kiến trúc tính toán và đồ họa
hợp nhất Tesla đã phát triển, gia tăng đáng kể về số lượng so với các GPU đồ họa không lập trình được Khả năng xử lý đa luồng với số lượng luồng thực thi cực lớn khiến kiến trúc này trở nên một nền tảng hiệu quả cho cả những ứng
dụng tính toán đồ họa và ứng dụng tính toán song song thông thường trên GPU
Hình 2.2 Ki ến trúc của 1 card NVIDIA Tesla GPU với 112 lõi xử lý
Trang 26Kiến trúc Tesla được xây dựng xung quanh một mảng có thể mở rộng của các SM (streaming multiprocessors – đa xử lý dòng lệnh) Mỗi SM chứa 8 lõi xử
lý vô hướng SP Những GPU theo kiến trúc này có thể thực hiện từ 768 cho tới
12288 luồng thực thi đồng thời Với sự hỗ trợ của môi trường phát triển ứng
dụng CUDA, các GPU này cho phép lập trình viên mở rộng quy mô thực thi song song một cách trong suốt (số luồng không phụ thuộc vào năng lực thực sự của GPU) [3]
Hình 2.2 trình bày một GPU với 14 SMs - tương đương với 112 lõi SP (streaming processor), kết nối liên thông với 4 mô đun bộ nhớ DRAM bên ngoài
Một chương trình CUDA chia ra hai phần riêng biệt, phần thực thi trên CPU, và
phần thực thi trên GPU Khi một chương trình CUDA trên CPU gọi một kernel (đơn vị chương trình được viết để thực thi trên GPU) kernel này sẽ được thực hiện N lần song song với nhau bởi N luồng CUDA khác nhau N luồng này được
tổ chức thành một lưới bao gồn nhiều khối (block), mỗi khối gồm nhiều luồng Khi kernel được gọi, đơn vị phân phát công việc tính toán, gọi tắt là CWD (Compute Work Distribution) sẽ liệt kê các khối của lưới và bắt đầu phân phối các khối này tới các SM sẵn sàng thực thi (sẵn sàng chạy) Các luồng trong một khối được thực hiện đồng thời trên một SM Khi các khối kết thúc, đơn vị CWD
sẽ thực thi các khối mới trên các bộ xử lý rảnh rỗi cho tới khi toàn bộ khối trong lưới được thực thi thành công
Một SM có chứa 8 lõi xử lý vô hướng SP – scalar processor (SP), 2 đơn vị chức năng đặc biệt – special function units (SFUs), dành cho tính toán siêu việt,
1 đơn vị điều hướng đa luồng – multithreaded instruction unit (MTIU), và 1 bộ nhớ chia sẻ trên nó (on-chip shared memory) SM đảm nhiệm việc tạo, quản lý,
và thực hiện tới 768 luồng đồng thời trên phần cứng mà không tốn kém chi phí
Trang 27lập lịch Nó có thể thực thi 8 block CUDA nhiều lần trong cùng một thời điểm
SM còn cung cấp rào chắn CUDA syncthreads(), rào chắn này có tác dụng đồng bộ hóa các luồng bên trong SM với một lệnh đơn Chính xác hơn, khi một điểm đồng bộ hoá đặc biệt trong kernel gọi syncthreads(), syncthreads() hành động như một rào chắn, nó yêu cầu tất cả các luồng trong khối phải đợi trước khi nó được phép xử lý
Để quản lý hàng trăm luồng chạy trong nhiều
ứng dụng khác nhau, Tesla SM sử dụng một kiến trúc
mới gọi là “đơn dòng lệnh đa luồng” – SIMT
(Single-Instruction, Multiple-thread) SM ánh xạ mỗi luồng
tới một lõi vô hướng SP, và các luồng vô hướng sẽ
chạy độc lập với nhau với địa chỉ tập lệnh và trạng
thái thanh ghi riêng của nó Đơn vị SM SIMT tạo,
quản lý, sắp xếp và thi hành các luồng trong một
nhóm gồm 32 luồng song song được gọi là warps
Các luồng riêng lẻ săp xếp theo trật tự thành một tập
hợp warp khởi động cùng nhau tại cùng một địa chỉ chương trình nhưng tự do rẽ nhánh và thực thi một cách độc lập Mỗi SM quản lý một nhóm gồm 24 warp với
32 luồng trên mỗi warp, và tổng cộng có 768 luồng
Các lệnh được đưa ra cùng một thời điểm, đơn vị SIMT sẽ lựa chọn một warp đã sẵn sàng thực hiện và đưa ra lệnh tiếp theo tới các luồng đã được chuẩn
bị trong warp Một warp thực thi một lệnh chung tại một thời điểm, do vậy hiệu
quả cao nhất thu được khi cả 32 luồng trong một warp phù hợp với nhau về đường dẫn thực thi của chúng Nếu các luồng của một warp phân rẽ qua một dữ
liệu phụ thuộc điều kiện rẽ nhánh, thì warp sẽ thi hành từng nhánh đường dẫn lấy
Trang 28được, vô hiệu hóa các luồng mà không ở trên đường dẫn đó, và khi tất cả các đường dẫn được hoàn thành, các luồng hội tụ trở lại để thực hiện trong cùng một đường dẫn Sự rẽ nhánh xảy ra chỉ trong một warp, các warp khác nhau thực thi độc lập với nhau và không chú ý tới chúng đang thực thi một đường dẫn chung
hoặc đường dẫn đoạn mã rời rạc Và như là một kết quả, kiến trúc GPU Tesla đột nhiên trở nên mềm dẻo và hiệu quả hơn trên các nhánh mã so với các GPU trước đây, như các warp 32 luồng của chúng bị hạn chế nhiều hơn so với độ rộng SIMD (Single-Instruction Multiple-Data) của các GPU trước kia
Kiến trúc SIMT gần giống như với cấu trúc véc-tơ SIMD mà trong đó một
lệnh điều khiển nhiều quá trình xử lý các phần tử Một điều then chốt khác là cấu trúc véc-tơ SIMD chỉ ra sự song song hóa ở mức dữ liệu trong chương trình, trong khi các lệnh SIMT định rõ việc thực thi và trạng thái phân nhánh của một luồng đơn Trái ngược với các véc-tơ SIMD, SIMT cho phép lập trình viên viết đoạn mã lệnh song song phân cấp các luồng một cách độc lập, các luồng vô hướng, cũng như là đoạn mã song song dữ liệu dành cho phối hợp các luồng
Lập trình viên có thể về căn bản bỏ qua động thái SIMT, tuy nhiên, chắc chắn hiệu năng có thể được nhận thấy bởi việc quan sát đoạn đoạn mã ít khi yêu cầu các luồng trong warp phân rẽ Trong thực tế, nó tương tự như vai trò của các dòng đệm trong các đoạn mã truyền thống: kích thước dòng đệm có thể bỏ qua
một cách an toàn khi thiết kế với tính đúng đắn nhưng phải được xem xét trong cấu trúc đoạn mã khi thiết kế cho hiệu năng tối đa Các kiến trúc véc-tơ, theo một hướng khác, yêu cầu phần mềm kết hợp một khối để load trong các véc-tơ
và điều khiển sự phân rẽ một cách thủ công
Một biến luồng thường lưu trú trong các thanh ghi đang sống Bộ nhớ chia
sẻ 16Kb SM có độ trễ truy cập thấp và dải thông cao tương tự như bộ nhớ đệm
Trang 29L1, nó giữ các biến CUDA shared trên khối để dành cho việc kích hoạt các
khối luồng SM cung cấp việc nạp/lưu trữ các lệnh để truy cập biến CUDA device trên GPU có bộ nhớ DRAM gắn ngoài Nó kết hợp thành một khối truy cập riêng rẽ của các luồng song song trong cùng một warp và ở trong vài truy cập khối bộ nhớ khi các địa chỉ rơi vào trong cùng một bkhối và gặp các tiêu chuẩn liên kết Bởi vì độ trễ của bộ nhớ chung có thể tới hàng trăm xung nhịp xử
lý, để tối ưu, các chương trình CUDA thường copy dữ liệu tới bộ nhớ chia sẻ khi
dữ liệu này được truy cập nhiều lần bởi một khối luồng Tesla nạp/lưu trữ các lệnh bộ nhớ sử dụng địa chỉ là các byte số nguyên để thuận tiện cho trình biên
dịch chuyển đổi tối ưu các đoạn mã Luồng đếm trong mỗi SM, cũng như việc
hỗ trợ cho nhiều yêu cầu nạp còn tồn tại, giúp đỡ che phủ độ trễ trong việc nạp
và sử dụng tới các bộ nhớ DRAM gắn ngoài Kiến trúc GPU Tesla mới nhất cũng cung cấp các lệnh bộ nhớ đọc-sửa-ghi nguyên tố, thuận tiện cho sự giảm
bớt song song và quản lý cấu trúc song song dữ liệu
Các ứng dụng CUDA thực hiện tốt trên các GPU kiến trúc Tesla bởi vì mô hình song song CUDA, sự đồng bộ, các bộ nhớ chia sẻ, và phân cấp của các nhóm luồng ánh xạ hiệu quả tới các chức năng của kiến trúc GPU
2.2.2 Mô hình l ập trình song song CUDA
CUDA mở rộng từ ngôn ngữ lập trình C, cho phép các nhà lập trình định nghĩa các hàm trên C, được gọi là các kernel, chúng được thực thi song song tại cùng thời điểm bởi N tham chiếu tới các luồng CUDA, giống như các hàm C thông thường
Trang 30Một kernel được định nghĩa sử dụng một tham số mô tả _global_ và số các luồng CUDA cho mỗi lời gọi chúng được chỉ rõ bằng việc sử dụng một cú pháp mới: <<< >>>
global void vecAdd(float* A, float* B, float* C)
Trang 31Mỗi luồng thực thi hàm vecAdd() sẽ tính một phép cộng hai phần tử tại vị trí I tương ứng với chỉ số luồng threadIdx
• Sự phân cấp luồng
Để thuận lợi, CUDA thiết kế threadIdx như là một vector 3 thành phần (.x,.y,.z), do đó người lập trình có thể quyết định xây dựng các luồng trong một khối như là các mảng 1 chiều, hai chiều hay ba chiều Trong ví dụ sau, đoạn mã thực hiện phép cộng 2 ma trận A và B có kích thước NxN và kết quả được lưu vào ma trận C:
global void matAdd(float A[N][N], float B[N][N], float C[N][N])
Trang 32Các luồng thuộc về một khối có thể cùng hợp tác tính toán bằng xử lý trên vùng dữ liệu chia sẻ tương ứng với chỉ số luồng, và khi cần truy đồng bộ hóa dữ liệu chúng có thể sử dụng hàm syncthreads() để đảm bảo các tác vụ trước rào chắn phải được hoàn tất trước khi tiếp tục xử lý
Số luồng mỗi khối bị hạn chế bởi giới hạn nguồn tài nguyên bộ nhớ của lõi bộ vi xử lý Với kiến trúc Tesla của NDIVIA, một khối có thể chứa tới 512 luồng Tuy nhiên, một kernel có thể được thực thi nhiều hơn số lượng luồng trong 1 khối bằng cách tổ chức các luồng thành nhiều khối Các khối có thể được
tổ chức vào trong lưới một chiều hoặc 2 chiều của một lưới, được minh hoạ như hình 2.3 dưới đây
Trang 33Hình 2.3 Lưới các Luồng Blocks
Chiều của lưới được chỉ rõ bởi tham số đầu tiên của ký pháp <<<…>>>
Vị trí mỗi khối trong một lưới được quy định bởi chỉ số một chiều hoặc hai chiều blockIdx Chiều của block có thể truy cập thông qua biến blockDim Đoạn mã ví
dụ trước đây trở thành:
global void matAdd(float A[N][N], float B[N][N], float C[N][N])
{
Trang 34int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
Trang 35nhập được từ tất cả các luồng trong khối Cuối cùng, tất cả các luồng có thể cùng truy cập tới cùng bộ nhớ tổng thể
Ngoài các không gian nhớ kể trên, các GPU Tesla cũng có thêm hai dạng không gian nhớ chỉ đọc, có thể truy nhập được từ mọi luồng: bộ nhớ texture, và
bộ nhớ hằng số
Trang 36Hình 2.4 Kiến trúc bộ nhớ
• Host và Device
Như được minh hoạ trong hình 2.5, CUDA giả thiết rằng các luồng CUDA được thực thi trên một thiết bị vật lý riêng biệt (device) song hành với chương trình chạy trên bộ xử lý trung tâm (CPU) Trong ví dụ, khi các kernel thực thi trên một GPU thì phần còn lại của chương trình C chạy trên CPU
CUDA cũng giả thiết rằng cả host và device có bộ nhớ DRAM riêng, được tham chiếu tới như bộ nhớ host và bộ nhớ device Các kernel chỉ được phép truy nhập trong vùng bộ nhớ device trong khi các đoạn mã thực thi trên CPU chỉ truy nhập được vùng bộ nhớ host CUDA cung cấp các phương tiện để chuyển dữ liệu qua lại giữa hai vùng bộ nhớ này
Trang 37Hình 2.5 Chương trình không đồng nhất: mã thực thi trên host tuần tự trong khi
mã thực thi trên device song song
Trang 38• Xếp chồng phần mềm (Software Stack)
Các lớp phần mềm của CUDA được cấu thành từ một số thành phần như được minh hoạ bởi hình 2.6: một device driver, một giao diện lập trình ứng dụng (API) và thực thi, và các thư viện toán học mức cao dùng chung như CUFFT và CUBLAS
Hình 2.6 Kiến trúc phần mềm của CUDA
2.2.3 Nh ững mặt hạn chế của CUDA
Một vấn đề quan trọng đối với các lập trình viên CUDA là phải nắm vững được những hạn chế của kiến trúc này để có thể tối ưu hóa được ứng dụng
Trang 39Trước tiên, các luồng và các khối được tạo bởi lời gọi tới một kernel duy
nhất, do đó song song hóa dữ liệu là mô hình thiết kế hiệu quả các ứng dụng trên GPU Các công việc được nhóm thành lưới của các khối luồng, và các khối luồng này độc lập với nhau Sự độc lập này cho phép CUDA xây dựng một bộ
lập lịch đơn giản mà không tạo ra các chi phí hiệu năng dư thừa Tuy nhiên cũng chính sự độc lập giữa các khối lại gây khó khăn đối với người lập trình vì các kernel không thể tạo ra được những rào chắn vượt qua biên giới của khối (ví dụ không đồng bộ được các luồng nằm trong các khối khác nhau) Trong trường hợp lập trình viên muốn tổng hợp các kết quả được tạo ra bởi nhiều khối, các
khối này nói chung phải được thực thi bằng cách chạy kernel trên các lưới khác nhau Nhiều khối có thể phối hợp công việc của chúng với nhau sử dụng các thao tác nguyên tử trên bộ nhớ dùng chung
Các kernel của CUDA không hỗ trợ lời gọi hàm đệ qui Đệ qui khó thực
hiện trong nhân song song bởi vì mỗi luồng có thể tạo ra một stack riêng và bộ
nhớ dành cho stack của hàng chục nghìn luồng trở nên qua lớn Lập trình viên do
vậy phải thay thế các giải thuật đệ quy bằng các mô hình song song lồng nhau
Để hỗ trợ một kiến trúc không đồng nhất bao gồm một CPU và một GPU, với mỗi hệ thống bộ nhớ riêng của chúng, các chương trình CUDA phải được copy dữ liệu và các kết quả giữa bộ nhớ host (CPU) và bộ nhớ thiết bị (GPU)
2.3 Thi ết lập môi trường tính toán CUDA
Để có thể chạy được các chương trình CUDA, chúng ta cần có một môi trường phù hợp, hỗ trợ cho CUDA cả về phần cứng và môi trường phần mềm
Trang 402.3.1 Môi trường phần cứng
Vì các ứng dụng CUDA được viết để chạy trên các GPU của Nvidia, nên điều kiện đầu tiên là phải có một GPU mà tính năng CUDA trên đó được thiết lập sẵn Hiện náy các dòng GPU thiết lập sẵn CUDA bao gồm các dòng[8]:
• GeForce 8, 9, 100, 200 Bộ nhớ nhỏ nhất trên các GPU này là 256Mb
• Các GPU Tesla như S870, D870, C870, C1060, C1070
• Các GPU Quadro FX
Các thành phần phần cứng còn lại cấu hình tối thiểu để chạy các ứng dụng CUDA có thể là như sau:
- 1.6 GHz Intel or AMD dual core CPU
- NVIDIA GeForce 8 series or later CUDA enabled GPU
- Windows XP/Vista 32-bit or 64-bit
- Linux 32 or 64-bit
2.3.2 B ộ công cụ phát triển phần mềm
Bộ công cụ phát triển CUDA của NVIDA gồm có 3 thành phần bao gồm[8]:
1 Driver CUDA mới nhất
2 Một bộ Toolkit CUDA bao gồm:
- nvcc C compiler
- CUDA FFT and BLAS libraries for the GPU
- Profiler