Với mục đích xây dựng kiến trúc phần cứng cho một hệ thống siêu máy tính có tỷ lệ hiệu năng trên giá thành cao và kết hợp được sức mạnh tính toán song song đồ sộ từ bộ xử lý đồ họa GPU –
Trang 1LỜI CAM ĐOAN
Với mục đích nghiên cứu, học tập để nâng cao kiến thức và trình độ chuyên môn nên tôi đã làm luận văn này một cách hoàn toàn nghiêm túc và trung thực
Trong luận văn, tôi có sử dụng và trích dẫn từ một số tài liệu của các tác giả khác Tôi đã nêu trong phần tài liệu tham khảo ở cuối luận văn
Tôi xin cam đoan và chịu trách nhiệm về nội dung và sự trung thực trong luận văn tốt nghiệp Thạc sĩ của mình
Hà Nội, tháng 9 năm 2015
Học viên
Nguyễn Trí Trung
Trang 2LỜI CẢM ƠN
Đầu tiên, tôi xin bày tỏ lòng biết ơn chân thành và xin được gửi lời cám ơn sâu sắc nhất đến thầy giáo TS Nguyễn Kim Khánh, người đã trực tiếp hướng dẫn và định hướng cho tôi giải quyết các vấn đề khó khăn trong khi làm luận văn
Những kiến thức tôi trình bày trong luận văn này một phần là kết quả của hai năm tôi có cơ hội học tập chương trình thạc sĩ ở Viện Công nghệ Thông tin, đại học Bách Khoa Hà Nội Tôi xin gửi lời cám ơn chân thành đến các thầy cô giáo ở viện CNTT, phòng Đào tạo sau đại học, ĐHBK Hà Nội đã tạo điều kiện thuận lợi cho tôi trong thời gian học tập tại trường
Tôi cũng xin gửi lời cám ơn gia đình, người thân và bạn bè tôi vì luôn là nguồn động lực dồi dào giúp tôi có có thể hoàn thành luận văn này
Hà Nội, tháng 9 năm 2015
Trang 3MỤC LỤC
LỜI CAM ĐOAN 2
LỜI CẢM ƠN 3
MỤC LỤC 4
LỜI MỞ ĐẦU 7
DANH MỤC THUẬT NGỮ 8
DANH MỤC HÌNH VẼ BÀNG BIỂU 10
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 13
1.1 Nội dung đề tài 13
1.2 Phạm vi đối tượng của đề tài 13
1.3 Lý do và mục đích chọn đề tài 14
CHƯƠNG 2: TỔNG QUAN KIẾN TRÚC GPU 15
2.1 Lịch sử GPU 16
2.2 Kiến trúc GPU 26
2.2.1 Đường ống dẫn đồ họa (Graphics Pipeline) 27
2.2.2 Tiến hóa của kiến trúc GPU 32
2.2.3 Kiến trúc của GPU hiện đại 36
2.3 Tính toán trên GPU 38
2.3.1 Tổng quan về mô hình tính toán trên GPU 38
2.3.2 Cơ chế đa luồng của GPU 41
2.3.3 Kiến trúc đa lõi của GPU 42
2.4 Tổng kết GPU 47
CHƯƠNG 3: KIẾN TRÚC MÔ HÌNH TÍNH TOÁN CPU-GPU 48
3.1 Tổng quan về tính toán đa dụng GPU (GPGPU) 49
3.2 Giới thiệu về mô hình tính toán không đồng nhất CPU+GPU 50
3.3 Kiến trúc hệ thống tính toán không đồng nhất CPU-GPU 52
Trang 43.3.1 Kiến trúc tính toán CPU-GPU riêng biệt 52
3.3.2 Kiến trúc tính toán CPU-GPU hợp nhất 56
3.4 Cơ chế làm việc giữa GPU và GPU trong hệ tính toán không đồng nhất CPU-GPU 59 CHƯƠNG 4: SIÊU MÁY TÍNH VÀ MÔ HÌNH SIÊU MÁY TÍNH SỬ DỤNG KIẾN TRÚC TÍNH TOÁN CPU-GPU 62
4.1 Phân loại hệ thống máy tính 62
4.2 Lịch sử ra đời và phát triển của siêu máy tính 66
4.1.1 Thời kì đầu (1960-1969) 66
4.1.2 Thời kì sử dụng bộ xử lý vector (1970-1990) 67
4.1.3 Thời kì gần đây (1990-nay) 69
4.3 Phân loại hệ thống siêu máy tính 74
4.4 Hệ thống cụm máy tính 77
4.4.1 Phân loại mô hình cụm máy tính 77
4.4.2 Hệ thống máy tính cụm Beowulf 78
4.4.3 Hệ thống mạng/cụm máy tính trạm 80
4.5 Hệ thống siêu máy tính dựa trên mô hình máy tính cụm sử dụng kiến trúc tính toán CPU-GPU 81
4.5.1 Nút máy chủ và nút lưu trữ, quản lý thiết bị ngoại vi 83
4.5.2 Nút tính toán 83
4.5.3 Ưu nhược điểm của hệ thống siêu máy tính cụm Beowulf dựa trên kiến trúc tính toán CPU-GPU 84
CHƯƠNG 5: THỬ NGHIỆM ĐÁNH GIÁ HIỆU NĂNG KIẾN TRÚC TÍNH TOÁN CPU-GPU 87 5.1 Sự cần thiết của việc đánh giá hiệu năng hệ thống 87
5.2 Đánh giá hiệu năng của một nút tính toán trên bài toán tính toán độ dài cạnh huyền của nhiều tam giác vuông 88
5.2.1 Đặt vấn đề bài toán 88
Trang 55.2.2 Thông số cấu hình thử nghiệm 89
5.2.3 Kết quả thử nghiệm và đánh giá 91
5.3 Đánh giá hiệu năng của một nút tính toán trên bài toán sắp xếp dãy số 102
5.3.1 Thuật toán sắp xếp dựa trên cơ số 102
5.3.2 Thông số cấu hình thử nghiệm 107
5.3.3 Kết quả thử nghiệm và đánh giá 108
5.4 Đánh giá hiệu năng của một nút tính toán trên bài toán tính nhanh biến đổi Fourier 111 5.4.1 Biến đổi Fourier rời rạc và giải thuật tính nhanh biến đổi Fourier: 111
5.4.2 Kết quả thử nghiệm và đánh giá 113
5.5 Đánh giá hiệu năng của hệ thống siêu máy tính sử dụng kiến trúc CPU-GPU 120
KẾT LUẬN 123
TÀI LIỆU THAM KHẢO 125
Trang 6LỜI MỞ ĐẦU
Siêu máy tính đã trở thành thành một phần không thể thiếu trong các lĩnh vực nghiên cứu khoa học như nghiên cứu dự báo khí hậu thời tiết, khoa học vật liệu, v.v Tuy nhiên việc triển khai xây dựng một hệ thống siêu máy tính tiêu tốn rất nhiều thời gian và tiền của Đồng thời làn sóng tính toán đa dụng trên GPU (GPGPU - General Purpose GPU) mà mô hình kiến trúc tính toán không đồng nhất CPU-GPU là đại diện ngày càng đem lại nhiều kết quả khả quan trong lĩnh vực tính toán song song Với mục đích xây dựng kiến trúc phần cứng cho một hệ thống siêu máy tính có tỷ lệ hiệu năng trên giá thành cao và kết hợp được sức mạnh tính toán
song song đồ sộ từ bộ xử lý đồ họa (GPU – Graphic Processing Unit), tôi đã lựa
chọn đề tài “Giải pháp thiết kế và đánh giá hiệu năng siêu máy tính sử dụng GPU” Đề tài gồm các nội dung chính sau:
CPU-1 Tổng quan kiến trúc GPU và kiến trúc mô hình tính toán CPU-GPU: giới thiệu về lịch sử hình thành và phát triển của các thế hệ GPU, các kiến thức cơ bản
về kiến trúc của GPU cổ điển và GPU hiện đại ngày nay, từ đó đi vào giới thiệu tổng quan về cơ chế xử lý tính toán trên GPU và mô hình kiến trúc tính toán đa dụng CPU-GPU
2 Siêu máy tính và mô hình siêu máy tính sử dụng kiến trúc tính toán
CPU-GPU: giới thiệu lịch sử các thế hệ siêu máy tính, phân loại các hệ thống siêu máy tính và đề xuất mô hình siêu máy tính dựa trên mô hình máy tính cụm Beowulf và kiến trúc tính toán CPU-GPU
3 Các thử nghiệm đánh giá hiệu năng của một nút tính toán đơn lẻ trong hệ thống và đánh giá so sánh hiệu năng tính toán của hệ thống siêu máy tính sử dụng kiến trúc tính toán CPU-GPU và hệ thống siêu máy tính tương đương chỉ sử dụng CPU
Người thực hiện
Nguyễn Trí Trung
Trang 7DANH MỤC THUẬT NGỮ
trên nguyên lý transitor lƣỡng cực
6 PGA Professional Graphics Controller – bộ điều khiển đồ họa
chuyên nghiệp
máy tinh
9 SM Streaming Multiprocessor – bộ xử dòng lý đa lõi trong kiến
trúc GPU của NVIDIA
10 CUDA Compute Unified Device Architecture – mô hình lập trình tính
toán đa dụng trên GPU của NVIDIA
11 SIMT Single Instruction Multiple Thread – cơ chế đơn lệnh đa luồng
12 SIMD Single Instruction Multiple Data – cơ chế đơn lệnh đa dữ liệu
13 MIMD Multiple Instruction Multiple Data – cơ chế đa lệnh đa dữ liệu
14 SISD Single Instruction Single Data – cơ chế đơn lệnh đơn dữ liệu
15 MISD Multiple Instruction Single Data – cơ chế đa lệnh đơn dữ liệu
16 VGA Video Graphics Array – chuẩn xử lý đồ họa theo dãy để hiển
thị ra màn hình
17 DMA Dynamic Memory Access – hoạt động truy cập bộ nhớ trực
tiếp không qua CPU từ các thiết bị ngoại vi
Trang 818 DPP Data Parallel Processor Array – dãy bộ xử lý dữ liệu song song
(AMD)
19 VLIW Very Long Instruction Word – kiến trúc bộ xử lý thiết kế để
tận dụng cơ chế song song tầng chỉ thị lệnh
20 RISC RISC – Reduce Instruction set computer – kiến trúc bộ xử lý
thiết kế trên tập lệnh rút gọn
phối hợp với nhau (tương tự như định nghĩa luồng trong khối luồng của CUDA)
23 ALU Arithmetic Logic Unit – là các đơn vị xử lý các phép toán học
và logic
24 DFT Discrete Fourier Transform – biến đổi Fourier rời rạc
25 FFT Fast Fourier Transform – tính nhanh biến đổi Fourier rời rạc
bộ nhớ toàn cục và chia sẻ biến
bộ nhớ toàn cục và trao đổi bản tin
dụng bộ nhớ phân tán và chia sẻ biến
dụng bộ nhớ phân tán và trao đổi bản tin
31 NOW Network of Workstations – hệ thống máy tính cụm theo mô
hình mạng các máy trạm
33 SMP Symmetric Multiprocessing – hệ thống bộ xử lý đa lõi đối
xứng
Trang 9DANH MỤC HÌNH VẼ BÀNG BIỂU
DANH MỤC HÌNH VẼ
Hình 1: Screenshot của game DOOM giữa phiên bản 1 năm 2993 và phiên bản 4 năm 2014 15
Hình 2: Đường ống dẫn đồ họa cố định chức năng cổ điển 16
Hình 3: Xu hướng song song trong đường ống dẫn đồ họa ở những thời điểm đầu 18
Hình 4: Việc chuyển dần các chức năng trên đường ống dẫn đồ họa cho GPU 19
Hình 5: Kiến trúc của card GeForce 3 21
Hình 6: Kiến trúc cạc GeForce 6 22
Hình 7: Kiến trúc cạc GeForce 8 24
Hình 8: Kiến trúc Fermi 25
Hình 9: Kiến trúc của AMD Fusion 26
Hình 10: Đường ống dẫn đồ họa 27
Hình 11: Cơ chế tráo đổi giữa hai khung hình của GPU sử dụng bộ đệm đôi 30
Hình 12: Kiến trúc hợp nhất của GPU (GeForce 8800 với 112 bộ xứ lý dòng) 32
Hình 13: Shader hợp nhất – Tiến hóa của đường ống dẫn đồ họa 35
Hình 14: Sơ đồ khối kiến trúc GPU 37
Hình 15: Hệ thống phân cấp bộ nhớ và các đơn vị tính toán 40
Hình 16: Kiến trúc đa luồng của bộ xử lý đa nhân 43
Hình 17: Sắp xếp cuộn đa luồng SIMT 44
Hình 18: Bộ gửi chỉ thị lệnh kép trong kiến trúc Kepler 45
Hình 19: So sánh Sun UltraSPARC T2 với một chip Tesla, 8 Lõi SM 46
Hình 20: Mô hình tính toán không đồng nhất CPU+GPU (1) 50
Hình 21: Mô hình tính toán không đồng nhất CPU+GPU (2) 51
Hình 22: Kiến trúc máy tính những năm 1990 53
Hình 23: Sơ đồ khối máy tính với GPU (a) Sơ đồ khối máy tính với CPU Intel (b): Sơ đồ khối máy tính với CPU AMD 53
Hình 24: Liên kết NVLink 56
Hình 25: Sơ đồ khối CPU GPU riêng biệt 57
Hình 26: Kiến trúc Fusion của AMD 58
Hình 27: Kiến trúc hợp nhất giữa CPU và GPU trên một bảng mạch 59
Hình 28: Phương thức hoạt động giữa host và device 60
Trang 10Hình 29: Lịch trình cho các kịch bản CPU-GPU (a): đơn luồng, một nhân GPU với một GPU (b):
đơn luồng, hai nhân GPU với một GPU; (c): đa nhân GPU với nhiều GPU 61
Hình 30: Mô hình phân loại hệ thống máy tính Flynn-Johnson 65
Hình 31: Mô hình phân loại hệ thống máy tính MIMD của Tanenbaum 66
Hình 32: Siêu máy tính Cray-1 với thiết kế hình trụ, đảm bảo khoảng cách giữa vi xử lí với các thành phần khác trong hệ thống là đều nhau 68
Hình 33: Hệ thống máy tính cụm 76
Hình 34: Phân loại hệ thống máy tính sử dụng bộ nhớ phân tán và trao đổi bản tin của Thomas L Sterling 77
Hình 35: Kiến trúc hệ thống máy tính cụm 78
Hình 36: Mô hình siêu máy tính loại Beowulf sử dụng kiến trúc tính toán CPU-GPU 82
Hình 37: Kiến trúc của nút tính toán trong hệ thống 84
Hình 38: Màn hình hiển thị lúc chạy chương trình 91
Hình 39: File dữ liệu của chương trình 92
Hình 40: Thời gian xử lý của CPU khi thay đổi số lần lặp lại tính toán và độ dài mảng (1) 93
Hình 41: Thời gian xử lý của CPU khi thay đổi số lần lặp lại tính toán và độ dài mảng (2) 93
Hình 42: Thời gian xử lý của CPU-GPU khi thay đổi độ dài mảng xử lý và số lần lặp lại tính toán (1) 94
Hình 43: Thời gian tính toán của CPU-GPU khi thay đổi độ dài mảng xử lý và số lần lặp lại tính toán (2) 95
Hình 44: Thời gian xử lý của CPU-GPU khi thay đổi độ dài mảng xử lý và số lần lặp lại tính toán (2) 96
Hình 45: Tỷ lệ giữa thời gian xử lý của CPU và CPU-GPU khi thay đổi độ dài mảng và số lần lặp lại tính toán (1) 98
Hình 46: Tỷ lệ giữa thời gian xử lý của CPU và GPU khi thay đổi độ dài mảng và số lần lặp lại tính toán (2) 98
Hình 47: Thời gian thực thi bài toán trên GPU khi thay đổi kích cỡ khối và lưới ô khối 100
Hình 48: Tính tổng liền trước trên GPU – giai đoạn 1 104
Hình 49: Tính tổng liền trước trên GPU – giai đoạn 2 105
Hình 50: Thuật toán sắp xếp dựa trên cơ số trên GPU 106
Hình 51: Thời gian sắp xếp mảng theo thuật toán sắp xếp dựa trên cơ số 109
Hình 52: Tỷ lệ thời gian xử lý CPU/GPU khi thay đổi độ dài mảng xử lý 110
Hình 53: Sơ đồ FFT 8 điểm phân chia theo thời gian 113
Trang 11Hình 54: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng một chiều có độ dài là
hàm mũ của 2 114
Hình 55: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng một chiều có độ dài là hàm mũ của 3 115
Hình 56: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng một chiều có độ dài là hàm mũ của 5 115
Hình 57: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng một chiều có độ dài là hàm mũ của 7 116
Hình 58: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng một chiều có độ dài tùy ý 116
Hình 59: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng hai chiều có độ dài là hàm mũ của 2 117
Hình 60: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng hai chiều có độ dài tùy ý 118
Hình 61: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng ba chiều có độ dài là hàm mũ của 2 118
Hình 62: Thời gian tính toán FFT trên CPU và CPU-GPU với mảng ba chiều có độ dài tùy ý 119
DANH MỤC BẢNG BIỂU Bảng 1: So sánh tổng quan giữa CPU và GPU 48
Bảng 2: Bảng tổng hợp tốc độ tính toán của các mẫu siêu máy tính thời kì 1943-1969 67
Bảng 3: Bảng tổng hợp tốc độ tính toán của các mẫu siêu máy tính thời kì 1969-1990 69
Bảng 4: Bảng tổng hợp tốc độ tính toán của các mẫu siêu máy tính thời kì 1995-nay 70
Bảng 5: Thời gian thực hiện bài toán trên CPU với độ dài mảng và số lần lặp lại tính toán thay đổi 92
Bảng 6: Hiệu thời gian xử lý của GPU trong hai lần chạy đầu tiên 95
Bảng 7: Thời gian thực thi bài toán trên CPU-GPU khi thay đổi độ dài mảng và số lần lặp lại tính toán 96
Bảng 8: Tỷ lệ giữa thời gian xử lý của CPU và GPU khi thay đổi độ dài mảng và số lần lặp lại tính toan 97
Bảng 9: Thời gian thực thi bài toán trên CPU-GPU khi thay đổi kích cỡ khối và lưới ô khối 99
Bảng 10: Thời gian xử lý bài toán sắp xếp dựa trên cơ số khi thay đổi số phần tử mảng đầu vào (1) 109
Bảng 11: Thời gian xử lý bài toán sắp xếp dựa trên cơ số khi thay đổi số phần tử mảng đầu vào (2) 110
Trang 12CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI
1.1 Nội dung đề tài
Đề tài bắt đầu bằng việc giới thiệu kiến thức về lịch sử phát triển của GPU từ kiến trúc nguyên thủy của những chiếc GPU đầu tiên cho đến những thế hệ GPU hiện đại ngày nay, từ đó giúp cho người đọc có một mạch kiến thức xuyên suốt để hiểu rõ nguyên nhân kiến trúc GPU được thiết kế có tính chất song song cao cấp cũng như hướng phát triển của kiến trúc GPU trong tương lai gần
Nội dung chính của đề tài là nghiên cứu giải pháp thiết kế và đánh giá hiệu năng siêu máy tính sử dụng CPU-GPU, một hệ thống siêu máy tính dựa trên mô hình máy tính cụm Beowulf và tận dụng kiến trúc tính toán không đồng nhất CPU-GPU nhằm đạt mục đích xây dựng một hệ thống siêu máy tính có tỷ lệ hiệu năng trên chi phí hợp lý Đề tài đánh giá, so sánh hiệu năng của một hệ thống siêu máy tính sử dụng kiến trúc CPU-GPU với một hệ thống siêu máy tính tương đương chỉ
sử dụng CPU dựa trên một số thử nghiệm đánh giá hiệu năng của một nút tính toán
sử dụng kiến trúc CPU-GPU trên các bài toán được trải rộng từ xử lý trên số nguyên đến xử lý trên số thực dấu phẩy động, từ bài toán có thuật toán đơn giản đến bài toán có thuật toán tương đối phức tạp
1.2 Phạm vi đối tượng của đề tài
Hiện nay, việc phát triển các hệ thống siêu máy tính ở Việt Nam vẫn là chuyện
“xưa nay hiếm” vì quy mô, nguồn lực, trình độ công nghệ và chi phí để phát triển một hệ thống như vậy là quá sức đối với phần lớn đơn lẻ các tổ chức, đơn vị ở Việt Nam
Mục đích cuối cùng của đề tài này là xây dựng ra một hệ thống siêu máy tính khả dụng ở Việt Nam với chi phí hợp lý và đảm bảo hiệu năng cho các lĩnh vực nghiên cứu khoa học như nghiên cứu khí tượng, khoa học vật liệu và quân sự như giải mã các bản tin tình báo, v.v… Tuy nhiên việc thiết kế một hệ thống siêu máy tính bao gồm rất nhiều công đoạn từ thiết kế kiến trúc phần cứng đến kiến trúc
Trang 13mạng kết nối, các giao thức kết nối, hệ điều hành, các giao thức liên lạc trong tính toán song song, v.v… cần nhiều nguồn lực và thời gian hơn nên đề tài chỉ tập trung vào mảng thiết kế kiến trúc phần cứng cơ bản tận dụng ưu điểm của mô hình máy tính cụm Beowulf và kiến trúc tính toán CPU-GPU rồi đánh giá so sánh hiệu năng của hệ thống siêu máy tính sử dụng kiến trúc tính toán CPU-GPU và một hệ thống siêu máy tính tương đương chỉ sử dụng CPU Đề tài thích hợp với những người cần tìm hiểu về kiến trúc tính toán CPU-GPU, tính toán đa dụng GPU hoặc những người đang tìm hiểu về siêu máy tính hoặc đang có ý định xây dựng một hệ thống siêu máy tính mà chưa biết nên bắt đầu từ đâu
1.3 Lý do và mục đích chọn đề tài
Những lợi ích của việc sở hữu một siêu máy tính đối với một trường đại học hay một quốc gia là không thể chối cãi nhưng việc xây dựng nên một hệ thống siêu máy tính lại quá phức tạp, tiêu tốn nhiều chi phí, thời gian và tài nguyên
Do vậy, việc xây dựng một hệ thống siêu máy tính đảm bảo tỷ lệ giữa hiệu năng
và chi phí ở mức chấp nhận được là rất quý giá đối với những tổ chức hoặc quốc gia
có nguồn chi phí đầu tư giới hạn cho dự án như chúng ta Hơn nữa việc sử dụng các thiết bị thương mại, tối thiểu hóa thiết bị tính toán song song chuyên dụng trong mô hình tính toán cụm đang chiếm xu thế trong giới công nghệ tính toán hiệu năng cao Song song với xu hướng này, việc tính toán đa dụng trên GPU cũng đang trở nên dễ dàng hơn vì các giao diện lập trình cho GPU ngày càng được phát triển cho mục đích tính toán đa dụng Nhận thấy việc kết hợp hai xu thế đang phổ biến đó sẽ tạo nên một hệ thống siêu máy tính hứa hẹn đem lại hiệu năng cao mà vẫn giữ chi phí đầu tư ở mức phù hợp nên tôi đã lựa chọn đề tài “Giải pháp thiết kế và đánh giá hiệu năng siêu máy tính sử dụng kiến trúc CPU-GPU” Tôi hi vọng những kiến thức
và kết quả thí nghiệm cũng những đánh giá trong đề tài của tôi sẽ làm tiền đề giúp cho những người quan tâm nhận thấy được việc xây dựng một hệ thống siêu máy tính là hoàn toàn cần thiết và khả thi đối với người Việt Nam chúng ta
Trang 14CHƯƠNG 2: TỔNG QUAN KIẾN TRÚC GPU
GPU là bộ vi xử lý chuyên dụng song song cao cấp để giảm tải và tăng tốc cho việc tái tạo lại không gian 2D, 3D cho đơn vị xử lý trung tâm (CPU) GPU được triển khai ở nhiều thiết bị khác nhau từ máy tính bàn tới laptop, điện thoại di động cho đến các siêu máy tính
Kiến trúc GPU đã phát triển nhanh trong những năm gần đây, một phần do yêu cầu về xử lý đồ họa ngày càng cao Nhu cầu về việc xử lý đồ họa của các trò chơi ở máy tính hiện đại và các công cụ giả lập khoa học tăng trưởng đều đặn trong 2 thập niên gần đây Tuy nhiên tốc độ và độ sâu của sự phát triển của GPU trong những năm gần đây cũng bị ảnh hưởng bởi nhu cầu sử dụng GPU cho mục đích tính toán
Trang 15này đã làm ranh giới về vai trò giữa CPU và GPU trở nên mờ nhạt hơn, giúp cho GPU hướng về mục đích tính toán hơn, gần với vai trò của CPU hơn
GPU nguyên thủy dựa trên mô hình đường ống dẫn đồ họa Đường ống dẫn đồ họa là một mô hình khái niệm các tầng/lớp mà dữ liệu đồ họa đi qua và thường triển khai dựa trên sự kết hợp giữa phầm mềm CPU (OpenGL, DirectX) và phần cứng GPU (nhân GPU) Cách tiếp cận dựa trên thiết kế mô hình đường ống dẫn đồ họa này tương đối đồng bộ giữa phần lớn các nhà sản xuất GPU như NVIDIA, ATI, v.v… và giúp đẩy nhanh sự thừa nhận công nghệ GPU
Đường ống dẫn chỉ đơn giản nhằm mục đích chuyển không gian 3D (được tạo
ra bởi người lập trình) vào không gian 2D trên màn ảnh Về mặt cơ bản nó là dòng tái tạo rất nhiều giai đoạn của các hoạt động lên các pixel, tam giác và có thể được phân loại thành 2 giai đoạn chính: hình học và tái tạo ảnh Chi tiết về đường ống dẫn đồ họa sẽ được trình bày ở mục 2.2.1
Hình 2: Đường ống dẫn đồ họa cố định chức năng cổ điển
Trang 16Các GPU đời đầu thường chỉ triển khai giai đoạn tái tạo ảnh ở phần cứng của GPU và do đó CPU phải tạo ra các tam giác hình học để GPU làm việc trên đó Với việc phát triển trong công nghệ GPU, các giai đoạn ngày càng được triển khai trực tiếp trên phần cứng của GPU từ đó giải phóng tài nguyên của CPU
2.1.1 1980
Quay trở về những năm 1980, GPU ở thời điểm đó chỉ là những bộ đệm tích hợp Chúng chỉ là những bảng mạch logic TTL dựa trên CPU và chỉ có thể vẽ các khung dây để tái tạo kết cấu [7] Thuật ngữ “GPU” chưa được sử dụng cho đến năm
1999 bởi NVIDIA nhưng để đảm bảo tính đồng bộ của bài viết nên từ GPU sẽ được
sử dụng xuyên suốt bài viết
Bộ điều khiển đồ họa chuyên nghiệp IBM (PGA) là một trong những cạc đồ họa 2D/3D đầu tiên cho PC PGA sử dụng chip Intel 8088 tích hợp trên bo mạch chủ để xử lý toàn bộ các yêu cầu liên quan đến hình ảnh, giải phóng CPU khỏi việc
xử lý hình ảnh (ví dụ như việc vẽ và tô màu cho các đa giác) [7] Vì thời điểmra đời vào năm 1984, mười năm trước khi các thiết bị tăng tốc xử lý 2D/3D được chuẩn hóa và với cái giá không hề rẻ 5500$ cùng với sự hạn chế trong tương thích với các
hệ thống ngoài IBM vào thời điểm đó đã dẫn đến một kết quả tất yếu là PGA không thể đạt được thành công trong việc chiếm lĩnh thị trường Tuy nhiên sự ra đời của PGA đã đánh dấu một bước tiến lớn trong công nghệ phát triển GPU khi việc xử lý
đồ họa lần đầu được tách ra xử lý trên một đơn vị xử lý riêng
Vào năm 1987, các GPU đời đầu được tích hợp thêm các chức năng mới như khối đổ bóng, ánh sáng đỉnh, tái tạo kết cấu cho các đa giác và bộ đệm chiều sâu pixel và trộn màu Tuy nhiên vẫn còn nhiều tác vụ tính toán được chia sẻ với CPU Vào cuối thập niên 1980, Công ty đồ họa Silicon (SGI) được thành lập với tư cách một công ty phần mềm và phần cứng đồ họa máy tính hiệu suất cao SGI giới thiệu OpenGL vào 1989, và từ đó được biết đến như một giao diện lập trình ứng dụng 2D/3D không phụ thuộc vào nền tảng phần cứng, được sử dụng và hỗ trợ nhiều nhất trong nền công nghiệp đồ họa Việc hỗ trợ OpenGL trở thành vấn đề rắc
Trang 17rối nhất trong việc thiết kế một phần cứng đồ họa hiện đại Đồng thời SGI cũng là người tiên phong trong việc đưa ra khái niệm đường ống dẫn đồ họa
2.1.2 Thế hệ 0
Phần cứng GPU và đường ống dẫn đồ họa bắt đầu hình thành vào năm 1993 khi SGI tung ra bảng mạch RealityEngine cho việc xử lý đồ họa RealityEngine bao gồm các bảng mạch và các chip logic khác nhau cho các giai đoạn khác nhau trong đường ống dẫn đồ họa nhưng nửa đầu của đường dẫn vẫn là công việc của CPU Dữ liệu di chuyển trong đường ống dẫn có luồng cố định qua các trạng thái
Giữa những năm 1990, cạc SGI được triển khai chủ yếu trên các máy trạm, trong khi đó các nhà sản suất thiết bị đồ họa 3D như 3DFX (Voodoo), NVIDIA (TNT), ATI (Rage) và Matrox đã bắt đầu cung cấp cho người tiêu dùng các bảng mạch đồ họa 3D Sự kết hợp giữa phần cứng rẻ hơn và các game như Quake và Doom đã thúc đẩy ngành công nghiệp game và sự thừa nhận GPU
Hình 3: Xu hướng song song trong đường ống dẫn đồ họa ở những thời
điểm đầu
Trang 18Kể cả với những đường ống dẫn đồ họa tốt nhất ở thời điểm đó thì các GPU đời đầu chỉ có thể tạo ra một pixel một chu kì đồng hồ, điều đó có nghĩa là CPU có thể gửi nhiều tam giác tới GPU hơn khả năng xử lý của GPU Điều đó đã dẫn đến nhu cầu tạo ra nhiều đường dẫn song song tới GPU (và cuối cùng là thêm nhân trong kiến trúc GPU) để nhiều pixel có thể cùng được xử song song trong một chu kì đồng hồ
2.1.3 Thế hệ 1
Voodoo 3dfx là cạc đồ họa 3D thật sự đầu tiên và nó chỉ tăng tốc xử lý 3D do
đó bạn vẫn cần một bộ tăng tốc xử lý 2D Cạc hoạt động trên đường bus PCI, có 1 triệu bán dẫn, 4 MB DRAM 64 bit, xung đồng hồ hoạt động ở tần số 50 MHz, CPU vẫn phải xử lý chuyển hóa đỉnh, trong khi đó Voodoo sẽ thực hiện việc tạo bản đồ kết cấu, z-buffering và việc tái tạo kết cấu [7]
2.1.4 Thế hệ 2
Trong năm 1999, với việc giới thiệu NVIDIA Geford 256 và ATI Radeon 7500, giới tiêu dùng lần đầu tiên được sử dụng các GPU đúng nghĩa, cho phép triển khai toàn bộ đường ống dẫn đồ họa ở phần cứng của GPU được phát hành
Hình 4: Việc chuyển dần các chức năng trên đường ống dẫn đồ họa cho
GPU
Trang 19Cho đến tận năm 1999, thuật ngữ GPU vẫn chưa thực sự tồn tại và NVIDIA đã sáng tạo ra thuật ngữ này khi cho ra đời mẫu Geford 256 Geford 256 có 23 triệu bán dẫn, 32 MB DRAM 128 bit, xung đồng hồ ở tần số 120MHz và có 4 đường dẫn 64 bit để tái tạo kết cấu [7]
Thế hệ cạc này là thế hệ đầu tiên sử dụng cổng tăng tốc đồ họa (AGP) thay cho bus PCI và cung cấp thêm các chức năng mới như bản đồ bump, bản đồ ánh sáng và chuyển đổi hình học ở phần cứng và xử lý ánh sáng
Đường ống dẫn đồ họa đầu tiên trong phần cứng được biết đến như đường ống dẫn cố định chức năng vì một khi người lập trình gửi dữ liệu đồ họa tới đường dẫn GPU thì dữ liệu không thể chỉnh sửa
Với những chiếc cạc này, thị trường phần cứng GPU và trò chơi máy tính thực
sự được khai phá, Trong khi tốc độ được cải thiện nhưng vấn đề chính lại nằm ở việc cố định chức năng ở mô hình đường ống dẫn đồ họa tạo nên sự thiếu linh động trong các hiệu ứng đồ họa Vì bộ các chức năng được định nghĩa bởi giao diện lập trình ứng dụng OpenGL và DirectX được triển khai ở phần cứng, do đó khi các chức năng mới được thêm vào giao diện lập trình ứng dụng đồ họa thì các phần cứng cố định chức năng sẽ không thể tận dụng được các ưu điểm của các chức năng mới
2.1.5 Thế hệ 3
Vào năm 2001, NVIDIA phát hành GeForce 3 cho phép lập trình viên có thể lập trình được những giai đoạn ở đường ống dẫn đồ họa mà trước đây chưa hỗ trợ, đánh dấu bước phát triển tiếp theo trong công nghệ GPU Thay vì việc gửi tất cả dữ liệu
mô tả đồ họa cho GPU và đơn giản cho nó đi qua các đường dẫn cố định thì nay lập trình viên có thể gửi dữ liệu này cùng với các “phần mềm ngắn” (gọi là shader) để hoạt động trên dữ liệu trong đường dẫn
Trang 20Các phần mềm này có thể gọi là các nhân nhỏ (kernel), được viết trên các ngôn ngữ tương tự như ngôn ngữ assembly Đây là một cải tiến mới nên chỉ có thể lập trình giới hạn ở giai đoạn xử lý đỉnh của đường ống dẫn Các cạc đồ họa khác thịnh hành ở thời điểm này là ATI Radeon 8500 và Microsoft Xbox
Hình 5: Kiến trúc của card GeForce 3
GeFord 3 có 57 triệu bán dẫn, 64 MB DDR DRAM 128 bit và có xung đồng hồ
là 120MHz [7]
2.1.6 Thế hệ 4
Một năm sau đó, năm 2002, cạc đồ họa đầu tiên hỗ trợ lập trình toàn phần được tung ra thị trường: NVIDIA Geforce FX, ATI Radeon 9700 Cạc này cho phép xử lý từng pixel với các đổ bóng đỉnh và pixel (phân mảnh) hỗ trợ lập trình và cho phép một lượng ánh xạ giữa dữ liệu đầu vào và đầu ra nhất định được định nghĩa bởi người sử dụng Ngoài ra, phần cứng chuyên biệt cũng được gán cho việc đổ bóng đỉnh và pixel
Cạc đồ họa GeForce FX có 80 triệu bán dẫn, 128 MB DDR DRAM 128 bit và xung đồng hồ 400MHz [7] Năm 2003, cơn sóng tính toán trên nền GPU đầu tiên được hình thành với việc giới thiệu DirectX 9, bằng cách tận dụng khả năng lập trình được của phần cứng GPU nhưng cho dữ liệu không phải đồ họa Việc hỗ trợ
Trang 21phép toán dấu phẩy động và xử lý kết cấu cấp cao bắt đầu được cung cấp ở các cạc
đồ họa ở thời điểm này
Về mặt phần cứng, độ chính xác cũng được nâng cao (hỗ trợ độ chính xác kép 64 bit), bộ đệm kết xuất đồ họa, kích thước bộ nhớ GPU được tăng thêm và truy nhập kết cấu được giới thiệu
Hình 6: Kiến trúc cạc GeForce 6
Chiếc cạc GeForce 6 đầu tiên có 146 triệu bán dẫn, 256 MB GDDR3 DRAM
256 bit, và xung đồng hồ 500MHz [7]
Trang 22Khi nhìn GPU theo kiến trúc một đường ống dẫn đồ họa thì GPU bao gồm: một engine đỉnh, một engine phân mảnh, engine kết cấu, engine ghi-trộn dữ liệu, so sánh
dữ liệu Khi nhìn GPU như một bộ xử lý cho các ứng dụng không về đồ họa thì GPU có thể được coi là một động cơ có mã lực lớn trong việc xử lý các phép toán dấu phẩy động lập trình được và độ rộng băng nhớ có thể được tận dụng cho các ứng dụng tính toán phức tạp hoàn toàn không liên quan đến đồ họa máy tính Từ đó
xu hướng tính toán trên GPU bắt đầu được nhen nhóm
2.1.8 Thế hệ 6
Việc giới thiệu seri NVIDIA GeForce 8 vào năm 2006 đánh dấu bước tiếp theo trong sự phát triển của GPU: mở ra vai trò mới của GPU như một bộ xử lý song song đồ sộ
Kiến trúc G80 (GeForce 8800) là kiến trúc đầu tiên có các chương trình shader
hỗ trợ lập trình, hợp nhất tức là một bộ xử lý hợp hỗ trợ lập trình gọi là Streaming Multiprocessor - Lõi dòng đa nhân hoặc SM, có thể giải quyết việc tính toán đỉnh, pixel và hình học, đồng thời cũng tích hợp shader hình học mới, khả năng hỗ trợ lập trình được mở rộng khi kết hợp shader đỉnh và shader pixel Với thiết kế phần cứng shader hợp nhất, mô hình đường ống dẫn đồ họa nay thuần túy nay chỉ còn là một cách nhìn phần mềm trừu tượng
Cạc GeForce 8 đầu tiên có 681 triệu bán dẫn, 768 MB GDDR3 DRAM 384 bit
và xung đồng hồ 600MHz [7]
Để khai thác tất cả sức mạnh cho việc tính toán đa dụng của GPU, NVIDIA tung ra ngôn ngữ lập trình CUDA cho riêng sản phẩm của NVIDIA Không lâu sau, ngôn ngữ ATI Stream cho card ATI và DirectX 10 cho cả 2 loại cạc cũng được giới thiệu
Trang 23Hình 7: Kiến trúc cạc GeForce 8 2.1.9 Thế hệ 7
Theo xu hướng đồng hóa với CPU, các nhân GPU lập trình được với sự phát hành kiến trúc Fermi của NVIDIA Được giới thiệu vào cuối năm 2009, và được phát hành vào đầu năm 2010, GPU Fermi được coi là chiếc GPU đầu tiên được thiết
kế cho nhu cầu tính toán GPGPU, đem đến các chức năng mới như: phân cấp bộ đệm thực sự, khoảng địa chỉ bộ nhớ thống nhất, việc thực thi các kernel đồng thời, hiệu suất thực hiện các phép toán có độ chính xác kép tốt hơn và bộ sắp xếp cuộn đôi Fermi GTX480 có tổng cộng 480 nhân CUDA (15 luồng đa xử lý dòng x 32 nhân CUDA mỗi dòng) [25]
Trang 24và mở rộng băng thông bộ nhớ thêm một chút [7]
Công cuộc phát triển GPU đã đi từ một thiết bị phần cứng cố định chức năng, đơn nhân và dựa trên mô hình đường ống dẫn đồ họa và dành riêng cho mục đích
xử lý đồ họa nay đã trở thành một tập các nhân song song cấp cao lập trình được cho các mục đích tính toán chung Hiện nay, kiến trúc đa nhân của GPU có rất nhiều điểm tương đồng với các CPU cho mục đích tính toán chung Fermi có thể coi như một CPU 16 lõi với 32 siêu đường dẫn mỗi nhân với độ dài của một vector lớn
Trang 25Gần đây, AMD công bố dòng Fusion của CPU+GPU trên cùng 1 khuôn mạch (APU lồng, đơn vị tăng tốc xử lý), được phát hành vào năm 2011 APU của AMD được thiết kế để một bộ xử lý x86 chuẩn cho việc tính toán vô hướng và DX11 GPU cho việc tính toán vector được đặt chung trên 1 khuôn mạch [3]
Hình 9: Kiến trúc của AMD Fusion
Bộ xử lý Larrabee của Intel cũng mang đến nhiều nhân x86 nhỏ hơn trên cùng một khuôn đơn CPU Intel SandyBridge cũng tích hợp một GPU và cùng chia sẻ bộ nhớ đệm L3 [35]
Với sự phát triển mạnh mẽ trong kiến trúc GPU như vậy làm dấy lên câu hỏi: nếu việc tích hợp CPU-GPU là xu hướng, vậy thì loại thiết bị cố định chức năng trên GPU có tồn tại nữa không? Có cần có sự phân biệt giữa CPU và GPU nữa không? Các ngôn ngữ lập trình tương lai có khả năng trừu tượng hóa GPU như bộ
xử lý đa nhân cho các ứng dụng không?
GPU luôn luôn là một bộ xử lý dư thừa tài nguyên tính toán Tuy nhiên phải đến gần đây việc giúp cho các lập trình viên có thể tận dụng được khả năng tính toán đó mới được chú ý Trong một thời gian ngắn, GPU đã phát triển từ một thiết
Trang 26bị phần cứng với bộ phận có chức năng cố định, bộ xử lý chuyên dụng cho xử lý đồ họa tới bộ xử lý song song, đầy đủ tính năng độc lập cộng với việc bổ sung thêm các chức năng cố định hỗ trợ lập trình, và các chức năng chuyên biệt Các khía cạnh
về khả năng hỗ trợ lập trình của bộ xử lý đang chiếm vị trí trung tâm hơn bao giờ hết
2.2.1 Đường ống dẫn đồ họa (Graphics Pipeline)
Công việc của bất kì một hệ thống đồ họa 3D nào là tổng hợp ra một hình ảnh
từ mô tả của một khung cảnh 60 lần một giây cho các ứng dụng đồ họa thời gian thực ví dụ như video game Khung cảnh sẽ được phân tích thành các hình học nguyên thủy cũng như mô tả sự chiếu sáng của ánh sáng trong khung cảnh, cách mà từng vật thể phản xạ lại ánh sáng như thế nào và vị trí và hướng của người nhìn Các nhà thiết kế GPU thường trừu tượng hóa công đoạn tổng hợp hình ảnh này thành một đường ống dẫn phần cứng với các giai đoạn chuyên biệt Các thế hệ GPU mới tuy đã trải qua nhiều sự cải tiến nhưng chúng vẫn tuân theo kiến trúc đường ỗng dẫn đồ họa được công bố vào cuối năm 1980 bởi công ty Silicon Graphics (hiện tại là SGI nhưng không còn hoạt động trong mảng đồ họa 3D) Hình vẽ dưới đây
mô tả kiến trúc đường ống dẫn đồ họa kinh điển ở mức độ tổng quan
Hình 10: Đường ống dẫn đồ họa
Trang 27Dữ liệu đầu vào
Dữ liệu gốc của GPU là các tam giác Mặc dù với sự phát triển của công nghệ phần cứng hiện tại, GPU đã hỗ trợ xử lý dữ liệu đầu vào đường ống dẫn đồ họa là các khối, các bề mặt tuy nhiên tam giác vẫn là thành phần phổ biến nhất Do đó việc đầu tiên là phải cắt các hình học phức tạp thành các tam giác (Ví dụ như từ các đa giác hoặc các hình có bề mặt cong,…) Những nhà phát triển sử dụng thư viện đồ họa máy tính (ví dụ như OpenGL hoặc Direct3D) để cung cấp từng tam giác tới đường ống dẫn đồ họa qua các tọa độ đỉnh, GPU sẽ sử dụng các tọa độ này để tái tạo lại tam giác khi cần Mô hình mạng lưới tam giác đặc trưng bởi: tọa độ các đỉnh, véc tơ pháp tuyến và đôi khi là cả tọa độ bề mặt Các ma trận bậc 4 được sử dụng để chuyển hóa các tọa độ đỉnh đồng nhất từ không gian vật thể sang không gian màn hình và để thể hiện cảnh vật theo luật phối cảnh Vật liệu và ánh sáng sẽ được xác định trong quá trình giả lập sự chiếu sáng và phản xạ đồng thời các hình ảnh bề mặt cũng đóng vai trò rất quan trọng trong việc dựng lại các hình 3D phức tạp mà vẫn giữ độ phức tạp hình học của khung cảnh ở mức độ đơn giản hợp lý
Trang 28Cắt
Sau quá trình chuyển hóa từ không gian 3D sang 2D, một số tam giác có thể bị tràn ra ngoài khung màn hình do đó công đoạn này được khiển khai để cắt bớt các tam giác bằng cách loại bỏ phần ở ngoài khung màn hình đồng thời trong quá trình cắt cũng tạo ra các tam giác và các đa giác khác tam giác để chuẩn bị cho bước chiết xuất cuối cùng
Khởi tạo các tam giác
Để chuẩn bị cho bước cuối cùng, các tam giác được chia ra thành các đoạn có
độ rộng một pixel, gọi là gang Tọa độ hai điểm đầu cuối của một gang là kết quả của phép nội suy giữa các đỉnh của tam giác
Tái tạo điểm ảnh (Bitmap hóa – Rasterization)
Là công đoạn chuyển thể các hình khối từ dạng véc tơ sang dạng điểm ảnh, xác định những vị trí điểm ảnh nào trong không gian màn hình được bao chứa bởi mỗi tam giác Mỗi tam giác tạo ra một hình học nguyên thủy được gọi là "mảnh" tại các
vị trí điểm ảnh trong không gian màn hình mà nó bao chứa Và do nhiều tam giác có thể chồng lên nhau tại một vị trí điểm ảnh bất kỳ nên giá trị màu của mỗi điểm ảnh
có thể được tính từ nhiều mảnh Các nhà phát triển GPU đã hợp nhất nhiều thuật toán tái tạo điểm ảnh lại với nhau nhằm có thể thu được một kết quả quan trọng: từng điểm ảnh có thể được xử lý độc lập với tất cả các điểm ảnh khác Do đó máy tính có thể tính toán tất cả các pixel song song thậm chí một vài máy tính còn có riêng một bộ xử lý cho từng pixel Sự độc lập thống nhất này từ giai đoạn chuyển hóa đến tái tạo điểm ảnh thôi thúc các nhà phát triển GPU xây dựng các bộ đường ống dẫn đồ họa song song
Bộ đệm Z (bộ đệm chiều sâu)
Bộ đệm Z hay còn gọi là bộ đệm chiều sâu đóng vai trò quản lý chiều sâu của hình ảnh Nó quyết định tính chất nhìn thấy được hay không của sự vật được dựng lại trong khung hình
Khi một vật được dựng lại thì chiều sâu của pixel (tọa độ trục z) được lưu trữ ở trong bộ đệm Z Bộ đệm thường lưu giá trị mảng hai chiều (x-y) với mỗi một pixel
Trang 29sẽ có một giá trị tương ứng Nếu một vật thể khác trong khung cảnh dựng lại cũng ở
vị trí pixel đó thì sẽ so sánh chiều sâu hiện tại của pixel đó đang được lưu ở bộ đệm Nếu vật thể đó ở gần người xem hơn (vị trí quan sát khung cảnh) thì giá trị chiều sâu mới sẽ được cập nhật vào bộ đệm
Bộ đệm đôi
Ngoài ra có một bộ đệm khung để lưu trữ dữ liệu của pixel Dữ liệu một pixel lưu trữ ở bộ đệm này gồm giá trị màu RGB và giá trị alpha (A) được sử dụng để hỗ trợ các tính năng mặt nạ trong suốt và mặt nạ bóng trong các trường hợp cần kết hợp nhiều bức ảnh lại với nhau Để đảm bảo màn hình có thể hiển thị trong khi một bức ảnh được dựng lại kể cả trong trường hợp thời gian để dựng lại một khung hình lâu hơn tốc độ làm tươi của màn hình (thông thường là 60Hz) khi đó bộ nhớ đệm đôi được sử dụng
Hình 11: Cơ chế tráo đổi giữa hai khung hình của GPU sử dụng bộ đệm
đôi
Trước đây, công đoạn dựng lại khung hình và gửi khung hình tới màn hình được GPU thực hiện một cách song song Còn đối với bộ đệm đôi GPU chỉ tập trung vào việc dựng lại khung hình (tạm gọi là “sau”) và gửi đi thông tin về khung hình “trước” cho màn hình do đó tránh được việc dựng và gửi dữ liệu của cùng một khung hình trong một thời điểm Trong khi khung hình RBGA “trước” đang được
Trang 30hiển thị và khung hình “sau” được dựng xong và GPU gửi khung hình “sau” đến màn hình, hai khung hình này được tráo đổi với nhau, khung hình ”sau” thành khung hình “trước” được hiển thị lên màn hình và khung hình “sau” bị xóa đi và chờ GPU dựng tiếp khung hình “sau” tiếp theo
Bộ nhớ kết cấu:
Màu của mỗi pixel được quyết định trực tiếp bới các tính toán về ánh sáng tuy nhiên để thêm phần thực tế, các hình ảnh gọi là kết cấu (vân) được xếp lên bề mặt của các hình khối để tạo cảm giác về sự chi tiết GPU lưu các kết cấu này vào một
bộ nhớ tốc độ cao, từng tính toán màu cho pixel đều phải truy cập vào để xác định hoặc sửa đổi màu của pixel
Trên thực tế, có nhiều kết nối tới bộ nhớ kết cấu cho một pixel để giảm thiểu hiện tượng “giả” khi kết cấu hiển thị trên màn hình nhỏ hơn hoặc lớn hơn so với độ phân giải thực tế của nó Vì tần suất truy suât bộ nhớ kết cấu rất thường xuyên (các pixel liền kề có xu hướng truy cập kết cấu của các pixel liền kề) nên bộ nhớ kết cấu
có thiết kế bộ nhớ đệm chuyên dụng để góp phần che dấu độ trễ truy cập bộ nhớ Bộ nhớ đệm cục bộ thường được chia sẻ giữa các bộ nhớ khung hình (RGBA và Z) và
bộ nhớ kết cấu nhưng phần lớn bộ nhớ được sử dụng cho bộ nhớ kết cấu
Ánh sáng
Một khi tam giác đã được xác định trong hệ tọa độ của hệ thống, GPU có thể tính toán màu sắc của nó dựa trên ánh sáng của khung cảnh GPU sẽ xử lý bằng cách cộng dồn tất cả ánh sáng từ các nguồn sáng khác nhau
Quan hệ giữa GPU và đường ống dẫn đồ họa
Các mẫu GPU khác nhau ánh xạ các chức năng của đường ống dẫn đồ họa vào phần cứng theo các cách khác nhau Các GPU đời đầu có các đơn vị phần cứng chuyên dụng để thực hiện từng giai đoạn của đường ống dẫn đồ họa Một vài các giai đoạn không lập trình được vì chúng là các chức năng cố định gắn cứng vào phần cứng Các GPU mới chỉ có một loại bộ xử lý để thực hiện hầu hết các giai đoạn của đường ống dẫn đồ họa NVIDIA GeForce 8800 thuộc loại GPU này, nó sử dụng nhiều bộ xử lý đồng nhất, mỗi bộ xử lý lại bao gồm một vài đơn vị tính toán
Trang 31độc lập hoặc thậm chí vài bộ xử lý SIMD Khi đó vài trạng thái của đường ống dẫn
đồ họa như tái tạo ảnh, shader đỉnh và shader pixel được thực hiện bởi cùng một loại bộ xử lý
Hình 12: Kiến trúc hợp nhất của GPU (GeForce 8800 với 112 bộ xứ lý
dòng) 2.2.2 Tiến hóa của kiến trúc GPU
GPU đã phát triển từ trạng thái triển khai cố định đường ống dẫn đồ họa ở phần cứng tới trạng thái là một hệ thống tính toán hỗ trợ lập trình và có khả năng triển khai đường ống dẫn đồ họa trên nó Các đơn vị cố định chức năng để chuyển hóa đỉnh và kết cấu pixel được gộp lại bằng hệ thống bộ xử lý đồng nhất hoặc các shader là các đoạn chương trình có thể thực hiện các chức năng này và hơn thế nữa Cuộc cách mạng này đã được tiến hành trên vài thế hệ GPU bằng cách thay thế dần dần các trạng thái của đường ống dẫn đồ họa bằng số lượng tăng dần các đơn vị hỗ trợ lập trình
Ví dụ NVIDIA GeForce 3 được công bố vào tháng 2 năm 2011 và lần đầu tiên shader đỉnh hỗ trợ tính năng lập trình [9] Những shader này cung cấp các đơn vị
Trang 32tính toán cho lập trình viên có thể sử dụng cho việc nhân các ma trận véc tơ, các tính toán hàm mũ và căn bậc hai cũng như các chương trình nhỏ mặc định để sử dụng các đơn vị này thực hiện các chức năng chuyển hóa đỉnh và ánh sáng
Ngoài ra GeForce 3 cũng có một sự cải tiến khác đó là khả năng tùy chỉnh có giới hạn ở giai đoạn xử lý pixel, thể hiện chức năng kết cấu trước đây mặc định cho phần cứng dưới dạng một tổ hợp các thanh ghi với lập trình viên Các thế hệ GPU tiếp theo càng ngày càng có khả năng linh động tăng dần, hỗ trợ các đoạn chương trình dài hơn, nhiều thanh ghi hơn và điều khiển luồng hình học nguyên thủy như nhánh, vòng lặp và chương trình con
ATI Radeon 9700 (tháng 6/2002) và NVIDIA GeForce FX (tháng 1/2003) đều thay thế tổ hợp các thanh ghi bất tiện bằng các shader pixel lập trình được hoàn toàn [9] Chip GeForce 8800 (tháng 11/2006) cập nhật thêm khả năng lập trình được vào trạng thái tái tạo hình học nguyên thủy cho phép lập trình viên có thể điều chỉnh cách GPU tạo ra các tam giác từ các véc tơ đã được chuyển hóa
Việc cải thiện về độ chính xác trong các GPU cũng góp phần tăng tính lập trình Đường ống dẫn đồ họa cổ điển chỉ hỗ trợ số nguyên 8 bit cho các kênh màu do đó giá trị màu chỉ trải từ 0 tới 255 Chip ATI Radeon 9700 đã tăng dải màu hiển thị lên
24 bit dấu phẩy động và NVIDIA GeForce FX cũng bén gót với cả hai chế độ 16 bit
và 32 bit dấu phẩy động [20] Hiện nay GPU của ATI và NVIDIA đều đã hỗ trợ dấu phẩy động có độ chính xác kép 64 bit
Đồng thời để thỏa mãn nhu cầu về hiệu năng, GPU ngày càng có thiết kế tận dụng triệt để tính song song Thời kì đầu, GPU đã sử dụng các thanh ghi có độ rộng
4 véc tơ và theo thời gian số lượng các thanh ghi tăng dần từ 4 ở GeForce FX đến
16 ở GeForce 6800 (tháng 4/2004) đến 24 ở GeForce 7800 (tháng 5/2005) [20] GeForce 8800 có đến 128 bộ xử lý shader có hướng chạy ở xung shader đặc biệt gấp 2,5 lần xung đồng hồ bình thường (tương ứng với tốc độ pixel đầu ra) cho một chip tiêu chuẩn, do đó hiệu năng tính toán tương ứng với 128 x2.5/4=80 shader pixel có độ rộng 4 véc tơ [20]
Trang 33Bước cuối cùng trong cuộc cách mạng chuyển hóa đường ống dẫn đồ họa từ phần cứng sang một kết cấu tính toán linh động là sự giới thiệu shader hợp nhất Shader hợp nhất lần đầu tiên xuất hiện ở chip ATI Xenos cho máy chơi game Xbox
360 và NVIDIA cũng triển khai shader hợp nhất ở chip GeForce 8800 cho máy tính
cá nhân
Ở các thế hệ GPU trước shader đỉnh, shader pixel và shader hình học là các đơn
vị riêng rẽ còn kiến trúc shader hợp nhất cung cấp một đơn vị tập các bộ xử lý dấu phẩy động song song dữ liệu đủ tính chất “chung chung” để xử lý hết toàn bộ công việc của các shader trên Các dữ liệu đỉnh, tam giác và pixel sẽ được lưu thông trong tập các bộ xử lý của shader hợp nhất thay vì phải chạy qua các tầng cố định
độ rộng của đường ống dẫn đồ họa
Sự cải tiến này đem đến kết quả tốt hơn trên hiệu suất sử dụng phần cứng tổng thể vì nhu cầu cho các shader khác nhau có biên độ thay đổi tương đối lớn giữa các ứng dụng thậm chí ngay trong một khung hình của một ứng dụng Ví dụ một video game khi bắt đầu xử lý một hình ảnh, GPU phải sử dụng một lượng lớn tam giác để
vẽ bầu trời và cảnh vật ở xa và công đoạn này nhanh chóng chiếm phần lớn tài nguyên của shader pixel trong mô hình đường ống dẫn đồ họa cổ điển trong khi đó shader đỉnh “rảnh rỗi” Một miligiây sau, game lại chuyển sang xử lý các hình học
có độ chi tiết cao để vẽ các nhân vật và vật thể phức tạp Lúc này shader đỉnh lại hoạt động với khối lượng công việc lớn và shader pixel lại ở trạng thái “rảnh rỗi”
Sự thay đổi đến chóng mặt về nhu cầu tài nguyên ngay trong cùng một khung cảnh là một cơn ác mộng với vấn đề cân bằng tải cho những nhà thiết kế game và cũng thay đổi không lường trước được dựa vào vị trí quan sát của người chơi và sự thay đổi hành động Về phương diện cân bằng tải thì kiến trúc shader hợp nhất chính là lời giải cho sự thay đổi tỷ lệ số lượng bộ xử lý cho từng loại shader
Trang 34Hình 13: Shader hợp nhất – Tiến hóa của đường ống dẫn đồ họa
Ví dụ, một chiếc cạc GeForce 8800 có thể sử dụng 90% trong số 128 bộ xử lý của nó cho shader pixel và 10% còn lại cho shader đỉnh trong khi vẽ bầu trời và đổi ngược tỷ lệ này khi vẽ các khối hình học của một nhân vật Chính sự hợp nhất này
đã đem đến sự linh động cho kiến trúc song song của GPU và các nhà thiết kế game đồng thời góp phần cải thiện tính hiệu quả trong sử dụng tài nguyên của GPU Trong hơn sáu năm qua, các chương trình vector và chương trình mảnh đã được cải tiến với nhiều tính năng, với giới hạn lớn hơn về kích thước và tiêu thụ tài nguyên với bộ chỉ thị (tập lệnh) đầy đủ tính năng và với các phép toán điều khiển luồng linh hoạt hơn
Sau nhiều năm sử dụng các bộ chỉ thị lệnh riêng rẽ cho các phép toán trên vector và mảnh, GPU hiện tại hỗ trợ mô hình đổ bóng thống nhất 4.0 (unified Shader Model 4.0) trên cả đổ bóng vector và mảnh:
Các phần cứng phải hỗ trợ các chương trình shader ít nhất là 65 nghìn (65k) chỉ thị tĩnh và chỉ thị động không giới hạn
Các tập lệnh, lần đầu tiên, hỗ trợ cả số nguyên 32 bit và số dấu phẩy động 32 bit
Trang 35 Các phần cứng phải cho phép thao tác đọc trực tiếp và gián tiếp với số lượng tùy ý từ bộ nhớ toàn cục (kết cấu - texture)
Cuối cùng điều khiển luồng động trong các dạng vòng lặp và rẽ nhánh được
hỗ trợ
Khi mô hình shader hợp nhất ra đời và phát triển mạnh hơn, tất cả các loại ứng dụng GPU đã tăng độ phức tạp chương trình vector và mảnh, kiến trúc GPU ngày càng tập trung vào các bộ phận lập trình được của đường ống dẫn đồ họa Quả thực, trong khi các thế hệ trước đây, GPU là một đường ống dẫn đồ họa với chức năng cố định ở các bộ phận, khả năng hỗ trợ lập trình chỉ là một tính năng phụ thêm vào thì ngày nay GPU có thể được coi là một công cụ hỗ trợ lập trình bao quanh bởi các đơn vị hỗ trợ có chức năng cố định
2.2.3 Kiến trúc của GPU hiện đại
GPU có kiến trúc khác nhau phụ thuộc vào nhà sản xuất Hình 14 mô tả sơ đồ khối kiến trúc của hai nhà sản xuất GPU phổ biến hiện nay là: kiến trúc Tesla/Fermi của NVIDIA và kiến trúc hệ GPU Evergreen/Nother Island của AMD Các GPU có một cụm các bộ xử lý đa nhân dòng (SM) hoặc một dãy bộ xử lý song song dữ liệu (DPP) mà mỗi bộ xử lý tương ứng với một nhân của bộ xử lý đa nhân Mỗi một SM
có 8 tới 48 nhân CUDA trong đó mỗi nhân đều chứa các đơn vị tính toán số nguyên/dấu phẩy động, một bộ lập lịch cuộn để xếp lịch các lệnh và một vài bộ nhớ tích hợp DPP có 16 bộ xử lý luồng có kiến trúc VLIW thực thi đường ống dẫn và
bộ nhớ tích hợp để chia sẻ dữ liệu Mỗi một SM hoặc một DPP sẽ được coi là một đơn vị tính toán
Để hỗ trợ cho các đơn vị tính toán (CU - Computing Unit) có một đơn vị điều
khiển hoạt động của CU ở cả hai kiến trúc GPU là GigaThread Engine ở GPU của NVIDIA và bộ xử lý gửi tin siêu luồng/ bộ xử lý lệnh ở GPU của AMD GPU cũng tích hợp sẵn các mạng kết nối giữa các đơn vị tính toán và các hệ thống con bao gồm: bộ đệm, bộ điều khiển bộ nhớ và bộ nhớ của GPU
Trang 36Hình 14: Sơ đồ khối kiến trúc GPU
Mô hình lập trình cho GPGPU được thiết kế để xử lý một lượng lớn dữ liệu một cách đồng thời bằng các CU Việc xử lý dữ liệu này liên quan đến khái niệm kernel, kernel là một đoạn chương trình được thực thi trên GPU Trong mô hình lập trình CUDA của NVIDIA, hàng nghìn các luồng được khởi tạo bằng cách tham chiếu đến
mã của kernel và kernel cũng được sử dụng để xử lý dữ liệu một cách song song
Các luồng được nhóm lại thành dãy các luồng phối hợp (CTA) và các CTA này được gán và xử lý bởi các CU GPU của AMD sử dụng mô hình thực thi OpenCL,
là một mô hình tính toán theo chuẩn mở, nó có một sự khác biệt nhỏ với mô hình CUDA Nó sử dụng thuật ngữ khoản công việc (work-item) và nhóm công việc (work-group) tương ứng với luồng và khối và CTA ở CUDA và chúng cũng được gán và xử lý bởi các đơn vị tính toán Mặc dù kiến trúc phần cứng bên trong của GPU của hai hãng hoàn toàn khác biệt nhưng mô hình thực thi ở mức cao thì tương đồng với nhau
Kiến trúc hiện tại của GPU ngày càng tích hợp nhiều đơn vị thực thi và tính toán hơn để xử lý nhiều dữ liệu cùng một lúc hơn Chiến lược này khá hiệu quả trong việc cải thiện sức mạnh tính toán của GPU đồng thời nó cũng làm cho kiến trúc của GPU ngày càng phức tạp Tuy nhiên, điều này cũng là một thách thức đối với các nhà phát triển ứng dụng tính toán GPGPU trong việc lập trình và tổ chức mã
để có thể tận dụng tối đa sức mạnh của GPU
Trang 372.3 Tính toán trên GPU
2.3.1 Tổng quan về mô hình tính toán trên GPU
Kiến trúc của GPU gắn chặt với mô hình tính toán, sẽ rất khó khăn để hiểu rõ kiến trúc của GPU nếu không có kiến thức về cách mà phần mềm được thiết kế và loại hình song song nào được triển khai trong mô hình
Hiện tại, có hai cách để sử dụng GPU Phương pháp gần đây gọi là tính toán đa dụng trên GPU (GPGPU) và được phát triển để thực hiện tính toán đa dụng dựa trên giao diện lập trình ứng dụng của cạc đồ họa GPU để thực hiện các công việc không liên quan đến đồ họa Để đáp ứng nhu cầu, ngôn ngữ lập trình GPU dần dần tích hợp thêm các chỉ thị dành cho mục đích tính toán đa dụng trong tập lệnh nên việc viết các phần mềm không hướng mục đích đồ họa sử dụng ngôn ngữ lập trình song song và API ngày càng trở nên dễ dàng hơn Mô hình này gọi là tính toán GPU Năm 2007, NVIDIA công bố một kiến trúc phần mềm và mô hình tính toán để
có thể viết các phần mềm C hoặc C++ khai thác hết được tính song song cao độ của
GPU Họ gọi kiến trúc này là kiến trúc thiết bị hợp nhất tính toán (CUDA - Compute Unified Device Architecture) CUDA bao gồm một thư viện phần mềm và
một bộ dịch để ánh xạ ngôn ngữ C/C++ nâng cao thành các chỉ thị lệnh cho GPU và CPU Về bản chất thì CUDA cho phép lập trình viên viết các phần mềm C/C++ song song cao cấp bằng cách sử dụng thêm các kiểu dữ liệu đặc biệt và các chức năng được cung cấp bởi thư viện của CUDA Trong thực tế, CUDA cũng có thể được dùng để viết các phần mềm song song cho CPU đa nhân
CUDA có thể được định nghĩa bằng một trong ba cách sau:
Hệ thống phân cấp các đơn vị tính toán
Hệ thống phân cấp các bộ nhớ chia sẻ
Hệ thống phân cấp đồng bộ rào chắn
Hệ thống phân cấp tính toán bao gồm các luồng ở tầng thấp nhất rồi tới các khối luồng là nhóm các luồng rồi tới lưới ô khối là nhóm các khối luồng Mỗi một mức đều có bộ nhớ tương ứng để ánh xạ với bộ nhớ vật lý bên trong GPU Tương tự
Trang 38cũng có những đồng bộ dạng rào chắn sử dụng trong luồng hoặc các khối luồng Hình 15 mô tả quan hệ giữa các đơn vị tính toán và bộ nhớ tương ứng của chúng
Các luồng CUDA có thể truy cập dữ liệu vào nhiều khoảng không gian của bộ nhớ cùng một lúc trong thời gian thực thi như hình 15 Mỗi một luồng sẽ có bộ nhớ cục bộ riêng của nó gọi là bộ nhớ mỗi luồng Mỗi một khối luồng chia sẻ bộ nhớ của nó với toàn bộ các luồng trong khối trong khoảng thời gian vòng đời là một khối của nó gọi là bộ nhớ chia sẻ mỗi khối
Ngoài ra còn có hai khoảng không gian bộ nhớ ở dạng chỉ đọc chia sẻ cho tất cả các luồng là không gian bộ nhớ ràng buộc bất biến và kết cấu (Trong kiến trúc Kepler, mỗi một bộ đa xử lý dòng SMX có bộ đệm dữ liệu chỉ đọc 48KB riêng biệt cho tất cả các luồng trong khối luồng) [22] Các khoảng không gian bộ nhớ ràng buộc bất biến, toàn cục và kết cấu được tối ưu hóa khác nhau do cách sử dụng từng
bộ nhớ khác nhau Bộ nhớ toàn cục, ràng buộc bất biến và chia sẻ tồn tại xuyên suốt thời gian sống của các luồng trong cùng một chương trình tức là ba bộ nhớ này duy trì dữ liệu từ khi các luồng được tạo tới khi các luồng bị hủy Một thử thách lớn trong việc thực hiện tính toán đa dụng trên GPU là hiểu khả năng và phương thức truy cập các loại bộ nhớ khác nhau để tối ưu hóa hiệu năng sử dụng
Trang 39Hình 15: Hệ thống phân cấp bộ nhớ và các đơn vị tính toán
Một phần mềm bao gồm các loại dữ liệu và chức năng khác nhau Một vài biến
và dữ liệu chỉ có hiệu lực cục bộ với một luồng, những cái khác lại có hiệu lực với một khối luồng và một số lại có hiệu lực trong toàn ứng dụng Tương tự, một chức năng đặc biệt kernel là chức năng được thực thi một cách song song bởi tất cả các luồng Ví dụ về mã của một kernel có tác dụng cộng hai dãy A và B với kích cỡ N
và lưu vào dãy C được trình bày ở dưới:
Trang 40Từ ngăn cách _ _ global_ _ là phần mở rộng của CUDA so với C để xác định chức năng này là một kernel tức là tất cả các luồng đều có thể thực thi nó Mỗi luồng được gán một định danh duy nhất và trong đoạn mã trên được lưu ở biến
threadIdx.x Để gọi chức năng này từ phần mềm chính, ta có thể sử dụng đoạn mã
Tóm lại mô hình lập trình CUDA yêu cầu kiến trúc hạ tầng bên dưới có khả năng thực thi nhiều luồng một cách nhanh chóng và có thể chuyển qua lại giữa các nhóm luồng Ngoài ra, CUDA cũng cung cấp các không gian dữ liệu khác nhau một cách hiệu quả từ đó mở ra khả năng đa luồng trong GPU
2.3.2 Cơ chế đa luồng của GPU
Cơ chế đa luồng của GPU được thiết kế để đạt được các mục đích sau:
Để che giấu độ trễ của việc tải từ bộ nhớ và tải kết cấu từ DRAM và các bộ nhớ chia sẻ