3 - Cài đặt một số bài toán tính toán và mô phỏng tiêu biểu trên thiết bị xử lý đồ họa GPU bằng ngôn ngữ lập trình CUDA, qua đó đánh giá hiệu năng của các thiết bị này so với thuật toán
Trang 1MỤC LỤC
DANH MỤC CHỮ VIẾT TẮT
DANH MỤC HÌNH VẼ
MỞ ĐẦU 1
CHƯƠNG 1 5
TỔNG QUAN VỀ GPGPU 5
1.1 Card đồ họa và các khối xử lý đồ họa 5
1.1.1 Sự phát triển của đồ họa và các loại card đồ họa 5
1.1.2 Đường ống biểu diễn đồ họa 11
1.1.3 Các loại card đồ họa GPGPU hiện đại 14
1.1.3.1 Cấu trúc của các card đồ họa GPGPU 15
1.1.3.2 Công nghệ NVidia CUDA 16
1.1.3.3 Công nghệ ATI Stream và OpenCL 18
1.2 Tính toán thông dụng trên khối xử lý đồ họa GPGPU [3] 20
1.2.1 Lập trình GPU cho đồ họa 21
1.2.2 Lập trình GPU cho mục đích tính toán thông dụng 21
1.2.3 Môi trường phần mềm 23
1.3 Một số bài toán phù hợp với GPGPU 25
1.3.1 Những bài toán cơ bản phù hợp cho GPU 25
1.3.2 Mô phỏng hệ thống phức 26
1.3.3 Khai phá dữ liệu và học máy với dữ liệu lớn 27
1.3.4 Xử lý ảnh và thị giác máy tính 28
1.3.5 Các thuật toán số học, các thuật toán và cấu trúc dữ liệu song song 29
CHƯƠNG 2 31
CÔNG NGHỆ NVIDIA CUDA 31
VÀ TÍNH TOÁN SONG SONG TRÊN BỘ XỬ LÝ ĐỒ HỌA GPGPU 31
2.1 Công nghệ NVIDIA CUDA 31
2.1.1 NVidia CUDA là gì? 31
2.1.2 Cấu trúc của CUDA 34
2.1.3 Xử lý trên GPU 36
2.1.4 Các loại bộ nhớ của GPU 37
2.1.5 Nâng cao hiệu năng tính toán 40
2.2 Lập trình song song với CUDA [8] 41
Trang 22.2.1 CUDA là mở rộng của ngôn ngữ lập trình C 41
2.2.2 Những mở rộng của CUDA so với ngôn ngữ lập trình C 42
2.2.3 Từ khóa phạm vi kiểu hàm 42
2.2.4 Từ khóa phạm vi kiểu biến 44
2.2.5 Cấu hình thực thi 45
2.2.6 Các biến Built-in 46
2.2.7 Các lệnh điều khiển 46
2.2.8 Các lệnh với bộ nhớ 47
2.2.9 Biên dịch chương trình với NVCC 52
2.3 Một số ví dụ tính toán song song với CUDA 53
2.3.1 Bài toán sắp xếp nhanh 53
2.3.2 Bài toán nhân ma trận 55
2.3.3 Bài toán chuyển đổi Fourier 57
2.3.4 Bài toán phân cụm K-Means 58
CHƯƠNG 3 62
MÔ PHỎNG SONG SONG SỬ DỤNG KHỐI ĐỒ HỌA GPGPU 62
3.1 Mô phỏng N-Body 62
3.1.1 Giới thiệu bài toán 62
3.1.2 Cài đặt và thử nghiệm 64
3.2 Mô phỏng chất lưu 65
3.2.1 Giới thiệu bài toán 65
3.2.2 Cài đặt và thử nghiệm 70
3.3 Mô phỏng hệ hạt [14, 20, 21] 71
3.3.1 Giới thiệu bài toán 71
3.3.2 Cài đặt và thử nghiệm 78
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 79
DANH MỤC TÀI LIỆU THAM KHẢO 80
Trang 3DANH MỤC CHỮ VIẾT TẮT
GPGPU General Purpose computing on Graphics Processing Unit CUDA Compute Unified Device Architecture
DVST Direct View Storage Tube
GUI Graphical User Interface
ALU Arithmetic and Logic Unit
API Application Programming Interface
SIMT Single Instruction, Multiple Threads
SM Streaming Multi Processor
SPMD Single Program Multiple Data
FEA Finite Element Analys
ODE Ordinary Differential Equation
Trang 4DANH MỤC HÌNH VẼ
Hình 1.1 Khung dây hình cầu .5
Hình 1.2 Đồ họa quét mành 7
Hình 1.3 Hình cầu được tô bóng theo Gouraud 8
Hình 1.4 Ấm trà Utah được tô bóng 8
Hình 1.5 Hình ảnh một ngôi nhà sử dụng Blender3D 9
Hình 1.6 So sánh GFlops giữa GPU và CPU 11
Hình 1.7 Lược đồ ống dẫn đồ họa 13
Hình 1.8 Sơ đồ cấu trúc của CPU và GPU 15
Hình 1.9 Sơ đồ kiến trúc thiết bị hơp nhất của một card đồ họa Nvidia 16
Hình 1.10 Sơ đồ cấu trúc OpenCL 19
Hình 1.11 Cấu trúc thiết bị Stream của ATI 20
Hình 2.1 Kiến trúc bộ phần mềm NVidia CUDA 35
Hình 2.2 Các thao tác thu hồi và cấp phát bộ nhớ với CUDA 36
Hình 2.3 Vùng nhớ dùng chung mang dữ liệu gần ALU hơn 36
Hình 2.4 Phân cấp luồng CUDA 39
Hình 2.5 Bộ đa xử lý dòng 40
Hình 2.6 Luồng làm việc SIMT 40
Hình 2.7 Cấu trúc bộ nhớ thiết bị GPU 41
Hình 2.8: Hiệu năng sắp xếp nhanh nhờ sử dụng GPU so với sử dụng CPU 58
Hình 2.9 Thời gian thực hiện nhân ma trận sử dụng CPU so với sử dụng GPU 60
Hình 2.10: Thời gian thực hiện chuyển đổi Fourier sử dụng GPU so với CPU 62
Hình 2.11 So sánh thời gian tính toán k-means giữa GPGPU và CPU 65
Hình 3.1 Hình ảnh mô phỏng N-body 71
Hình 3.2 So sánh hiệu năng mô phỏng N-Body giữa GPU và CPU 73
Trang 5Hình 3.3 Lưới vận tốc của chất lưu (Mô phỏng trạng thái chất lưu được biểu
di ễn trên một lưới kích thước MxN Các mũi tên thể hiện vận tốc) 74
Hình 3.4 Sự di chuyển của chất lưu 77
Hình 3.5 Kết quả mô phỏng đám mây sử dụng động lực học chất lưu 78
Hình 3.6 Kết quả mô phỏng động lực học chất lưu 79
Hình 3.7 Mô phỏng hạt sử dụng GPU 79
Hình 3.8 Một hệ hạt được sử dụng để mô phỏng đám cháy 79
Hình 3.9 Một hệ hạt được sử dụng để mô phỏng thiên hà 83
Hình 3.10 Một hệ hạt được sử dụng để mô phỏng vụ nổ bom 84
Hình 3.11 Lưới đồng nhất sử dụng các phép toán nguyên tử 85
Trang 6mô hình hóa, tự động, điều khiển học… và đặc biệt là công nghệ thông tin Công nghệ mô phỏng ngày càng được sử dụng rộng rãi trong mọi lĩnh vực hoạt động của con người từ mô phỏng các vụ nổ hạt nhân, phản ứng hóa học đến mô phỏng các cơn bão và thảm họa thiên nhiên như động đất, lũ lụt;
từ mô phỏng trong nghiên cứu, phát triển khoa học, công nghệ đến ứng dụng
mô phỏng trong lĩnh vực giáo dục, đào tạo Một chương trình máy tính có thể
mô phỏng diễn biến điều kiện thời tiết, các mạch điện tử, phản ứng hóa học,
cơ điện tử, hệ thống điều khiển tương tác, thậm chí cả các quá trình sinh học cực kỳ phức tạp Về lý thuyết, bất kỳ sự vật, hiện tượng nào có thể được mô
tả bằng dữ liệu và phương trình toán học đều có thể được mô phỏng trên máy tính Mô phỏng thường là rất khó khăn vì hầu hết các hiện tượng tự nhiên có
số lượng gần như vô hạn các tham số gây ảnh hưởng Vì vậy để phát triển các ứng dụng mô phỏng có hiệu quả cần xác định những yếu tố quan trọng nhất ảnh hưởng đến mục tiêu của nhiệm vụ mô phỏng
Tuy nhiên các bài toán mô phỏng trong thời gian thực thường rất phức tạp và luôn đòi hỏi một khối lượng tính toán vô cùng lớn Để giảm thời gian tính toán mô phỏng, ngoài việc cải tiến về mặt thuật toán thì việc tăng hiệu năng của các thiết bị tính toán cũng rất quan trọng
Hiện nay việc tăng tốc độ của CPU đã chạm tới ngưỡng tối đa vì ở tốc
độ cao, nhiệt độ CPU cũng tăng cao trong khi các giải pháp tản nhiệt đã đến mức giới hạn, không thể đáp ứng được khả năng làm mát CPU Trước tình
Trang 72
hình đó các nhà nghiên cứu vi xử lý đã chuyển hướng sang phát triển công nghệ đa lõi với cơ chế xử lý song song trong các máy tính Trong những năm gần đây, một trong những hướng nghiên cứu nhiều tiềm năng là sử dụng chip
đồ họa GPU và công nghệ xử lý song song CUDA do hãng NVIDIA phát triển nhằm tăng tốc độ xử lý, nâng cao hiệu quả của thuật toán
Việc tăng tốc trong quá trình tính toán không những đòi hỏi những thiết
bị GPU có khả năng xử lý tốc độ cao với dữ liệu khổng lồ mà cần phải có những giải thuật song song hữu hiệu
Xuất phát từ nhu cầu trên tôi chọn đề tài: “Mô phỏng song song sử dụng khối xử lý đồ họa GPGPU”
Mục đích của đề tài là nghiên cứu một số bài toán tính toán và mô phỏng song song trên khối xử lý đồ họa GPGPU:
- Tìm hiểu cơ sở lý thuyết về cấu trúc hệ thống xử lý đồ họa GPU và công nghệ NVIDIA CUDA
- Nghiên cứu, cài đặt thử nghiệm và đánh giá hiệu năng tính toán qua một số bài toán tính toán song song trên khối xử lý GPGPU
- Nghiên cứu và cài đặt thử nghiệm, đánh giá hiệu năng của một số bài toán mô phỏng trên khối xử lý đồ họa GPGPU
Đối tượng nghiên cứu
Trong khuôn khổ luận văn thuộc loại nghiên cứu và ứng dụng, tôi chỉ giới hạn nghiên cứu các vấn đề sau:
- Lý thuyết tính toán song song
- Kiến trúc GPU và công nghệ NVIDIA CUDA
Trang 83
- Cài đặt một số bài toán tính toán và mô phỏng tiêu biểu trên thiết bị xử
lý đồ họa GPU bằng ngôn ngữ lập trình CUDA, qua đó đánh giá hiệu năng của các thiết bị này so với thuật toán tương tự trên CPU
Nghiên cứu cơ sở toán học, bổ sung kiến thức cần thiết cho luận văn:
Lý thuyết về tính toán song song, một số bài toán nổi tiếng sử dụng tính toán song song, một số bài toán mô phỏng, lý thuyết và cơ chế hoạt động tính toán trong GPU và công nghệ CUDA
Tìm hiểu, nghiên cứu, phân tích các công trình liên quan đến đề tài luận văn: tài liệu, tạp chí, bài báo…
- Về thực nghiệm:
Cài đặt các chương trình tính toán và mô phỏng trên chip đồ họa GPGPU với công nghệ CUDA và đánh giá hiệu năng
4 Kết quả dự kiến
- Nghiên cứu được một số giải thuật tính toán song song
- Cài đặt các giải thuật tính toán song song chạy trên thiết bị đồ họa GPU
- Xây dựng một số chương trình mô phỏng trên thiết bị đồ họa GPGPU với công nghệ CUDA
Về mặt lý thuyết
- Nắm được các giải thuật, các mẫu thiết kế tính toán song song
Trang 96 Bố cục luận văn
Nội dung chính của luận văn được chia thành 3 chương như sau:
Chương 1: Tổng quan về GPGPU
Trong chương này giới thiệu tổng quan về card đồ họa và các khối xử lý
đồ họa, việc tính toán với mục đích thông dụng trên khối xử lý đồ họa GPGPU và một số bài toán phù hợp với việc tính toán trên GPGPU
Chương 2: Công nghệ NVIDIA CUDA và lập trình song song trên khối xử lý đồ họa GPGPU
Chương này giới thiệu chi tiết về kiến trúc CUDA, trình bày ngôn ngữ lập trình song song CUDA trên thiết bị đồ họa GPU của hãng NVIDIA Áp dụng giải quyết một số bài toán sắp xếp nhanh, nhân ma trận, chuyển đổi Fourier, phân cụm K-Means, bài toán Người du lịch …bằng phương pháp song song dùng ngôn ngữ CUDA thực thi trên thiết bị đồ họa GPGPU và đánh giá hiệu quả của nó so với trên CPU
Chương 3: Mô phỏng song song sử dụng khối đồ họa GPGPU
Trong chương này tác giả sẽ trình bày khá chi tiết một số bài toán mô phỏng tiêu biểu như: mô phỏng N-Body, mô phỏng hạt (phân tử), mô phỏng động lực học chất lưu, mô phỏng sóng biển Tác giả cũng tiến hành cài đặt
và thử nghiệm các bài toán này trên khối xử lý đồ họa GPGPU của NVIDIA
để đánh giá hiệu năng mô phỏng của chúng so với trên CPU
Trang 105
CHƯƠNG 1 TỔNG QUAN VỀ GPGPU
Ý tưởng sử dụng các loại card đồ họa phục vụ cho mục đích tính toán ban đầu không được tính đến trong quá trình phát triển đồ họa máy tính Cùng với sự phát triển của xử lý đồ họa 3D và 2D cũng như sự tăng trưởng của năng lực phần cứng, ý tưởng này bắt đầu được quan tâm nhiều hơn Ngoài việc sử dụng các card đồ họa vào mục đích biểu diễn đồ họa thuần túy, người
ta đã bắt đầu quan tâm nhiều tới các sức mạnh tính toán song song trên card
đồ họa hiện đại
Đồ họa máy tính bắt đầu xuất hiện từ sau những năm 1950 Ở thời điểm
đó, các màn hình hiển thị đơn sắc CRT dựa trên đèn hình Braun có thể vẽ các điểm và đường thẳng trên một màn hình vector Các hình phức tạp như các biểu tượng được ghép bởi các đoạn thẳng riêng biệt Những thiết bị này tỏ ra khá chậm, đắt đỏ và không xác thực đối với những người dùng thông thường Trong những năm 1960, xuất hiện đồ họa dạng khung dây đầu tiên với khả năng vẽ đường thẳng đã mô phỏng được các đồ họa giống như 3D
Hình 1.1 Khung dây hình cầu
Ivan Sutherland, người đi tiên phong trong lĩnh vực đồ họa máy tính, đã chỉ ra trong luận án tiến sỹ của mình vào năm 1963 tại trường MIT về tiềm
Trang 116
năng của tương tác người – máy Cuốn sổ nháp (Sketchpad) cho phép tương tác mà ông trình bày dựa trên một màn hình vector với thiết bị đầu vào là một chiếc bút cảm ứng Sự kiện này đã đánh dấu nguồn gốc của đồ họa máy tính Sutherland đã phát minh ra rất nhiều thuật toán chung mà ngày nay nó vẫn còn được sử dụng trong đồ họa máy tính, như thuật toán vẽ và cắt xén đường thẳng Ông cũng định nghĩa vòng lặp tương tác cơ sở, xuất phát từ việc xử lý đầu vào người dùng, cập nhật trạng thái chương trình, hiển thị và làm tươi các
đồ họa mới và sau đó lặp lại thủ tục này
Ở thời điểm đó, các thiết bị đặc biệt gọi là các bộ xử lý hiển thị (DPU) được sử dụng để hiển thị các đồ họa Sức mạnh tính toán của các máy chủ đã
bị quá giới hạn và trở nên vô cùng chậm chạp khi việc vẽ hình được xử lý trực tiếp trên đó Để tốt hơn, các máy chủ biên dịch một danh sách hoặc một file đối tượng cần hiển thị và gửi nó tới DPU để tiết kiệm thời gian tính toán Jack Bresenham, thời gian đó đang là lập trình viên tại IBM, vào năm
1962 ông đã trình bày một thuật toán vẽ đường thẳng trên các màn hình quét mành mà không sử dụng các phép toán dấu phảy động và các phép toán phức tạp với việc cực tiểu hóa các sai số làm tròn khi vẽ các đường thẳng rời rạc Sau đó, ông đã mở rộng nó cho các đường tròn Chính những điều này
đã mở đầu cho kỹ thuật đồ họa quét mành Lúc này, việc khử răng cưa đối với các hình vẽ dạng đường thẳng và đường cong là chủ đề chính trong đồ họa máy tính Người ta đã sử dụng tối đa các thuật toán này vào cuối năm 1960 Bóng lưu hình hiển thị trực tiếp (DVST) được phát minh, có một lưới chắn kim loại nguyên chất lưu lại ánh sáng ở một vị trí tại một thời điểm Nếu so sánh với các màn hình vector, DVST có thể biểu diễn và lưu giữ đồ họa mà không cần một thời hạn vẽ lại hình Một cách vẽ hình hiện đại với các mành hình đồ họa quét mành được đưa ra với phần cứng tương ứng mạnh hơn
Trang 127
Hình 1.2 Đồ họa quét mành Trong khoảng thời gian từ năm 1970 đến 1980, các thành tựu đã đạt được từ việc các ảnh vẽ dưới dạng khung dây cho tới quét mành, đổ đầy các
đa giác để tạo cảm giác như ảnh 3D thực và tạo cảm giác thật với kỹ thuật tô bóng Các thiết bị đồ họa trở thành các bộ nhớ đệm cho các phần tử ảnh có khả năng truy nhập được, gọi là các điểm ảnh (pixel), có thể được ánh xạ trực tiếp bởi thiết bị vào trong màn hình quét mành bằng việc làm tươi trong một khoảng tần số nào đó Các ứng dụng và game đồ họa đầu tiên đã được phát triển Tuy nhiên, đồ họa 3D thời gian thực vẫn yêu cầu hiệu năng tính toán quá cao Toán học chưa đáp ứng được trong việc mô phỏng không gian 3D khi mà các đa giác và các đối tượng được phát triển ngày càng nhiều Thêm vào đó, các tiêu chuẩn ISO cho 2D và 3D bắt đầu được mở ra với “GSK” ở châu Âu và “Core” ở Bắc Mỹ Năm 1971, Henri Gouraud trình bày một phương pháp tô bóng các đa giác, gọi là phương pháp tô bóng Gouraud Năm
1975, Bui-Tuong Phong trình bày các phương pháp của kỹ thuật tô bóng màu tốt hơn, gọi là kỹ thuật tô bóng Phong, và ông là người đầu tiên trình bày một
mô hình chiếu sáng toàn cục cho các ảnh được sinh ra từ máy tính, gọi là mô hình chiếu sáng Phong, đã tạo ra một cảm giác 3D tốt James F Blinn đã cải tiến các thuật toán này thành một mô hình chiếu sáng cục bộ vào năm 1977 cho việc phản xạ trên các bề mặt với mô hình Blinn-Phong Các phương pháp ánh xạ kết cấu cho các đa giác được đi tiên phong bởi Edwin Catmull trong luận án tiến sỹ của ông vào năm 1974
Trang 138
Hình 1.3 Hình cầu được tô bóng theo Gouraud
Hình 1.4 Ấm trà Utah được tô bóng
Giữa những năm 1980-1990, ngày càng nhiều màu sắc được đưa vào trong kỹ thuật, phần cứng rẻ hơn và nhanh hơn được chế tạo, các phương pháp
mô phỏng 3D trung thực hơn được nghiên cứu ngày càng nhiều Trong thời gian đầu những năm 1980, đồ họa ngày càng phát triển với các chương trình thiết kế có sự trợ giúp của máy tính (CAD) và các giao diện đồ họa người dùng (GUI) xuất hiện phổ biến trong các máy tính Macintosh Năm 1981, IBM đã trình làng thiết bị đồ họa màu đầu tiên, nó trở thành một tiêu chuẩn cho thiết bị
xử lý đồ họa của các máy tính cá nhân Các kỹ thuật biểu diễn, ví dụ như ánh
xạ môi trường của Blinn, tô bóng trơn, bóng mờ và các kỹ thuật ánh xạ phản xạ được đưa ra Không may thay, chúng vẫn thực sự quá chậm đối với các phần cứng trong việc trình diễn và tính toán trong thời gian thực
Các giao diện lập trình đồ họa chuẩn như OpenGL và DirectX để vẽ và biểu diễn đã được phát hành vào những năm 1990 Các phần cứng mới và nhanh hơn được sản xuất với sự gia tăng một lượng lớn bộ nhớ và phần cứng
hỗ trợ cho việc thực thi ánh xạ kết cấu, các phép toán hỗn hợp, bộ đệm thao
Trang 149
tác và các kỹ thuật biểu diễn khác Các chương trình 3D CAD được phát triển
và phần mềm mô hình hóa 3D xuất hiện như Maya, Blender3D, và 3D Studio Max Các bộ phim hoàn chỉnh được tạo trên máy tính như “Toy Story” đã được chiếu Các card đồ họa và các máy tính cá nhân trở nên vừa phải với mọi người và thậm chí các game 3D thời gian thực đã có thể thực hiện được Với yêu cầu phát triển liên tục của các ứng dụng 3D đặc biệt là trong ngành công nghiệp trò chơi và các dự án làm phim ảnh, giữa những năm 2000 cho đến 2010, chủ nghĩa hiện thực hình ảnh ngày càng đưa vào nhiều hơn trong việc trình diễn thời gian thực với những cải tiến đồ sộ về hiệu năng phần cứng cho các phương pháp trình diễn và tô bóng Người dùng ngày càng
có cơ hội tiếp xúc với những thiết bị đồ họa hiệu năng cao hơn với chi phí rẻ hơn Trong các nước công nghiệp, hầu hết các hộ gia đình đều có tối thiểu một chiếc máy tính hiệu năng cao
Hình 1.5 Hình ảnh một ngôi nhà sử dụng Blender3D
Các loại card đồ họa đầu tiên có khả năng lập trình GPGPU xuất hiện vào năm 2006 cho phép các nhà phát triển sử dụng sức mạnh GPU trong mục đích tính toán thông thường, bên cạnh việc biểu diễn toán học và các kỹ thuật
đồ họa 2D và 3D Năm 2010, hãng NVidia
với công nghệ CUDA và hãng
Trang 15Trải qua quá trình phát triển, đến nay số lượng màu sắc đã tăng từ đơn sắc lên tới 16.7 tỷ màu Với hơn 7 tỷ transistor trong phần cứng (công nghệ Maxwell mới nhất của NVIDIA) cho phép tốc độ tính toán đạt tới hàng TFlops Ví dụ, công nghệ “Fermi” của Nvidia năm 2010 cung cấp 512 nhân, tốc độ mỗi nhân đạt 1.5 GHz, băng thông bộ nhớ 192 GBytes/s với cấu hình tiêu chuẩn cho bộ nhớ 1.5 GB, có sức mạnh tính toán vào khoảng 1.5 TFlops đến 2.7 TFlops, phụ thuộc vào độ chính xác của dấu phảy động, tùy theo khai báo của các nhà sản xuất
Dưới đây là bảng so sánh ngắn gọn sự khác nhau về hiệu năng giữa các GPU và CPU thực tế:
Nvidia GeForce GTX 580 (Fermi) 2.7 TFlops 192 Gbytes/s
Trang 1611
NVIDIA GM107 (Maxwell) 1305.6 GFlops 86.4 Gbytes/s
Bảng 1.1 GFlops và băng thông của các GPU và CPU
Hình 1.6 So sánh GFlops giữa GPU và CPU [30]
Biểu đồ so sánh ở trên cho thấy từ khoảng giữa năm 2008 trở đi, sự chênh lệch về hiệu năng giữa GPU so với CPU là rất lớn
Trong tương lai, theo định luật Moore, chưa có dấu hiệu nào cho thấy
sự chững lại của tốc độ phát triển GPU, với sự tăng trưởng của hiệu năng phần cứng và bộ nhớ, sức mạnh tính toán có thể tăng xấp xỉ gấp đôi trong vòng hai năm
Việc biểu diễn đồ họa 3D và 2D thường được xử lý bằng cách vẽ các đa giác ở dạng các điểm, đường thẳng, tam giác hay tứ giác, được xây dựng từ
Trang 1712
các đỉnh, các cạnh và thể hiện trên các màn hình hay màn ảnh dạng 2D Card
đồ họa có khả năng phản hồi việc xử lý các dữ liệu đa giác thành các điểm ảnh kết quả, đại thể gọi là luồng dữ liệu dạng ống Tồn tại một số kỹ thuật biểu diễn khác như dò tia hoặc các thiết bị vẽ 3D thực, nhưng đều cho tốc độ tính toán chậm và không tối ưu về phần cứng
Ban đầu, ống dẫn đồ họa là một giai đoạn xử lý cố định bên trong card
đồ họa, được chỉ ra ở hình 1.7 Nói chung, dữ liệu đa giác được tính toán hoặc được nạp thường ở dạng các đỉnh tam giác, được truyền tới ống dẫn card đồ họa như dữ liệu đầu vào Chúng được xử lý trong ống ở các giai đoạn khác nhau và được tính toán để đưa ra các điểm ảnh kết quả trên màn ảnh Cụ thể, các đầu vào của ống dẫn đồ họa là các đỉnh được định nghĩa ở các vị trí không gian 2D hoặc 3D với các thuộc tính là các kết cấu, màu sắc, các véc tơ thông thường và các tham số, miêu tả các đối tượng hình học khác Để miêu tả môi trường không gian và các hình vẽ phối cảnh, các ma trận 4D được sử dụng và thiết lập cho các phối cảnh, các đối tượng…
Giai đoạn đầu tiên trong ống dẫn đồ họa là chuyển đổi các đỉnh lên màn ảnh hoặc tọa độ mắt người bằng việc chia phối cảnh sử dụng các phép toán
ma trận đầy đủ với các ma trận cho trước hiển thị trong không gian 2D Việc điều chỉnh màu sắc cho các đỉnh chiếu sáng và các hiệu ứng trạng thái khác được áp dụng trong quá trình xử lý này bằng cách đưa vào các thuộc tính của đỉnh đầu vào Cùng với các phép toán cắt xén và chọn lọc được xử lý ở đây để loại bỏ các đối tượng không được nhìn thấy Các đầu ra của giai đoạn này được chuyển đổi, các đỉnh được chuẩn hóa cho các màn ảnh hiển thị 2D với các trạng thái màu và một độ sâu xác định cho hình vẽ Chương trình đã xử lý (trừ cắt xén và chọn lọc) được gọi chung là tô bóng đỉnh Với mỗi đỉnh đầu vào của một đa giác, một chương trình tô bóng đỉnh được áp dụng một lần Trong quá trình phát triển, chức năng xử lý cố định này được thay đổi thành
Trang 1813
chức năng có thể lập trình bởi người dùng, có thể sử dụng để thao tác với tọa
độ các đỉnh và thuộc tính trạng thái để đạt được những hiệu ứng đặc biệt, chẳng hạn như làm biến dạng hoặc sinh động các đối tượng
Bộ quét mành làm đầy và tô bóng các đối tượng hình học nguyên thủy bằng cách nội suy các giá trị của màu sắc, các tọa độ kết cấu, các véc tơ thông thường và dọc theo các cạnh của tam giác để đưa ra các phân mảnh của hình
vẽ với vị trí, độ sâu và màu sắc của nó Sự pha trộn, ánh xạ kết cấu, chiếu sáng từng điểm ảnh và các phép toán đệm khác được áp dụng trong bộ quét mành cho mỗi phân mảnh Chương trình được thực thi này gọi là tô bóng điểm ảnh hay phân mảnh Ban đầu nó cũng là một chức năng phần cứng cố định, sau này đã phát triển thành chức năng có thể định nghĩa bởi người dùng,
để thao tác với các phân mảnh về màu sắc và trạng thái, ví dụ như các hiệu ứng màn chắn…
Cuối cùng, các phân mảnh của bộ quét mành được định giá thành các điểm ảnh hình vẽ kết quả và được ghi vào trong bộ đệm khung Để ngăn ngừa việc ghi đè và chú trọng sự hiển thị logic của các đối tượng dựa vào độ sâu
Trang 19Do mối quan hệ độc lập giữa các đối tượng đồ họa, các hình vẽ nguyên thủy và việc xử lý các đỉnh trong ống dẫn đồ họa, các bộ xử lý đa lõi được sử dụng để song song hóa công việc Mỗi đỉnh và mảnh được đi qua ống dẫn đồ họa ở bước biểu diễn theo cách giống nhau Các bộ xử lý được tối ưu hóa cao
và sử dụng các phép toán số học và dấu phảy động Các bộ xử lý đỉnh được tối ưu hóa trong tính toán các véc tơ và ma trận Các bộ xử lý mảnh được tối
ưu cho tính toán các giá trị và màu sắc Các bộ xử lý này hoạt động nhanh một cách phi thường so với CPU để tính toán hàng tỷ phép tính và xử lý hàng ngàn phân mảnh, đỉnh và các hình nguyên thủy trên giây để thu được khả năng biểu diễn thời gian thực gần như thực tế Nhưng nếu nhìn ở khía cạnh bất lợi thì các bộ xử lý này không có chức năng rộng lớn (không linh hoạt) như của một CPU
GPGPU là viết tắt của General-Purpose computing on Graphic Processing Units, tức là sử dụng các khối xử lý đồ họa cho mục đích tính toán thông thường (chứ không phải cho mục đích đồ họa) Các lõi xử lý đỉnh, mảnh… được miêu tả ở phần trước được thay thế bởi các bộ đa xử lý trong GPGPU Điều này đã mở ra tính khả thi cho các nhà phát triển trong việc truy nhập và sử dụng các bộ xử lý này với mục đích tính toán thông thường bên cạnh việc tính toán trong ống dẫn đồ họa với các bộ tô bóng đỉnh, mảnh và các đối tượng hình học khác Dĩ nhiên, trong các thiết bị GPGPU vẫn có chức
Trang 2015
năng biểu diễn đồ họa như bình thường GPGPU thường được xem như là công nghệ điện toán lưới
Cấu trúc của một GPU hiện đại không khác quá nhiều so với các CPU (xem hình 1.9) Một CPU phổ biến được cấu thành bởi một bộ nhớ cache lớn, một hoặc nhiều khối xử lý điều khiển, một hoặc nhiều nhân tính toán (ALU) Các CPU được nối với một bộ nhớ ngoài (RAM) Ngược lại, một GPU được xây dựng với nhiều nhân, mỗi nhân có một bộ nhớ cache nhỏ, vài bộ xử lý điều khiển cho các nhân này và cho các luồng ứng dụng Một bộ nhớ lớn có thể truy nhập được nối ngay sát các GPU trên các thiết bị đồ họa
Hình 1.8 Sơ đồ cấu trúc của CPU và GPU [30]
Hãng NVidia gọi nguyên lý thiết kế này là công nghệ CUDA (Computing Unified Device Architecture – kiến trúc thiết bị tính toán hợp nhất), còn hãng ATI gọi đó là công nghệ dòng - Stream NVidia và ATI đều đồng nhất quan điểm về ý tưởng và khái niệm GPGPU, tuy nhiên họ lại sử dụng các ngôn ngữ cũng như các kỹ thuật khác nhau (sẽ được trình bày ở phần tiếp theo) Hai giao diện lập trình ứng dụng (API) chính được cung cấp
đó là OpenCL (của hãng ATI) và CUDA (của hãng NVidia)
Trang 2116
Hình 1.9 Sơ đồ kiến trúc thiết bị hơp nhất của một card đồ họa Nvidia Một card đồ họa NVidia với công nghệ CUDA được gom thành các nhóm bộ đa xử lý dòng (Streaming Multi Processors - SM) Mỗi SM được kết nối với bộ nhớ toàn cục của card Để sử dụng tính toán, một khối bộ nhớ bất biến được tách khỏi bộ nhớ toàn cục Mỗi SM được cấu thành bởi nhiều bộ xử
lý dòng (Streaming Processors -SP), một bộ nhớ cache và một bộ xử lý điều khiển Tồn tại một khối bộ nhớ nhỏ để sử dụng cho dữ liệu tính toán chung, nó
có thể truy nhập đồng thời bởi tất cả các SP khác Bộ nhớ này được xem như là
bộ nhớ chia sẻ của CUDA Mỗi SP được sử dụng để xử lý một hoặc nhiều luồng NVidia gọi GPU là công nghệ thiết kế đơn lệnh đa luồng (SIMT)
Một bộ quản lý thực thi luồng với bộ nhớ cache lệnh được cài đặt trên đỉnh của các SM, sử dụng để lập lịch và điều khiển các luồng, các bộ xử lý và phát triển ứng dụng Luồng ống biểu diễn đồ họa thông thường cũng được điều khiển và mô phỏng bởi bộ quản lý thực thi luồng trong các bước thực thi
Trang 22Dưới đây là bảng thông số kỹ thuật cho các phiên bản khác nhau được tác giả tham khảo tại http://en.wikipedia.org/wiki/CUDA Một số khái niệm cần xem xét sẽ được giải thích ở phần sau
Khả năng tính toán (phiên bản) Đặc tính kỹ thuật
1.0 1.1 1.2 1.3 2.x 3.0 3.5 5.0
Giá trị tối đa của chiều x, y hoặc z
Giá trị tối đa của chiều x, y của một
Trang 23Số lệnh tối đa có thể xử lý trong nhân 2 million 512 million
Bảng 1.2 Các thông số kỹ thuật của các phiên bản kiến trúc CUDA
Về cơ bản, công nghệ Stream của ATI gần giống với công nghệ CUDA của NVidia nhưng chúng sử dụng một số ít các ký hiệu khác nhau cho các thành phần đơn lẻ API cho lập trình với OpenCL được đồng phát triển bởi AMD/ATI và NVidia Công nghệ Stream ATI được dựa trên API của OpenCL
Một thiết bị tính toán GPU, chẳng hạn như là một card đồ họa, cấu thành bởi nhiều bộ tính toán (Computing Units-CU) Các bộ tính toán này có thể có nhiều nhân (Stream Cores-SC) dùng để điều khiển nhiều phần tử xử lý (Processing Elements –PE) Các CU tương đương với các SM và SC tương đương với SP trong CUDA Các PE thể hiện các đơn luồng Mỗi CU có bộ nhớ cục bộ tương đương với bộ nhớ chia sẻ trong CUDA Tất cả các CU đều được kết nối với bộ nhớ thiết bị toàn cục
Trang 2419
Hình 1.10 Sơ đồ cấu trúc OpenCL
Mỗi SC có một bộ điều khiển lệnh, một bộ thực thi nhánh và truy nhập tới các thanh ghi mục đích thông dụng có thể sử dụng bởi các PE đơn hoặc các luồng công việc Một bộ xử lý Ultra-Threaded Dispatch điều khiển và lập lịch các luồng ứng dụng và các luồng nằm trên đỉnh của các CU giống như bộ quản lý thực thi luồng ở trên các thiết bị CUDA Các thiết bị OpenCL chỉ ra rằng tất cả các SC trong một CU thực thi cùng một lệnh tại mỗi chu trình SIMT, và có thể vận chuyển tới bốn luồng hay phần tử xử lý đồng thời
Trang 2520
Hình 1.11 Cấu trúc thiết bị Stream của ATI
Không có sự chỉ định rõ ràng về năng lực của phần cứng đối với các card đồ họa ATI sử dụng công nghệ Stream giống như các card NVidia CUDA, nhưng các tham số và khả năng cơ bản của phần cứng cũng được yêu
cầu sử dụng giao diện lập trình ứng dụng là OpenCL
GPGPU là việc ánh xạ các bài toán tính toán mục đích thông thường lên GPU sử dụng phần cứng đồ họa theo cách giống như bất cứ ứng dụng đồ họa chuẩn nào Tác giả sẽ bắt đầu bằng cách mô tả lập trình trên GPU sử dụng các thuật ngữ đồ họa, sau đó cho thấy cách các bước tương tự được sử dụng theo cách thông thường để tạo ra ứng dụng GPGPU, và cuối cùng là sử dụng
Trang 2621
các bước tương tự để thể hiện đơn giản hơn và trực tiếp hơn về cách ngày nay các ứng dụng tính toán trên GPU được viết như thế nào
Chúng ta sẽ bắt đầu với cùng một đường ống dẫn GPU đã mô tả ở trên
và tập trung vào các khía cạnh lập trình được của đường ống này
- Lập trình viên xác định dạng hình học sẽ bao phủ một khu vực trên màn hình Quá trình quét mành trên màn hình tạo ra một mảnh ở mỗi vị trí điểm ảnh được bao phủ bởi hình học đó
- Mỗi mảnh được làm bóng mờ bởi chương trình mảnh
- Các chương trình mảnh tính giá trị của các mảnh bằng cách kết hợp của phép toán toán học và bộ nhớ toàn cục đọc từ bộ nhớ kết cấu toàn cục
- Các hình ảnh kết quả sau đó có thể được sử dụng như là kết cấu trong tương lai đi qua các đường ống dẫn đồ họa
Một trong những khó khăn trong lịch sử lập trình ứng dụng GPGPU đó
là mặc dù các tác vụ với mục đích thông dụng của chúng không có liên quan
gì tới đồ họa, các ứng dụng vẫn phải được lập trình bằng cách sử dụng các API đồ họa Ngoài ra, chương trình đã được cấu trúc trong điều kiện của đường ống đồ họa, với các đơn vị lập trình được chỉ có thể truy cập được như một bước trung gian trong đường ống, trong khi các lập trình viên chắc chắn muốn truy cập vào các đơn vị lập trình được trực tiếp
Các môi trường lập trình sẽ được tác giả mô tả chi tiết trong chương 2, giải quyết khó khăn này bằng cách cung cấp một giao diện tự nhiên hơn, trực tiếp hơn, không có giao diện đồ họa cho phần cứng và đặc biệt là các đơn vị lập trình được Ngày nay, ứng dụng tính toán GPU được tổ chức theo cách sau:
Trang 274) Các vùng đệm chứa kết quả trong bộ nhớ toàn cục sau đó có thể được sử dụng như là một đầu vào của tính toán sau đó
Mô hình lập trình này mạnh vì một số lý do sau:
- Đầu tiên, nó cho phép các phần cứng khai thác triệt để cơ chế song song dữ liệu của các ứng dụng bằng cách xác định rõ ràng cơ chế song song trong chương trình
- Tiếp theo, nó gây ấn tượng bằng việc tạo ra sự cân bằng vững chắc giữa tính phổ biến (một thủ tục hoàn toàn có thể lập trình tại mỗi phần tử) và sự hạn chế để đảm bảo hiệu năng tốt (mô hình SPMD,
có các hạn chế về phân nhánh cho hiệu quả, có hạn chế về dữ liệu giao tiếp giữa các thành phần và giữa hạt nhân /chu kỳ, v.v )
- Cuối cùng, khả năng truy cập trực tiếp đến các đơn vị lập trình được
đã loại bỏ nhiều thách thức phức tạp của các lập trình viên GPGPU trước đây trong việc đồng thời chọn giao diện đồ họa cho lập trình mục đích thông dụng
Kết quả là các chương trình thường được thể hiện bằng ngôn ngữ lập trình quen thuộc (chẳng hạn như ngôn ngữ lập trình của NVIDIA giống như cú pháp của C thể hiện trong môi trường lập trình CUDA của họ) và đơn giản hơn
Trang 2823
và dễ dàng hơn để xây dựng và gỡ lỗi (và đang ngày càng hoàn thiện như là các công cụ lập trình độc lập) Điều đó tạo nên một mô hình lập trình cho phép người dùng tận dụng đầy đủ các sức mạnh phần cứng của GPU nhưng cũng cho phép mô hình lập trình bậc cao ngày càng mạnh để có thể xây dựng các ứng dụng phức tạp
Trong quá khứ, phần lớn các chương trình GPGPU được thực hiện trực tiếp thông qua các API đồ họa Mặc dù nhiều nhà nghiên cứu đã thành công trong việc làm cho các ứng dụng làm việc thông qua các API đồ họa nhưng có một điều không phù hợp cơ bản giữa mô hình lập trình truyền thống mà mọi người đang dùng và các mục tiêu của các API đồ họa Ban đầu, người ta sử dụng các hàm cố định, các đơn vị đồ họa cụ thể (ví dụ như các bộ lọc kết cấu (texture filter), trộn (blending), và các phép toán tạo mẫu tô đệm để thực hiện các thao tác GPGPU Điều này nhanh chóng trở nên tốt hơn khi các phần cứng là bộ xử lý các mảnh hoàn toàn lập trình được với ngôn ngữ assembly
mã giả, nhưng cách này vẫn khó tiếp cận cho dù đã có rất nhiều nhà nghiên cứu hăng hái bắt tay vào
Với DirectX 9, lập trình đổ bóng cao cấp có thể thực hiện thông qua ngôn ngữ đổ bóng cấp cao ("high-level shading language” - HLSL), nó được biểu diễn giống như giao diện lập trình C cho lập trình đổ bóng NVIDIA Cg cung cấp các tính năng tương tự như HLSL, nhưng đã có thể biên dịch ra nhiều đích và cung cấp ngôn ngữ lập trình cấp cao đầu tiên cho OpenGL Ngôn ngữ đổ bóng OpenGL (OpenGL Shading Language - GLSL) bây giờ là ngôn ngữ đổ bóng tiêu chuẩn cho OpenGL Tuy nhiên, vấn đề chính với Cg / HLSL / GLSL cho GPGPU là chúng vốn đã là ngôn ngữ đổ bóng Tính toán vẫn phải được thể hiện bằng các thuật ngữ đồ họa như vector, kết cấu (texture), mảnh (fragment), và pha trộn (blending) Vì vậy, mặc dù có thể
Trang 29Dự án Microsoft’s Accelerator (bộ gia tốc của Microsoft) có mục tiêu tương tự như Brook ở chỗ tập trung vào khía cạnh tính toán, nhưng thay vì sử dụng biên dịch offline, bộ gia tốc dựa vào biên dịch tức thời (just-in-time) của các phép toán dữ liệu song song cho bộ đổ bóng mảnh
Trong năm qua, đã có những thay đổi lớn trong môi trường phần mềm cho phép phát triển các ứng dụng GPGPU dễ dàng hơn nhiều cũng như tạo ra các hệ thống phát triển mạnh mẽ hơn, chất lượng thương mại hơn RapidMind thương mại hóa Sh và bây giờ đặt mục tiêu nhiều platform trong một GPU, các STI Cell Broadband Engine, và CPU đa-lõi, và hệ thống mới tập trung nhiều hơn nữa vào tính toán so với SH trong việc bao gồm nhiều phép toán đồ họa trung tâm
Cả AMD và NVIDIA bây giờ cũng có riêng hệ thống lập trình GPGPU AMD công bố và phát hành hệ thống của họ cho các nhà nghiên cứu vào cuối năm 2006 Đối với lập trình cấp cao hơn, AMD hỗ trợ biên dịch các chương trình Brook trực tiếp đến phần cứng R6XX, cung cấp một mức lập trình trừu
Trang 3025
tượng cao hơn so với CAL hoặc HAL NVIDIA CUDA là một giao diện cấp cao hơn HAL và CAL của AMD Tương tự như Brook, CUDA cung cấp một
cú pháp giống C để thực hiện trên GPU và biên dịch offline
Tuy nhiên, không giống như Brook chỉ khai thác một hướng xử lý song song là song song dữ liệu thông qua cơ chế dòng, CUDA khai thác hai cấp xử
lý song song là song song dữ liệu và đa luồng CUDA cũng khai thác các nguồn tài nguyên phần cứng nhiều hơn Brook, làm lộ nhiều cấp độ của bộ nhớ
hệ thống phân cấp; các thanh ghi theo từng luồng, bộ nhớ chia sẻ nhanh chóng giữa các luồng trong một khối, bộ nhớ bo mạch, và bộ nhớ máy chủ Các hạt nhân trong CUDA cũng linh hoạt hơn trong Brook bằng cách cho phép sử dụng con trỏ (mặc dù dữ liệu phải ở trên bo mạch), việc lấy ra/lưu trữ thông thường vào bộ nhớ cho phép người sử dụng tán xạ (scatter) dữ liệu từ bên trong một hạt nhân, và đồng bộ giữa các luồng trong một khối luồng Tuy nhiên, tất cả sự linh hoạt này và hiệu quả tiềm năng đạt được đi kèm với cái giá đòi hỏi người
sử dụng phải hiểu nhiều hơn các chi tiết ở cấp thấp của phần cứng, đặc biệt là
sử dụng thanh ghi, luồng và lập lịch cho khối luồng, và các hành vi của các mẫu truy cập bộ nhớ
Để hiểu được những tính toán trong thiết kế của GPU, trước tiên chúng
ta cần nghiên cứu các loại bài toán mà GPU có thể giải quyết được Ban đầu GPU được thiết kế để giải quyết các bài toán về đồ họa máy tính và tăng tốc quá trình hiển thị của các đồ họa do máy tính tạo ra
Ở mức tổng quát, GPU được thiết kế để giải quyết các bài toán với các đặc trưng dưới đây:
1) Bài toán được cấu thành bởi rất nhiều bài toán con có phép toán giống hệt nhau với dữ liệu đầu vào khác nhau
Trang 31Kết luận ở trên chỉ ra những đặc điểm chính mà một bài toán đặc trưng GPGPU sẽ gặp phải Rõ ràng xử lý song song là cách hiệu quả nhất để giải quyết các kiểu công việc như vậy Mười năm trước, kể từ khi GPGPU trở nên
có sẵn trên thị trường và lập trình cho GPGPU trở nên dễ dàng và có hệ thống hơn, các bài toán ở các lĩnh vực rộng lớn như kỹ thuật, khoa học và tài chính
đã được giải quyết với các thuật toán GPGPU mạnh hơn Ở các phần tiếp theo, tác giả sẽ giới thiệu một số bài toán điển hình nhất có thể giải quyết bằng bộ tăng tốc GPGPU
Mô phỏng là một phương pháp được sử dụng rộng rãi trong nghiên cứu các hệ thống phức Một số ứng dụng mô phỏng có thể kể đến như mô phỏng các vụ nổ hạt nhân, các phản ứng hóa học, các thảm họa thiên nhiên như động đất, sóng thần, lũ lụt…Một số bài toán mô phỏng nổi tiếng có thể kể đến như:
• Mô phỏng N-body: là mô phỏng số lượng rất lớn các hạt dưới ảnh hưởng của các lực vật lý, thường là lực hấp dẫn Mô phỏng này thường được sử dụng trong vũ trụ học để nghiên cứu các quá trình dữ liệu cấu trúc phi tuyến tính như cơ cấu hình thành các dải thiên hà và các ngôi sao từ hố đen trong thiên văn học Mô phỏng n-body trực tiếp được dùng trong nghiên cứu vụ nổ của các cụm sao
• Mô phỏng chất lưu (chất lỏng, chất khí): Chất lưu có ở mọi nơi: nước chảy giữa các bờ sông, khói cuộn lên từ điếu thuốc đang cháy, hơi bốc lên từ ấm pha trà, hơi nước trong các đám mây hay sơn được pha trộn
Trang 32mô phỏng một cách hiệu quả cả vật thể rắn
Chi tiết về các bài toán mô phỏng trên sẽ được trình bày chi tiết trong chương 3 của luận văn
Về sau này, dữ liệu lớn thu hút được sự quan tâm lớn bởi thông tin và tri thức được ẩn giấu trong dữ liệu lớn là chìa khóa cho việc phát triển lợi nhuận kinh doanh và thế giới công nghệ tương lai Luôn là một thách thức trong việc xử lý với các tập dữ liệu lớn và trích rút các giá trị thông tin ở khía cạnh thời gian Do đó, việc tăng tốc độ xử lý là một vấn đề được quan tâm lớn Tất nhiên khai phá dữ liệu và học máy với dữ liệu lớn đã thấy được những triển vọng với kiến trúc GPGPU
Weinman [22] đã phát triển một thuật toán học máy GPU có thể chạy nhanh hơn 30 lần thuật toán CPU trên cùng một máy tính Map reduce là một thuật toán phổ thông để xử lý tập dữ liệu online lớn, và được kế thừa bởi Google và Facebook để xử lý một lượng dữ liệu người dùng siêu lớn trên Internet Map reduce có thể thực hiện trên các máy tính được phân cụm hoặc trên các GPGPU Stuart [23] đã chỉ ra rằng các cụm máy GPGPU dựa trên map reduce có thể làm tăng tốc tới 8 lần so với hiệu năng tốt nhất của gói map reduce trên CPU
Trang 3328
Nằm trong số những lĩnh vực tận dụng kỹ thuật khai phá dữ liệu để phân tích dữ liệu, ngành tài chính có những yêu cầu và đặc điểm riêng của nó Ngành tài chính phụ thuộc trầm trọng vào tốc độ cũng như sự chính xác của việc xử lý và tính toán dữ liệu tài chính Rất nhiều các ứng dụng trong ngành này cần phải xử lý ở thời gian thực GPGPU lại thấy được vai trò quan trọng trong việc giải quyết những thách thức trong các nhiệm vụ xử lý và phân tích
dữ liệu tài chính Preis và Tobias [24] đã sử dụng GPU để thực hiện chức năng tự tương quan trong phân tích dao động thị trường tài chính và đã tăng tốc tới 40 lần với mô hình của họ Đây là một cải tiến có ý nghĩa vô cùng quan trọng trong môi trường tài chính cạnh tranh khốc liệt như ngày nay
1.3.4 Xử lý ảnh và thị giác máy tính
GPGPU vốn dĩ được xây dựng để phục vụ mục đích xử lý đồ họa máy tính Tuy nhiên, có một lượng lớn các loại ứng dụng xử lý ảnh không thuộc vào nhiệm vụ của đồ họa máy tính thông thường Loại xử lý ảnh này bao gồm việc biến đổi từng pixel bởi một thuật toán nào đó và dữ liệu đầu vào ở dạng hình ảnh 2D Các ứng dụng đặc trưng bao gồm: hiệu ứng lọc ảnh, làm nổi bật ảnh, xử lý và tái cấu trúc ảnh y học GPGPU được các công nghệ trí tuệ nhân tạo và thị giác máy tính áp dụng nhiều Các nhà nghiên cứu trong các lĩnh vực này nhận thấy rằng các thuật toán và chương trình của họ chứa một chuỗi các đặc điểm tương tự có thể được tăng tốc tốt với mô hình lập trình GPGPU Bất
kỳ tính toán nào yêu cầu với từng pixel có thể xem xét để xử lý song song với GPGPU, làm giảm độ phức tạp về thời gian từ O(n2) xuống còn O(n) bằng cách xử lý đồng thời các pixel thay cho việc xử lý từng pixel một
Jeong et al [25] đã tương thích GPGPU với thuật toán lọc ảnh ITK cho nhiệm vụ xử lý ảnh trong y học để nhận được hiệu năng gần với thời gian thực James [26] đã thể hiện thuật toán thị giác máy tính trên GPU và đạt
Trang 3429
được độ tăng tốc tới 21 lần Họ đã giới thiệu 2 dự án thị giác máy tính mã nguồn mở dựa trên GPGPU, đó là OpenVidia và GPUCV
Trên thực tế, có những thuật toán và cấu trúc dữ liệu vốn dĩ nó đã tương thích với mô hình lập trình song song, trong khi có một số khác thì lại không Thật khó để có thể tìm thấy một khuôn mẫu vạn năng cho các thuật toán và cấu trúc dữ liệu khác nhau tương thích với mô hình lập trình song song, và thậm chí một số trong đó không thể lập trình song song được Tuy nhiên, các nghiên cứu
cơ bản về các vấn đề này vẫn tiếp diễn và bất kỳ phát minh nào trong những lĩnh vực này sẽ làm thay đổi sâu sắc bối cảnh của khoa học máy tính
Một trong số những nghiên cứu nổi bật trong lĩnh vực này là nghiên cứu của Kim [27] với thuật toán tìm kiếm trên cây với cả GPU và CPU Công việc của Kim tập trung vào việc tối ưu hóa thuật toán tìm kiếm trên cây đồng thời trên cả CPU và GPU Ông đã đưa ra một thuật toán được đáp ứng cho cả CPU và GPU Không dễ để song song hóa việc tìm kiếm trên cây bởi mỗi mức tìm kiếm tiếp theo của cây luôn phụ thuộc vào kết quả tìm kiếm tới từ mức trước đó Sự phụ thuộc dữ liệu đã khử mất khả năng có thể tìm kiếm trên toàn bộ cây (mọi mức trên cây) tại cùng một thời điểm Thuật toán của Kim, thay bằng việc cố gắng cải thiện thời gian thực thi các truy vấn tìm kiếm riêng
lẻ, thì nó tập trung vào việc gia tăng thông lượng của các truy vấn Với GPGPU, một lượng lớn các truy vấn có thể được thực hiện một cách đồng thời và vì thế việc cải tiến hiệu năng sẽ thu được hiệu quả khi cần tìm kiếm một lượng dữ liệu lớn Tương tự thuật toán GPGPU, thuật toán của Kim với CPU tận dụng tốt mô hình ống SIMD, như Intel’s Streaming SIMD Extensions (SSE) và AMD’s 3D Thuật toán đã phải dành sự quan tâm đặc biệt tới việc truyền dữ liệu để đảm bảo rằng các bộ nhớ L1 cache, L2 cache và
bộ nhớ đệm của hệ thống được tận dụng một cách tối đa Do cấu trúc bộ nhớ
Trang 35Thiết kế GPGPU hiện đại đã được mở rộng để tối ưu hóa cấu trúc cho các loại bài toán này, và việc xem xét các vấn đề tối ưu này có ý nghĩa khác
so với việc xem xét thông thường trong các kiến trúc CPU
Trang 3631
CHƯƠNG 2 CÔNG NGHỆ NVIDIA CUDA
VÀ TÍNH TOÁN SONG SONG TRÊN BỘ XỬ LÝ ĐỒ HỌA GPGPU
Mặc dù các bản thông cáo đã được đưa ra sớm hơn, nhưng hãng NVidia chỉ chính thức ra mắt CUDA tới công chúng vào tháng 2 năm 2007 Công nghệ này được thiết kế để đáp ứng một số yêu cầu quan trọng của một nhóm đông đảo người dùng Một trong số yêu cầu quan trọng nhất đó là làm sao để lập trình GPU một cách dễ dàng Sự đơn giản là điều cần thiết để đơn giản hóa việc lập trình song song GPU và khiến nó được sử dụng nhiều hơn Trước CUDA, lập trình song song GPU bị hạn chế bởi các mô hình đổ bóng của các API đồ họa Do đó, chỉ những bài toán phù hợp một cách tự nhiên với các thuật toán đổ bóng đỉnh và mảnh mới được tính toán bằng cách sử dụng lập trình xử lý song song với GPU Thêm nữa, các thuật toán tổng quát sử dụng các khái niệm kết cấu và việc GPU chỉ cung cấp các phép toán 3D với số thực đã làm hạn chế sự phổ biến của tính toán GPU Để làm cho lập trình song song GPU trở nên dễ dàng và thiết thực hơn, NVidia đã sử dụng ngôn ngữ lập trình C với những mở rộng ở mức tối thiểu
CUDA- viết tắt của Compute Unified Device Architecture, tạm dịch là kiến trúc thiết bị tính toán hợp nhất, là kiến trúc mới bao gồm cả phần cứng
và phần mềm để phát triển và quản lý việc tính toán trên GPU như một thiết
bị tính toán song song mà không cần ánh xạ vào các hàm lập trình đồ họa Kiến trúc này có trong giải pháp của GeForce 8 Series, Quadro FX 5600/4600, và Tesla của NVIDIA Cơ chế đa nhiệm của hệ điều hành chịu trách nhiệm cho việc quản lý truy cập tới GPU bởi các ứng dụng CUDA và ứng dụng đồ họa chạy song song
Trang 3732
Bộ phần mềm CUDA bao gồm các lớp mô tả trong hình 2.1: driver 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ợ dirver hạng nhẹ và lớp môi trường thực thi, từ đó cho tốc độ tính toán cao
Hình 2.1 Kiến trúc bộ phần mềm NVidia CUDA [9]
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
Trang 3833
Hình 2.2 Các thao tác thu hồi và cấp phát bộ nhớ với CUDA [9]
CUDA có đặc tính lưu dữ liệu đệm song song và bộ nhớ chia sẻ chip 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 với việc tối thiểu hóa 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
on-Hình 2.3 Vùng nhớ dùng chung mang dữ liệu gần ALU hơn [9]
Trang 3934
Sự cạnh tranh trong ngành công nghiệp video-game để thể hiện chân thực cuộc sống hơn và trình diễn đồ họa 3D ở độ phân giải cao đã mở ra sự cạnh tranh giữa các nhà sản xuất GPU để cung cấp phần cứng tốt hơn tới các game thủ Nhờ có xử lý đồ họa tự nhiên, các sản phẩm được phát hành mới đây cung cấp các bộ xử lý song song tốc độ cao với băng thông bộ nhớ cao và sức mạnh tính toán lên tới hàng teraflops trên giây Các GPU hiện đại được thiết kế để hỗ trợ tính toán song song dữ liệu, tức là có nhiều luồng thực thi cùng một mã nguồn với mỗi phần tử dữ liệu Xử lý song song dữ liệu có thể được miêu tả ngắn gọn bởi các phần tử dữ liệu ánh xạ vào các luồng xử lý song song Hiệu năng nâng lên nếu có ít hoặc không có rẽ nhánh, chính xác là một mã nguồn được thực thi cho mọi luồng song song đang chạy Các nhân
xử lý ảnh và các phép toán ma trận nằm trong các ứng dụng đặc thù để thu được nhiều lợi ích nhất từ kiến trúc này Song ý nghĩa của việc tăng tốc độ tính toán có thể thu được bởi việc áp dụng kiến trúc song song dữ liệu này cho các thuật toán đang tồn tại khác Trong tương lai gần, các nhà phát triển phần cứng sẽ cung cấp những GPU tốt hơn với nhiều luồng xử lý song song hơn nữa Trách nhiệm của các nhà phát triển phần mềm đó là sử dụng năng lực xử
lý lạ thường của GPU để có thể so sánh được với năng lực xử lý của các cụm máy tính hiệu năng cao
Khi người ta không thể đưa ra các cải tiến cho các giải pháp đang tồn tại về mặt thuật toán, thì người ta quan tâm vào việc phát triển các GPU mới với khả năng chạy nhiều luồng xử lý hơn để nâng cao hiệu năng tính toán Điều này có nghĩa là mã nguồn đã được thiết kế cho dòng NVidia 8 sẽ chạy nhanh hơn với dòng NVidia GTX mà không cần thêm những cải tiến về mã nguồn
Trang 40• Các bộ nhớ chia sẻ: CUDA cho phép các luồng sử dụng 6 kiểu
bộ nhớ khác nhau được thiết kế để đáp ứng cho các yêu cầu khác nhau
• Barrier đồng bộ hóa: có chức năng đồng bộ hóa các luồng bên trong một khối đơn và tạo một luồng đợi các luồng khác để kết thúc công việc tính toán liên quan, trước khi tiếp tục công việc khác
C for CUDA làm cho CUDA có thể viết các hàm chạy trên GPU bằng việc sử dụng ngôn ngữ lập trình C Các hàm này được gọi là các “kernel”, được thực thi bởi mỗi luồng một cách song song, không như các hàm lập trình tuần tự thông thường được chạy chỉ một lần tại một thời điểm
Kiến trúc của CUDA cung cấp sự phân cấp luồng theo thứ tự trên xuống như sau:
1) Lưới (Grid): chứa các khối một hoặc hai chiều
2) Các khối (Blocks): chứa các luồng một, hai hoặc ba chiều GPU hiện tại cho phép một khối chứa tối đa 512 luồng Các khối được thực thi một cách độc lập và trực tiếp với các bộ xử lý có sẵn để phân chia tỷ lệ
3) Luồng (Thread): là phần tử thực thi cơ sở
Cấu trúc và sự phân cấp này được mô tả ở hình 2.4 dưới đây Ví dụ: nếu có 1048576 công việc cần xử lý một cách độc lập bằng cách song song và kích thước khối là 512, thì số khối là 2048 khối