Lý do chọn đề tài Với sự phát triển của công nghệ được thách thức bởi lớp bài toán lớn cần giải quyết trong nhiều lĩnh vực của đời sống xã hội như: khai phá dữ liệu, mô phỏng các hiện t
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
-* -
ĐỀ TÀI TIỂU LUẬN
AN TOÀN CÁC HỆ THỐNG THÔNG TIN
Giảng viên hướng dẫn:
PGS.TS Nguyễn Linh Giang
LỜI NÓI ĐẦU
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
-* -
NGUYỄN VĂN QUYẾT
ĐÁNH GIÁ HIỆU NĂNG PHẦN MỀM XỬ LÝ SONG SONG
TRÊN HỆ THỐNG KẾT HỢP CPU VÀ GPU
LUẬN VĂN THẠC SĨ KỸ THUẬT CÔNG NGHỆ THÔNG TIN
NGƯỜI HƯỚNG DẪN
PGS.TS HUỲNH QUYẾT THẮNG
Trang 2LỜI CẢM ƠN
Để hoàn thành luận văn tốt nghiệp “Đánh giá hiệu năng phần mềm xử lý song song
trên hệ thống kết hợp CPU và GPU”, lời đầu tiên em xin gửi lời cảm ơn sâu sắc nhất tới
PGS.TS Huỳnh Quyết Thắng, người đã hướng dẫn và chỉ bảo em tận tình trong suốt thời gian làm khóa luận
Em xin chân thành cảm ơn TS Hồ Khánh Lâm, Trưởng bộ môn KTMT – Khoa CNTT – Trường ĐHSP Kỹ Thuật Hưng Yên, đã cung cấp cho em các kiến thức nền tảng để thực hiện đề tài
Em cũng xin gửi lời cảm ơn tới TS Nguyễn Hữu Đức và các cán bộ trong Trung tâm tính toán hiệu năng cao – Trường ĐHBK Hà Nội, đã dành thời gian hướng dẫn cho em cách thử nghiệm chương trình và đánh giá hiệu năng hệ thống xử lý song song
Cuối cùng, em xin gửi lời cảm ơn sâu sắc tới các thầy cô, đồng nghiệp và người thân trong gia đình đã động viên, khích lệ em trong quá trình thực hiện luận văn
Học viên
Nguyễn Văn Quyết
Trang 3LỜI CAM ĐOAN
Với mục đích học tập, nghiên cứu để nâng cao trình độ chuyên môn nên tôi đã làm luận văn này một cách nghiêm túc và hoàn toàn trung thực
Trong luận văn, tôi có sử dụng tài liệu tham khảo của một số tác giả, 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, 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 12 năm 2012
Học viên
Nguyễn Văn Quyết
Trang 4MỤC LỤC
DANH MỤC CÁC KÝ HIỆU, CÁC TỪ VIẾT TẮT 6
DANH MỤC CÁC BẢNG 7
DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ 8
MỞ ĐẦU 10
1 Lý do chọn đề tài 10
2 Lịch sử nghiên cứu 10
3 Mục đích nghiên cứu 11
4 Đối tượng nghiên cứu 11
5 Phạm vi nghiên cứu 11
6 Phương pháp nghiên cứu 12
TỔNG QUAN VỀ HỆ THỐNG XỬ LÝ SONG SONG VÀ ĐÁNH CHƯƠNG 1: GIÁ HIỆU NĂNG 13
Tính toán song song 13
1.1 1.1.1 Khái niệm tính toán song song 13
1.1.2 Các hình thức song song 14
1.1.3 Tăng tốc tính toán song song sử dụng GPU 16
Máy tính song song 21
1.2 1.2.1 Mô hình máy tính song song 21
1.2.2 Phân loại máy tính song song 22
Lập trình song song với CUDA 26
1.3 1.3.1 Môi trường phát triển CUDA 26
1.3.2 Mô hình lập trình 30
1.3.3 Lập trình song song với CUDA C/C++ 37
1.3.4 Nguyên tắc tối ưu hóa hiệu năng 37
Vấn đề đánh giá hiệu năng phần mềm xử lý song song 39
1.4 1.4.1 Định nghĩa về đánh giá hiệu năng phần mềm 39
1.4.2 Mục đích của việc đánh giá hiệu năng phần mềm xử lý song song 40
1.4.3 Yêu cầu của bài toán đánh giá hiệu năng 40
GIẢI PHÁP KỸ THUẬT ĐÁNH GIÁ HIỆU NĂNG PHẦN MỀM CHƯƠNG 2: XỬ LÝ SONG SONG 42
Kỹ thuật phân tích mô hình bài toán 42 2.1
Trang 5Kỹ thuật đo lường 44
2.3 2.3.1 Đo hiệu năng tính toán 44
2.3.2 Đo hiệu năng truy cập bộ nhớ 45
2.3.3 Đo hiệu năng truyền thông 46
Đánh giá kết quả đo hiệu năng 46
2.4 2.4.1 Đánh giá tốc độ xử lý 46
2.4.2 Đánh giá hiệu quả xử lý 48
ÁP DỤNG ĐÁNH GIÁ HIỆU NĂNG VÀO BÀI TOÁN N-BODY 49
CHƯƠNG 3: Mô tả bài toán N-Body 49
3.1 Phân tích mô hình bài toán N-Body 50
3.2 Song song hóa bài toán N-Body trên hệ thống kết hợp CPU và GPU 51
3.3 3.3.1 Tính lực giữa hạt-hạt (body-body) 51
3.3.2 Tính toán các lớp luồng (Tile Caculation) 53
3.3.3 Hợp nhất các lớp luồng vào các Thread Blocks 53
3.3.4 Định nghĩa một mạng lưới của khối luồng (Grid of Thread Block) 54
3.3.5 Mô phỏng bài toán với chế độ đồ họa 55
Thực hiện đo hiệu năng bài toán N-Body 58
3.4 3.4.1 Môi trường thử nghiệm 58
3.4.2 Đo hiệu năng tính toán với chế độ benchmark 59
3.4.3 Phân tích hiệu năng ứng dụng với Visual Profiler 61
ĐÁNH GIÁ KẾT QUẢ ĐO HIỆU NĂNG 66
CHƯƠNG 4: Đánh giá tốc độ xử lý 66
4.1 Đánh giá hiệu quả xử lý 67
4.2 Kết luận về hiệu năng 69
4.3 KẾT LUẬN 71
1 Kết quả đạt được của đề tài 71
2 Hạn chế của đề tài 71
3 Hướng phát triển của đề tài 71
PHỤ LỤC 73
TÀI LIỆU THAM KHẢO 75
Trang 6DANH MỤC CÁC KÝ HIỆU, CÁC TỪ VIẾT TẮT
ALU Arithmetic Logic Unit Bộ xử lý số học logic
CPU Central Processing Unit Đươn vị xử lý trung tâm
CUDA Compute Unified Device
Architecture
Kiến trúc thiết bị tính toán hợp nhất
GPU Graphics Processing Unit Bộ xử lý đồ họa
SISD Single Instruction Stream,
Single Data Stream
Máy tính một dòng lệnh, một dòng số liệu
SIMD Single Instruction Stream,
Multiple Data Stream
Máy tính một dòng lệnh, nhiều dòng
số liệu MISD Multiple Instructions Stream,
Single Data Stream
Máy tính nhiều dòng lệnh, một dòng
số liệu
MIMD Multiple Instructions Stream,
Multiple Data Stream
Máy tính nhiều dòng lệnh, nhiều dòng số liệu
SM Streaming Multiprocessors Bộ đa xử lý luồng
Trang 7DANH MỤC CÁC BẢNG
Bảng 1: So sánh một số đặc điểm của CPU và GPU 19
Bảng 2: Các đặc điểm của môi trường lập trình với CUDA 30
Bảng 3: Kết quả do thời gian xử lý của CPU và GPU trong bài toán N-Body 66
Bảng 4: Kết quả đo tốc độ tính toán trung bình trong chế độ xử lý đồ họa 68
Trang 8DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ
Hình 1: Mô hình kiến trúc SISD 22
Hình 2: Mô hình kiến trúc SIMD 23
Hình 3: Mô hình kiến trúc MISD 23
Hình 4: Mô hình kiến trúc MIMD 24
Hình 5: Mô hình kiến trúc máy tính song song chia sẻ bộ nhớ 25
Hình 6: Mô hình kiến trúc máy tính song song phân tán 26
Hình 7: Mô hình kiến trúc Fermi 17
Hình 8: Minh họa số thanh ghi ALU trên GPU 18
Hình 9: So sánh sự tăng tốc về tốc độ xử lý CPU và GPU 20
Hình 10: Minh họa tăng tốc băng thông bộ nhớ của CPU và GPU 21
Hình 11: Mô hình kiến trúc CUDA 28
Hình 12: Môi trường phát triển phần mềm với CUDA 29
Hình 13: Grid of Thread Blocks 33
Hình 14: Mô hình phân cấp bộ nhớ 35
Hình 15: Mô hình lập trình không đồng nhất 36
Hình 16: Mô hình tương quan giữa tốc độ xử lý và số bộ xử lý 47
Hình 17: Minh họa hệ N-Body trong không gian 3D 49
Hình 18: Minh họa Grid of Thread Blocks 55
Hình 19: Minh họa bài toán N-Body trên CPU với độ chính xác đơn 56
Hình 20: Minh họa bài toán N-Body trên CPU với độ chính xác kép 56
Hình 21: Minh họa bài toán N-Body trên CPU&GPU với độ chính xác đơn 57
Hình 22: Minh họa bài toán N-Body trên CPU&GPU với độ chính xác kép 57
Trang 9Hình 23: Visual Profiler - Công cụ phân tích hiệu năng phần mềm xử lý song song 62
Hình 24: Cấu hình tham số đầu vào cho phần mềm Visual Profiler 63
Hình 25: Giao diện kết quả chạy phân tích hiệu năng ứng dụngN-Body 63
Hình 26: Chi tiết phân tích kết quả xử lý của ứng dụng N-Body 64
Hình 27: Kết quả chi tiết xử lý song song với N=4096 của bài toán N-Body 65
Hình 28: Minh hoạ kết quả đo thời gian xử lý trên CPU & GPU 67
Hình 29: Minh họa kết quả đo hiệu quả xử lý ở chế độ đồ họa với GPU 68
Trang 10MỞ ĐẦU
1 Lý do chọn đề tài
Với sự phát triển của công nghệ được thách thức bởi lớp bài toán lớn cần giải quyết trong nhiều lĩnh vực của đời sống xã hội như: khai phá dữ liệu, mô phỏng các hiện tượng trong khoa học vũ trụ, Các lớp bài toán này vừa đòi hỏi đáp ứng thời gian thực vừa yêu cầu xử lý trên khối dữ liệu lớn Để giải quyết bài toán đó đòi hỏi các bộ xử lý phải có hiệu năng cao Và hệ thống máy tính song song ra đời với mục đích làm tăng khả năng tính toán của máy tính bằng cách kết hợp nhiều bộ xử lý tham gia đồng thời vào quá trình xử
lý Đó là sự kết hợp giữa các bộ xử lý của CPU và GPU
Hiện nay, việc xử lý song song không những chỉ thực hiện trên những siêu máy tính
mà có thể được thực hiện trên các trạm làm việc, máy tính cá nhân, mạng máy tính Nhưng hầu hết các phần mềm chạy trên máy tính này là những phần mềm xử lý tuần tự Bởi vậy cần xây dựng những phần mềm, cấu trúc dữ liệu cho phép xử lý một cách song song Để sử dụng một cách hiệu quả các ứng dụng phần mềm này, cần có giải pháp đánh giá hiệu năng của chúng trên các hệ thống máy tính song song
Trong khuôn khổ của khóa luận, áp dụng xử lý song song vào việc giảm thời gian tính lực tương tác giữa các body trong hệ mô phỏng N-body và thực hiện đánh giá hiệu năng của bài toán trên
2 Lịch sử nghiên cứu
Hiện nay trên thế giới, với sự phát triển mạnh mẽ của công nghệ cao, đã xây dựng được những hệ thống máy tính có khả năng tính toán rất lớn như siêu máy tính (xem phụ lục 1), tính toán lưới phục vụ cho việc nghiên cứu khoa học và các ứng dụng thực tế Bên cạnh đó các nhà sản xuất máy tính cũng luôn thay đổi công nghệ, cho ra những thế hệ máy tính có khả năng tính toán với tốc độ nhanh Hệ thống máy tính với chip đa lõi ngày càng nhiều, kết hợp với sự ra đời của thiết bị GPU đã hỗ trợ trong xử lý đồ họa và tính toán song song Để khai thác và sử dụng một cách hiệu quả các phần mềm xử lý song song trên hệ thống đó cần phải có các giải pháp nhằm đánh giá hiệu năng hệ thống Từ
Trang 11cứu và đưa ra nhiều giải pháp cũng như công cụ để đánh giá hiệu năng phần mềm nói chung và phần mềm xử lý song song nói riêng
Tuy nhiên ở Việt Nam, thời điểm đầu khi máy tính song song ra đời, với thực tại các trung tâm nghiên cứu chưa đủ tiền để mua những máy tính lớn, trong khi đó nhu cầu có
hệ thống tính toán lớn lại rất cần thiết Một giải pháp là xây dựng hệ thống tính toán song song từ các máy tính hiện có và liên kết chúng lại tạo ra hệ thống tính toán lớn Khi đó, các bài toán xử lý bắt đầu được đưa vào thử nghiệm như: thám mã, xử lý dữ liệu khí tượng thủy văn…và nhiều công trình, bài báo khoa học đề cập đến vấn đề này đã được công bố Một trong những nới đầu tiên tại Việt Nam triển khai bài các dự án liên quan đến tính toán song song là Trung Tâm tính toán hiệu năng cao – Đại Học Bách Khoa Hà Nội (10/2001)
Vấn đề đánh giá hiệu năng phần mềm xử lý song song tuy không phải là mới nhưng việc ứng dụng các kết quả của nó vào trong thực tế hiện nay còn nhiều vấn đề để nghiên cứu
Áp dụng đánh giá hiệu năng vào bài toán mô phỏng
4 Đối tƣợng nghiên cứu
Nghiên cứu tìm hiểu lý thuyết về máy tính song song, tính toán song song và lập trình
xử lý song song Nghiên cứu các giải pháp kỹ thuật đo hiệu năng Áp dụng đánh giá hiệu năng phần mềm xử lý song song qua bài toán mô phỏng N-Body
5 Phạm vi nghiên cứu
Tổng quan về hệ thống xử lý song song và lập trình song song với CUDA C
Trang 12 Xây dựng giải pháp kỹ thuật đánh giá hiệu năng phần mềm xử lý song song
Sử dụng bài toán N-Body để mô phỏng và đánh giá hiệu năng
6 Phương pháp nghiên cứu
Nghiên cứu tài liệu khoa học về hệ thống máy tính song song
Nghiên cứu kỹ thuật lập trình song song với CUDA
Nghiên cứu lý thuyết về đánh giá hiệu năng của phần mềm
Mô phỏng xử lý song song trên bài toán N-Body
Xây dựng giải pháp đánh giá hiệu năng của bài toán mô phỏng
Trang 13TỔNG QUAN VỀ HỆ THỐNG XỬ LÝ SONG SONG VÀ ĐÁNH CHƯƠNG 1:
GIÁ HIỆU NĂNG
Tính toán song song
1.1
Tính toán song song thường được dùng để giải quyết các vấn đề hết sức phức tạp yêu cầu thời gian tính toán lớn hoặc làm việc với khối dữ liệu lớn như các bài toán dự báo thời tiết, mô phỏng tai nạn xe hơi, xây dựng các mô hình thương mại và các vấn đề khoa học như khai phá dữ liệu, trí tuệ nhân tạo, an toàn dữ liệu…Để giải quyết các bài toán trên, người ta đã nghiên cứu và đưa ra các phương pháp sau:
Phương pháp 1: Tăng tốc phần cứng bằng cách tăng tốc các bộ vi xử lý và kết hợp
nhiều bộ xử lý với nhau Tuy nhiên phương pháp này tốn nhiều thời gian, tiền bạc và tốc
độ cũng chỉ cải tiến đến một giới hạn nhất định
Phương pháp 2: Chia bài toán thành các công việc nhỏ để có thể chạy song song trên
nhiều bộ xử lý
Sự kết hợp của hai phương pháp trên là lựa chọn giải pháp công nghệ nhằm tăng tốc tính toán, nó là nền tảng của tính toán song song cũng như các sự ra đời của máy tính song song và lập trình song song
1.1.1 Khái niệm tính toán song song
Tính toán song song là một hình thức tính toán trong đó nhiều phép tính được thực hiện đồng thời, hoạt động trên nguyên tắc là những vấn đề lớn đều có thể chia thành nhiều phần nhỏ hơn, sau đó được giải quyết tương tranh (trong lĩnh vực tính toán)
Có nhiều hình thức khác nhau của tính toán song song: cấp bit, cấp lệnh, dữ liệu, và tác vụ Song song đã được sử dụng từ nhiều năm qua, chủ yếu là trong lĩnh vực tính toán hiệu năng cao, tuy nhiên gần đây công nghệ này đã nhận được nhiều sự quan tâm hơn Nó trở thành mô hình thống trị trong lĩnh vực kiến trúc máy tính, phần lớn là dưới dạng bộ xử
lý đa nhân
Các máy tính song song có thể được phân loại tùy theo cấp độ hỗ trợ cho song song của phần cứng, với những chiếc máy tính đa nhân và đa xử lý có bộ phận đa xử lý trong
Trang 14một máy đơn lẻ, trong song song phân cụm, và mạng lưới sử dụng nhiều máy tính để xử
lý cùng một công việc Những kiến trúc máy tính song song chuyên dụng thỉnh thoảng cũng sử dụng các bộ xử lý truyền thống nhằm tăng tốc độ cho những công việc đặc trưng Chương trình máy tính song song khó viết hơn so với những chương trình tuần tự, vì
sự tương tranh tạo ra nhiều lớp mới tiềm tàng các lỗi phần mềm Sự kết nối và đồng bộ giữa các phần việc nhỏ là một trong những trở ngại lớn nhất để tạo ra một chương trình song song tốt
1.1.2 Các hình thức song song
a Song song cấp bit
Từ sự ra đời của công nghệ chế tạo chip máy tính very-large-scale integration (VLSI)
từ những năm 1970 cho đến năm 1986, tăng tốc trong kiến trúc máy tính được điều khiển bằng cách tăng gấp đôi kích cỡ từ máy tính về khối lượng thông tin bộ xử lý có thể thao tác trên một chu kỳ Tăng kích thước từ làm giảm số lượng chỉ lệnh các bộ xử lý phải thực thi để thực hiện một hoạt động trên các biến có kích cỡ lớn hơn độ dài của từ Ví dụ, khi một bộ xử lý 8-bit phải tạo thêm 2 nguyên số 16-bit, trước tiên bộ xử lý phải thêm vào các bit bậc thấp hơn 8 từ mỗi số nguyên bằng cách sử dụng lệnh cộng tiêu chuẩn, sau đó thêm vào các bit bậc cao hơn 8 bằng cách sử dụng lệnh cộng có nhớ và bit nhớ lấy từ việc thêm vào bậc thấp; do đó, bộ xử lý 8-bit cần đến hai câu lệnh để hoàn thành một thao tác, trong khi bộ xử lý 16-bit có thể làm xong công việc này chỉ với một câu lệnh duy nhất Trong lịch sử, các vi xử lý 4-bit đã từng được thay thế bằng 8-bit, 16-bit, sau đó là 32-bit Xu hướng này đã kết thúc với sự ra đời của bộ vi xử lý 32-bit, đã trở thành tiêu chuẩn cho các tính toán chung trong hai thập kỷ Cho đến gần đây (khoảng 2003–2004), với sự
ra đời của kiến trúc x86-64, bộ xử lý 64-bit đã trở nên phổ biến
Trang 15là song song cấp câu lệnh Những ưu điểm của song song cấp câu lệnh đã thống trị kiến trúc máy tính từ giữa những năm 1980 cho đến giữa thập niên 1990
Các bộ xử lý hiện đại có những đường liên kết câu lệnh đa công đoạn Mỗi giai đoạn trong đường liên kết tương ứng với mỗi hành động khác nhau mà bộ xử lý thực hiện với câu lệnh trong giai đoạn đó; bộ xử lý với một đường liên kết N giai đoạn có thể có đến N câu lệnh ở những giai đoạn khác nhau Ví dụ tiêu chuẩn của một bộ xử lý đường liên kết
là bộ xử lý RISC, với 5 công đoạn: nạp lệnh, giải mã, thực thi, truy cập bộ nhớ, và write back Bộ xử lý Pentium 4 có một đường liên kết 35 giai đoạn
c Song song dữ liệu
Song song dữ liệu là tập trung vào phân phối dữ liệu qua các nút tính toán khác nhau
để được xử lý song song Vòng song song thường dẫn đến những chuỗi hoạt động tương
tự (không nhất thiết phải giống nhau) hoặc các chức năng được thực hiện trên các yếu tố của một cấu trúc dữ liệu lớn Nhiều ứng dụng khoa học và kỹ thuật áp dụng song song dữ liệu Một phụ thuộc loop-carried là sự phụ thuộc của một vòng lặp vào kết quả đầu ra của một hoặc nhiều lần lặp lại trước Phụ thuộc loop-carried ngăn chặn sự song song hóa của các vòng Ví dụ, xem xét giả mã sau khi tính một vài số Fibonacci đầu tiên:
Trang 16hệ thống nhúng, điện thoại di động, máy tính cá nhân, máy trạm, và điều khiển game Bộ
xử lý đồ họa ngày nay rất hiệu quả trong các thao tác đồ họa máy tính, và cấu trúc song song cao cấp làm cho chúng có năng lực xử lý tốt hơn nhiều so với bộ vi xử lý thông thường trong các thuật toán phức tạp Trong máy tính cá nhân, một GPU được biết tới như một card màn hình (video card) hoặc được tích hợp luôn trên bảng mạch chủ Hơn 90% các máy tính cá nhân hoặc máy tính xách tay hiện đại đã có tích hợp GPU nhưng thường yếu hơn nhiều so với GPU tích hợp trên các card màn hình chuyên dụng
Sự phát triển của card đồ họa kết hợp chặt chẽ với các chip vi xử lý Ban đầu GPU là
bộ xử lý gắn trên card đồ họa phục vụ việc tính toán cho các phép toán dấu phảy động Bộ gia tốc đồ họa kết hợp với các vi mạch siêu nhỏ tùy chọn chứa một số phép toán đặc biệt được sử dụng phổ biến trong biến đổi thành đồ họa ba chiều (graphic rendering) Khả năng của các vi mạch từ đó xác định khả năng của bộ gia tốc đồ họa Chúng được sử dụng chủ yếu trong các trò chơi 3D, hoặc biến đổi thành đầu ra 3D
GPU thực thi một số phép toán đồ họa nguyên thủy làm chúng chạy nhanh hơn rất nhiều so với việc vẽ trực tiếp trên màn hình với CPU
Ngày nay, GPU đã bắt đầu thực hiện xâm nhập máy tính và cạnh tranh với CPU, và theo một vài kết quả nghiên cứu cho thấy việc sử dụng GPGPU cho tính toán chung (General Purpose Computing) trên GPU, đã tìm thấy con đường của mình ứng dụng vào các lĩnh vực khác nhau như thăm dò dầu, xử lý hình ảnh khoa học, đại số tuyến tính, tái tạo 3D và hỗ trợ lựa chọn giá cổ phiếu Điều này tăng áp lực lên các nhà sản xuất GPU
Trang 17từ "người dùng GPGPU" để cải tiến thiết kế phần cứng, thường tập trung vào việc thêm tính linh hoạt hơn cho mô hình lập trình
b Kiến trúc của GPU
Thế hệ GPU mới dựa trên kiến trúc Fermi [1] đã mang lại nhiều giá trị thực tiễn: nâng cao chất lượng, tốc độ dựng hình, giả lập, mô phỏng 3D trên máy tính; tăng tốc tính toán song song cho siêu máy tính; và tạo hạ tầng sẵn sàng cho dịch vụ web 3D
Kiến trúc Fermi vượt nhiều lần về độ chính xác dấu phảy động so với kiến trúc hiện tại nhằm đáp ứng siêu máy tính (HPC) chuyên xử lý đại số tuyến tính, mô phỏng, lượng tử; và lần đầu tiên đưa vào GPU bộ đệm dữ liệu song song Parallel DataCache Kiến trúc Fermi cũng được quan tâm bởi Bloomberg, Cray, Dell, HP, IBM và Microsoft
Hình 1: Mô hình kiến trúc Fermi
Trang 18Kiến trúc Fermi đầu tiên dựa trên GPU được triển khai thực hiện với 3,0 tỷ transistor,
và 512 CUDA core Các CUDA core được tổ chức trong 16 SM với 32 lõi GPU có sáu phân vùng bộ nhớ 64-bit Giao diện kết nối GPU với CPU thông qua PCI-Express
c Tính toán trên GPU
Với mong muốn ban đầu GPU thiết kế ra nhằm hỗ trợ xử lý đồ họa, tuy nhiên sau này người ta đã tận dụng nó vào tính toán xử lý dữ liệu lớn Trên GPU được thiết kế rất nhiều thanh ghi ALU, gấp nhiều lần so với CPU bởi vậy nó có thể tính toán với tốc độ nhanh gấp trăm, nghìn lần so với tốc độ tính toán của CPU Mô hình dưới đây sẽ minh họa cho điều đó:
Hình 2: Minh họa số thanh ghi ALU trên GPU
Để thấy rõ được những ưu điểm của GPU trong việc ứng dụng xử lý song song, phần này sẽ thực hiện so sánh GPU và CPU ở một số khía cạnh, cụ thể trong bảng sau:
1 Mục đích sử dụng
Dành cho việc xử lý các tính toán thông
thường, làm bộ đệm và điều khiển
Nhu cầu hiển thị đồ họa 3D, thời gian thực,
độ phân giải cao -> cần có GPU nhiều nhân, chạy song song, đa luồng, băng thông
bộ nhớ rất lớn
Trang 19GPU dùng trong xử lý dữ liệu lớn
2 Kiến trúc
Số lượng ALU ít Số lượng ALU nhiều Tăng khả năng
tính toán
3 Tối ƣu phần cứng
Các ALU chạy những lệnh riêng
Tiểu trình của CPU cần hàng trăm chu kì
đồng hồ để tạo và lập lịch
Các ALU cùng chạy chung một lệnh Tiểu trình của GPU chỉ tốn vài chu kì đồng
hồ để tạo và lập lịch GPU có xử lý với
số lượng tiểu trình lớn và nhanh chóng
4 Tốc độ phát triển
Tốc độ tính toán tăng 1.4x mỗi năm Bộ xử lý mảnh: 1.7x mỗi năm
Bộ xử lý đỉnh: 2.3x mỗi năm
Bảng 1: So sánh một số đặc điểm của CPU và GPU
Hai mô hình sau đây được đưa ra bởi NVIDIA [9] vào tháng 8 năm 2012, mô tả sự khác biệt về tốc độ xử lý và băng thông bộ nhớ của một số loại GPU và CPU
Trang 20Hình 3: So sánh sự tăng tốc về tốc độ xử lý CPU và GPU
Trang 21Hình 4: Minh họa tăng tốc băng thông bộ nhớ của CPU và GPU
Máy tính song song
1.2
1.2.1 Mô hình máy tính song song
Một hệ thống máy tính song song là một máy tính với nhiều hơn một bộ xử lý cho phép xử lý song song Định nghĩa này có thể bao quát được tất cả các siêu máy tính với hàng trăm bộ xử lý, các mạng máy tính trạm, hay các hệ thống nhúng…Trong những năm gần đây các máy tính có vi xử lý áp dụng công nghệ mới multicore cho phép nhiều nhân trong một bộ xử lý cũng được coi là máy tính song song
Trang 221.2.2 Phân loại máy tính song song
d Phân loại dựa trên cơ chế điều khiển chung
Dựa vào cơ chế điều khiển chung Michael Flynn đã chia máy tính song song thành 4 loại sau:
SISD (Single Instructions stream, Single Data stream - Máy tính một dòng
lệnh, một dòng số liệu): Máy chỉ có một CPU Ở mỗi thời điểm chỉ thực hiện
một lệnh và chỉ đọc/ghi; có một thanh ghi, gọi là bộ đếm chương trình (program counter), được sử dụng để nạp địa chỉ của lệnh tiếp theo khi xử lý tuần tự Các câu lệnh được thực hiện theo một thứ tự xác định Đây chính là mô hình máy tính truyền thống kiểu Von Neumann
Hình 5: Mô hình kiến trúc SISD
SIMD (Single Instructions stream, Multiple Data stream - Máy tính một dòng
lệnh, nhiều dòng số liệu): Các máy SIMD có một số lớn các bộ xử lý giống
nhau, cùng thực hiện một lệnh giống nhau để xử lý nhiều dòng dữ liệu khác nhau Mỗi bộ xử lý có bộ nhớ dữ liệu riêng, nhưng chỉ có một bộ nhớ lệnh và một bộ xử lý điều khiển, bộ này đọc và thi hành các lệnh Tính song song dùng trong các máy SIMD là tính song song dữ liệu Nó chỉ có hiệu quả nếu cấu trúc các dữ liệu dễ dàng thích ứng với cấu trúc vật lý của các bộ xử lý thành viên
Các bài toán xử lý vector và mảng thuộc loại máy tính này
Trang 23Hình 6: Mô hình kiến trúc SIMD
MISD (Multiple Instructions stream, Single Data stream - Máy tính nhiều dòng
lệnh, một dòng số liệu): Các máy tính yêu cầu mỗi đơn vị xử lý nhận những lệnh khác nhau để thực hiện trên cùng một mục dữ liệu Các máy tính có các luồng dữ liệu được chuyển tuần tự theo dãy các CPU liên tiếp gọi là kiến trúc hình ống xử lý theo vector thông qua một dãy các bước Trong đó mỗi bước thực hiện một chức năng và sau đó chuyển kết quả cho PU thực hiện bước tiếp theo
Hình 7: Mô hình kiến trúc MISD
MIMD (Multiple Instruction stream, Multiple Data stream - Máy tính nhiều
dòng lệnh, nhiều dòng số liệu): Mỗi bộ xử lý có thể thực hiện những luồng lệnh
(chương trình) khác nhau trên các luồng dữ liệu riêng Hầu hết các hệ thống MIMD đều có bộ nhớ riêng và cũng có thể truy cập vào được bộ nhớ chung
Trang 24(global) khi cần, do vậy giảm thiểu được sự trao đổi giữa các bộ xử lý trong hệ thống
Hình 8: Mô hình kiến trúc MIMD
e Phân loại dựa trên sự tương tác giữa các bộ xử lý và bộ nhớ
Máy tính song song có bộ nhớ chia sẻ
Máy có một bộ nhớ trung tâm duy nhất được phân chia cho các bộ xử lý và một hệ thống bus chia sẻ để nối các bộ xử lý và bộ nhớ Vì chỉ có một bộ nhớ trong nên hệ thống
bộ nhớ không đủ khả năng đáp ứng nhu cầu thâm nhập bộ nhớ của một số lớn các bộ xử
lý Kiểu kiến trúc bộ nhớ chia sẻ được dùng trong hệ thống SMP
Trang 25Hình 9: Mô hình kiến trúc máy tính song song chia sẻ bộ nhớ
Máy tính song song có bộ nhớ phân tán
Mỗi máy của nhóm này gồm có các nút, mỗi nút chứa một bộ xử lý, bộ nhớ, một vài ngã vào ra và một giao diện với hệ thống kết nối giữa các nút
Trang 26Hình 10: Mô hình kiến trúc máy tính song song phân tán
Lập trình song song với CUDA
1.3
1.3.1 Môi trường phát triển CUDA
CUDA [9] (Compute Unified Device Architecture - Kiến trúc thiết bị tính toán hợp nhất) là một kiến trúc tính toán song song do NVIDIA phát triển Nói một cách ngắn gọn, CUDA là động cơ tính toán trong các GPU (Graphics Processing Unit - Đơn vị xử lý đồ họa) của NVIDIA, lập trình viên có thể sử dụng nó thông qua các ngôn ngữ lập trình phổ biến Lập trình viên dùng ngôn ngữ C for CUDA, dùng trình biên dịch PathScale Open64
C, để cài đặt các thuật toán chạy trên GPU Kiến trúc CUDA hỗ trợ mọi chức năng tính toán thông qua ngôn ngữ C Các bên thứ ba cũng đã phát triển để hỗ trợ CUDA trong Python, Fortran, Java và MATLAB
CUDA cho phép các nhà phát triển truy nhập vào tập các chỉ lệnh ảo và bộ nhớ của các phần tử tính toán song song trong đơn vị xử lý đồ họa của CUDA (CUDA GPU) Sử dụng CUDA, các GPU mới nhất do NVIDIA sản xuất có thể dễ dàng thực hiện các tính toán như những CPU Tuy nhiên, không giống như các CPU, các GPU có kiến trúc song
Trang 27song trên toàn bộ giúp tập trung vào khả năng thực thi một cách chậm rãi nhiều luồng dữ liệu một lúc, hơn là thực thi rất nhanh một luồng dữ liệu Cách tiếp cận giải quyết các vấn
đề có mục đích tổng quát này trên các GPU được gọi là GPGPU
Trong công nghiệp trò chơi trên máy tính, ngoài nhiệm vụ làm trơn hình ảnh, GPU cũng được sử dụng để tính toán các hiệu ứng vật lý trong game (như mảnh vụn, khói, lửa, dòng chảy ); ví dụ các phần mềm đơn vị xử lý vật lý trong GPU bao gồm PhysX và Bullet CUDA cũng được sử dụng để gia tốc các ứng dụng ngoài đồ họa như sinh học tính toán, xử lý khối lượng dữ liệu lớn cùng với CPU, trong mật mã học và nhiều lĩnh vực khác Một ví dụ đó là hạ tầng tính toán phân tán BOINC
CUDA cung cấp cả giao diện chương trình ứng dụng (API) bậc thấp và bậc cao Kiến trúc CUDA SDK đầu tiên được phát hành vào ngày 15 tháng 2 năm 2007, cho cả hai hệ điều hành Microsoft Windows và Linux Nó hỗ trợ cho Mac OS X ở phiên bản thứ 2.0, thay thế cho phiên bản beta vào ngày 14 tháng 2, 2008 CUDA có trong mọi GPU NVIDIA bắt đầu từ seri G8X về sau, bao gồm các dòng sản phẩm GeForce, Quadro và Tesla Các chương trình phát triển cho seri GeForce 8 cũng sẽ vẫn chạy được mà không cần thay đổi trên mọi video card trong tương lai của NVIDIA, nhờ vào tính tương thích nhị phân
Kiến trúc CUDA bao gồm một số thành phần trong các hộp màu xanh bên dưới:
1 Các kỹ thuật tính toán song song bên trong GPU của NVIDIA
2 Hỗ trợ cho các hệ điều hành cấp hạt nhân khởi tạo phần cứng, cấu hình,…
3 Sử dụng chế độ điều khiển, cung cấp API cho các nhà phát triển
4 PTX Kiến trúc tập lệnh (ISA) cho hạt nhân và các chức năng tính toán song song
Trang 28Hình 11: Mô hình kiến trúc CUDA
Môi trường phần mềm phát triển CUDA cung cấp tất cả các công cụ, ví dụ và tài liệu cần thiết để phát triển các ứng dụng tận dụng lợi thế của kiến trúc CUDA
Trang 29Hình 12: Môi trường phát triển phần mềm với CUDA
Libraries Thư viện nâng cao bao gồm BLAS, FFT, và các chức năng khác
tối ưu hóa cho kiến trúc CUDA
CUDA Runtime Cung cấp hỗ trợ để thực hiện các hàm chuẩn trên GPU và cho
phép các cam kết ràng buộc mức cao với các ngôn ngữ bậc cao khác như Fortran, Java, và Python
CUDA Driver Bao gồm các công cụ hỗ trợ biên dịch NVIDIA C Compiler
(nvcc), gỡ rối với CUDA Debugger (cudagdb), theo rõi phân tích kết quả với CUDA Visual Profiler (cudaprof), và một số
Trang 30công cụ khác Ngoài ra còn cung cấp hệ thống các tài liệu và ví
dụ mẫu là các bài hướng dẫn thực hành tốt nhất về GPU Computing
Bảng 2: Các đặc điểm của môi trường lập trình với CUDA
1.3.2 Mô hình lập trình
a Khái niệm Kernels
CUDA C cho phép các lập trình định nghĩa các hàm C, được gọi là hạt nhân (Kernels) Khi các Kernel được gọi, nó sẽ thực hiện N lần song song với N CUDA Thread khác nhau, điều này ngược lại với việc chỉ thực hiện một lần với các hàm C thông thường Hạt nhân được định nghĩa bằng cách sử dụng khai báo global và chỉ ra số lượng CUDA thread thực hiện mà hạt nhân cho một lời gọi hạt nhân nhất định được quy định cụ thể bằng cách sử dụng ký pháp mới là <<< >>> Mỗi thread thực hiện hạt nhân sẽ có một Thread ID duy nhất, điều đó cho phép truy cập hạt nhân thông qua xây dựng biến
Trang 31// Kernel invocation with N threads
Để thuận tiện trong nhiều trường hợp, threadIdx là một vector 3-thành phần, vì vậy
các thread có thể được định nghĩa bằng cách sử dụng một chiều, hai chiều, hoặc ba chiều
là chỉ số của thread, và một chiều, hai chiều, hoặc ba chiều với thread block Điều này cung cấp một cách dễ dàng để gọi tính toán trong một miền như một vector, ma trận Chỉ số của một thread và threadID nó liên quan đến nhau một cách đơn giản như sau: Với block một chiều, chúng là giống nhau; với block hai chiều kích thước (Dx, Dy) threadID của thread có chỉ mục (x, y) là (x, yDx); với block ba chiều kích thước (Dx, Dy,
Dz) threadID của thread có chỉ mục (x, y, z) là (x, yDx, zDxDy)
Ví dụ cộng hai ma trận A và B kích thước N*N và kết quả lưu ra ma trận C:
Trang 32Tuy nhiên một nhân có thể có nhiều block, bở vậy tổng số thread sẽ là tổng thread trên trên tất cả các block
Các block được tổ chức dưới dạng mảng một chiều, hai chiều hoặc ba chiều Grid of
Thread Blocks được minh họa trong hình dưới đây Tổng số thread blocks bên trong một grid được quyết định bởi kích thước dữ liệu đang được xử lý hay số các bộ xử ý của hệ
thống
Trang 33Hình 13: Grid of Thread Blocks
Số lượng các thread trên mỗi block và số block trên mỗi grid được quy định thông qua
ký pháp <<< >>> được khai báo kiểu dim3 Block hai chiều được chỉ ra trong ví dụ trên
Mỗi block trong grid được xác định bởi ID của nó và có thể truy xuất nó thông qua
biến blockIdx Số chiều của block có thể truy cập bên trong hạt nhân thông qua việc khai báo biến blockDim
Trở lại ví dụ trên viết theo cách sử dụng nhiều block như sau:
// Kernel definition
Trang 34global void MatAdd(float A[N][N], float B[N][N], float C[N][N])
{
Int i = blockIdx.x * blockDim.x + threadIdx.x;
Int j = blockIdx.y * blockDim.y + threadIdx.y;
Các CUDA thread có thể truy cập từ nhiều không gian bộ nhớ trong khoảng thời gian
chúng thực thi, như trong hình dưới Mỗi thread sẽ có bộ nhớ cục bộ, mỗi thread block sẽ
có bộ nhớ chia sẻ cho phép tất cả các thread của block dùng chung trong thời gian thực thi Tất cả các thread có thể truy xuất đến cùng bộ nhớ toàn cục
Ngoài ra còn có thêm hai bộ nhớ cho phép truy xuất bởi tất cả các thread đó là: constant (hằng) và texture memory (bộ nhớ kết cấu) Bộ nhớ toàn cục, hằng và bộ nhớ kết cấu được tối ưu hóa trong từng trường hợp sử dụng khác nhau Chúng được duy trì qua
Trang 35Mô hình lập trình CUDA cũng giả định các host và device duy trì không gian bộ nhớ
riêng biệt của chúng trong DRAM, được nhắc đến như là bộ nhớ host và bộ nhớ device
Vì vậy, một chương trình quản lý không gian bộ nhớ toàn cục, hằng, và kết cấu có thể
Trang 36nhìn thấy hạt nhân thông qua các lời gọi đến trong thời gian thực thi CUDA (được mô tả trong giao diện lập trình) Điều này bao gồm cấp phát bộ nhớ và giải phóng bộ nhớ cũng
như việc truyền tải dữ liệu giữa bộ nhớ host và bộ nhớ device
Hình 15: Mô hình lập trình không đồng nhất
e Khả năng tính toán
Khả năng tính toán của một thiết bị được thể hiện trên số hiệu phiên bản chính và số hiệu phụ đi kèm Thiết bị với cùng một số phiên bản chính có cùng kiến trúc cốt lõi
Trang 37GeForce 8 Series, Quadro FX 5600/4600, và Tesla là các giải pháp của năng lực tính toán 1.x (số hiệu phiên bản chính là 1) Số hiệu phụ tương ứng với một sự cải tiến để gia tăng các kiến trúc lõi, có thể bao gồm cả tính năng mới Các GeForce 8800 Series, Quadro FX 5600/4600, và Tesla là giải pháp được với khả năng tính toán 1.0 (số hiệu phụ là 0) và GeForce 8600 và 8500 Series có khả năng tính toán 1.1
1.3.3 Lập trình song song với CUDA C/C++
a Biên dịch chương trình với NVCC
Các Kernel (nhân) có thể được viết sử dụng kiến trúc tập lệnh của CUDA được gọi là PTX Nó thích hợp với các ngôn ngữ lập trình bậc cao như C/C++ Trong luận văn này,
mã nguồn được đưa ra và biên dịch bằng NVCC
NVCC là một trình điều khiển biên dịch bằng việc đơn giản hóa quá trình biên dịch
mã CUDA: Nó cung cấp các tùy chọn dòng lệnh đơn giản và quen thuộc thực hiện chúng bằng cách gọi tập hợp của các công cụ thực hiện các công đoạn biên dịch khác nhau Các tệp mã nguồn được biên dịch với NVCC bao gồm tập các mã nguồn thực hiện trên host hay trên device Công việc cơ bản của NVCC là tách riêng hai phần mã lệnh trên host và device và chuyển đổi chúng sang dạng các hàm thực thi
1.3.4 Nguyên tắc tối ưu hóa hiệu năng
a Chiến lược tối ưu hóa hiệu năng
Việc thực hiện tối ưu hóa hiệu năng gồm ba chiến lược cơ bản sau: