GPGPU [7] là công nghệ sử dụng bộ xử lý đồ hoạ GPU để thực hiện các ứng dụng tính toán vốn được tiến hành trên CPU.. đã được áp dụng trên nhiều lĩnh vực đòi hỏi khối lượng tính toán lớn
Trang 1Phạm Nguyễn Quang Anh
ỨNG DỤNG CÔNG NGHỆ TÍNH TOÁN ĐA DỤNG TRÊN
CÁC BỘ XỬ LÝ ĐỒ HOẠ TRONG BÀI TOÁN
PAGERANK
Chuyên ngành: Công nghệ thông tin
LUẬN VĂN THẠC SĨ KHOA HỌC CÔNG NGHỆ THÔNG TIN
NGƯỜI HƯỚNG DẪN KHOA HỌC:
T.S Nguyễn Hữu Đức
Trang 2MỤC LỤC HÌNH 3
ĐẶT VẤN ĐỀ 4
CHƯƠNG I: BÀI TOÁN PAGERANK 7
1 Các phương pháp xếp hạng trang web dựa vào các siêu liên kết 7
1.1 Hyperlink-Induced Topic Search (HITS) 7
1.2 Phương pháp PageRank 9
2 Tính toán vectơ PageRank 17
3 Tham số trong mô hình PageRank 19
4 Kết luận 19
CHƯƠNG 2: GPU VÀ CÔNG NGHỆ TÍNH TOÁN ĐA DỤNG GP-GPU 21
1 Các bộ xử lý đồ họa đa lõi của Nvidia 21
2 Kiến trúc của GPU Tesla 24
3 Môi trường phát triển ứng dụng cho GPU – CUDA 28
3 1 Khả năng mở rộng của CUDA 29
3.2 Các khái niệm chính 31
3.2 Lập trình không đồng nhất 40
3.3 Khả năng tính toán .41
3.4 Giao diện lập trình 41
3.5 Biên dịch với NVCC 42
3.6 CUDA C 42
4 Tổng kết 43
CHƯƠNG 3: ÁP DỤNG GPU TRONG TÍNH PAGERANK 45
1 Tiền xử lý dữ liệu 45
2 Hướng tiếp cận - giải thuật 48
1.1 Giải thuật tuần tự: 48
Trang 31.2 Hướng song song hoá: 50
1.3 Thao tác nguyên tử (atomic operation) 53
1.4 Điều kiện dừng 55
3 Lưu trữ đồ thị 57
4 Bảng băm 58
Xây dựng bảng băm 60
CHƯƠNG 4: THỬ NGHIỆM VÀ ĐÁNH GIÁ 62
1 Thử nghiệm 62
2 Đánh giá 64
CHƯƠNG 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 65
1 Kết luận 65
2 Hướng phát triển 65
TÀI LIỆU THAM KHẢO 66
Trang 4MỤC LỤC HÌNH
Hình 1: Ví dụ về một đồ thị web 11
Hình 2: Node 3 là vũng rank 13
Hình 3: GPU dành cho nhiều transistor hơn CPU để xử lý dữ liệu 22
Hình 4: Số phép tính dấu phẩy động trên giây và băng thông bộ nhớ của CPU và GPU 22
Hình 5: Kiến trúc Tesla 25
Hình 6: CUDA được thiết kế để hỗ trợ nhiều ngôn ngữ hoặc các API khác nhau 29
Hình 7: Khả năng tự mở rộng 31
Hình 8: Lưới của các block 35
Hình 9: Phân cấp bộ nhớ 39
Hình 10: Lập trình không đồng nhất 40
Hình 11: Kiến trúc của một Web Crawler 46
Hình 12: Tính PageRank trên nhiều luồng GPU 51
Hình 13: Giải thuật scan tìm max trên 8 phần tử 56
Hình 14: Cấu trúc bảng băm 58
Hình 15: Các bước xây dựng bảng băm 61
Trang 5ĐẶT VẤN ĐỀ
Máy tìm kiếm (Search engine) hiện là công cụ không thể thiếu trong thời đại thông
tin, giúp người dùng tìm được những gì mình cần một cách nhanh chóng và chính xác Các máy tìm kiếm lưu trữ thông tin của các trang web trích ra từ các trang html Các trang này được lấy về bởi một Web crawler (còn được gọi là spider) – một trình duyệt web tự động đi theo các liên kết trên các site Dữ liệu của các trang web được lưu trữ trong một cơ sở dữ liệu chỉ mục, mục tiêu của chỉ mục này là cho phép thông tin được tìm kiếm một cách nhanh nhất Khi người dùng nhập một câu truy vấn (bằng các từ khoá), máy tìm kiếm sẽ kiểm tra bộ chỉ mục của nó và cung cấp một danh sách các trang khớp nhất theo tiêu chí của mình Sự hữu dụng của máy tìm kiếm phụ thuộc vào mức độ liên quan của tập kết quả trả về Có thể có hàng triệu trang web có chứa một từ hoặc cụm từ xác định, một vài trang lại có mức độ liên quan, độ quan trọng cao hơn các trang khác Hầu hết các máy tìm kiếm đều áp dụng các phương pháp xếp hạng các kết quả để cung cấp những kết quả tốt nhất lên đầu Cách thức máy tìm kiếm xác định trang web nào là khớp nhất, thứ tự hiển thị các kết quả là khác nhau giữa các máy tìm kiếm Trên thực tế, việc sắp xếp này được thực hiện bởi việc kết hợp hai tiêu chí, đó là nội dung và độ quan trọng của văn bản Nhiều luật đã được đưa ra để tính độ tương quan dựa trên nội dung Ví dụ, nhiều Máy tìm kiếm đặt các trang web có từ khoá tìm kiếm ở tiêu để có trọng số cao hơn các trang có các từ đó ở trong thân bài Độ quan trọng của văn bản mà chúng ta sẽ chú trọng trong đồ án này được xác định bằng việc phân tích cấu trúc các siêu liên kết (hyperlink) của web Hai tiêu chí này sẽ được kết hợp với nhau để xác định điểm số tổng hợp cho mỗi trang và Máy tìm kiếm sẽ sử dụng điểm số này để sắp xếp
Năm 1998, Sergey Brin và Larry Page đưa ra một công thức tính độ quan trọng của trang web gọi là PageRank [1] PageRank đã được Google sử dụng cho Máy tìm kiếm
Trang 6của mình Tư tưởng của PageRank là thông tin trên web có thể được phân cấp bởi mức
độ nổi tiếng dựa trên liên kết: một trang web được sắp xếp cao hơn nếu có nhiều liên kết trỏ đến nó hơn PageRank của một trang được định nghĩa một cách đệ quy và phụ thuộc vào số lượng và giá trị PageRank của tất cả các trang trỏ đến nó Mặc dù chỉ là một trong các yếu tố quyết định thứ tự các kết quả trả về, PageRank luôn là nền tảng của tất cả các công cụ tìm kiếm của Google và đã cho thấy được sự vượt trội so với các phương pháp phân tích cấu trúc liên kết khác
Việc tính toán PageRank được thực hiện trên lượng dữ liệu khổng lồ (hàng triệu đến hàng tỷ trang web) và đòi hỏi một khối lượng tính toán lớn Theo ước tính, số lượng trang web trên World Wide Web hiện là khoảng hơn 40 tỷ Với kích thước dữ liệu lớn như vậy, việc tính toán PageRank là một thách thức không nhỏ
Ngoài ra có một đặc điểm quan trọng của World Wide Web là tính động Tính động ở đây được thể hiện ở hai khía cạnh Thứ nhất, nội dung của từng trang web có thể thay đổi liên tục Điều này dẫn tới sự thay đổi trong các liên kết của trang web và tương ứng
là sự thay đổi của cấu trúc web Thứ hai, kích thước của World Wide Web tính theo số trang web tăng lên liên tục Có hàng tỷ trang web mới được tạo ra mỗi năm Tính động của World Wide Web khiến việc tính toán PageRank gặp nhiều khó khăn Để các giá trị PageRank luôn được cập nhật trước sự thay đổi không ngừng của World Wide Web thì giai đoạn tính toán PageRank phải được thực hiện liên tục trong thời gian càng ngắn càng tốt Điều này đòi hỏi các hệ thống đủ mạnh cho nhu cầu tính toán này Luận văn hướng đến việc ứng dụng công nghệ tính toán đa dụng trên các bộ xử lý đồ họa (GPGPU – General Purpose Computation on Graphic Processing Units) cho bài toán PageRank
GPGPU [7] là công nghệ sử dụng bộ xử lý đồ hoạ (GPU) để thực hiện các ứng dụng tính toán vốn được tiến hành trên CPU Năng lực tính toán của các GPU tỏ ra vượt trội
so với bộ xử lý của Intel với khả năng song song hoá cao trên rất nhiều luồng GPGPU
Trang 7đã được áp dụng trên nhiều lĩnh vực đòi hỏi khối lượng tính toán lớn như tin sinh, xử lý tín hiệu số, mã hoá và thám mã, mô phỏng, các bài toán khai phá dữ liệu,…
Phạm vi của đồ án: Đồ án sẽ nghiên cứu về lý thuyết PageRank, tư tưởng hình thành của nó, cách thức mô hình hoá bài toán Đồ án sẽ đề xuất phương pháp tính toán PageRank bằng giải thuật tuần tự trên CPU Từ giải thuật tuần tự này, đồ án sẽ nghiên cứu hướng song song hoá giải thuật, cách tổ chức cấu trúc dữ liệu, các thao tác tối ưu hoá do tác giả đề ra để thực hiện việc tính toán trên GPU Cuối cùng, các thử nghiệm trên các bộ dữ liệu thực tế sẽ được thực hiện để đo đạc khả năng tăng tốc khi tính toán PageRank trên GPU so với trên CPU
Từ đó, tổ chức của luận văn gồm các phần như sau:
- Chương 1: Chương này tìm hiểu các phương pháp đánh giá trang web dựa trên các siêu liên kết, trong đó tập trung vào phương pháp PageRank: ý tưởng xây dựng nên PageRank, các bước xây dựng, điều chỉnh, hoàn thiện công thức
- Chương 2: Giới thiệu công nghệ tính toán song song đa dụng trên các bộ xử lý đồ hoạ GPU
- Chương 3: Đưa ra cách tiếp cận để giải quyết bài toán, xây dựng chương trình tuần tự trên CPU và song song trên GPU
- Chương 4: Trình bày các thử nghiệm, so sánh hiệu năng tính toán thông qua thời gian thực hiện của hai chương trình tuần tự và song song
- Chương 5: Kết luận và đề xuất hướng phát triển cho đề tài
Trang 8CHƯƠNG I: BÀI TOÁN PAGERANK
Trong chương này chúng ta sẽ tìm hiểu các phương pháp xếp hạng trang web dựa trên cấu trúc của các siêu liên kết trong đó tập trung vào giải thuật PageRank Chương này
sẽ trình bày tư tưởng cơ bản của PageRank, cách biểu diễn PageRank bằng công thức toán học, các điều chỉnh đối với công thức này để phục vụ cho việc tính toán
1 Các phương pháp xếp hạng trang web dựa vào các siêu liên kết
Trong phần này chúng ta tìm hiểu các phương pháp xếp hạng trang web Để làm được điều này , chúng ta định nghĩa Web như là một đồ thị Cấu trúc liên kết của Web tạo nên một đồ thị có hướng Các node của đồ thị biểu diễn một trang web và các cung có hướng thể hiện các siêu liên kết Các liên kết đi đến một trang được gọi là các liên kết vào (inlink), và các liên kết xuất phát từ một trang được gọi là các liên kết ra (outlink)
1.1 Hyperlink-Induced Topic Search (HITS)
HITS là thuật toán phân tích liên kết để đánh giá các trang web, được phát triển bởi Jon Kleinberg [9] HITS sử dụng cả liên kết vào và liên kết ra để tính mức độ nổi tiếng của từng trang web HITS đưa ra định nghĩa hub và authority Một trang web được coi là hub nếu nó có nhiều liên kết ra, và trang web có nhiều liên kết vào được coi là authority Một trang có thể vừa là hub vừa là authority HITS sẽ tính toán cả hai thước
đo cho mỗi trang web: giá trị authority – đánh giá giá trị của nội dung của trang và giá trị hub – đánh giá giá trị các liên kết mà trang web trỏ tới các trang khác Tư tưởng của HITS là: một trang là một hub tốt (có giá trị hub cao) khi nó trỏ tới các authority tốt, và
Trang 9một trang web là một authority tốt nếu nó được trỏ bởi các hub tốt Gọi E là tập các cạnh có hướng trong đồ thị web và eij là cạnh đi từ node i đến node j Công thức của HITS để tính giá trị authority xi và giá trị hub yi của trang i như sau:
Trang 10Sau khi N được dựng nên, việc tính HITS được thực hiện trên đồ thị này Vòng lặp tính toán sẽ dừng khi ta đạt được độ chính xác mong muốn
Một trong những ưu điểm của HITS nằm ở cách đánh giá bằng 2 tham số đo HITS đưa
ra hai danh sách đã sắp xếp cho người dùng: một danh sách với các trang có giá trị authority cao và một danh sách với các trang có giá trị hub cao Người dùng có thể lựa chọn giữa hai danh sách này Đôi khi người dùng muốn các trang có authority cao bởi
vì họ cần tìm sâu vào một truy vấn Ở lần khác, họ có thể muốn các trang có hub cao khi họ đang tìm kiếm một cách rộng rãi
Một ưu điểm khác của HITS là kích thước của bài toán HITS đưa bài toán xếp hạng về một bài toán nhỏ hơn với các trang web liên quan đến từ khoá truy vấn Kích thước của
đồ thị này nhỏ hơn rất nhiều so với tổng số trang web trên web
Tuy nhiên, một trong những nhược điểm lớn của HITS là tính phụ thuộc vào truy vấn của nó Tại thời điểm truy vấn, đồ thị N phải được xây dựng và điều này được thực hiện cho mỗi lần tìm kiếm Trên thực tế, hiện nay có ít máy tìm kiếm sử dụng HITS
1.2 Phương pháp PageRank
Năm 1998, Page và Brin [1] đưa ra một phương pháp đánh giá các trang web sựa trên
các liên kết vào của chúng, gọi là PageRank Tư tưởng của PageRank là: một trang
web là quan trọng nếu nó được trỏ bởi các trang web quan trọng
Việc hình thành công thức PageRank được dựa trên một giả định là mỗi một siêu liên kết là một sự giới thiệu Một siêu liên kết từ trang web A tới trang B là một sự ghi nhận của A đối với B Do đó, một trang có nhiều sự giới thiệu (mà được xác định qua số liên
Trang 11kết vào) phải quan trọng hơn trang có ít liên kết vào Tuy nhiên trạng thái của trang web giới thiệu cũng cần được xét tới, tức là trọng số của trang web giới thiệu là nhỏ nếu trang đó có nhiều liên kết ra và ngược lại Một cách khác, một trang có rank cao nếu tổng số rank của các liên kết vào nó là cao Điều này đúng với cả hai trường hợp khi trang có nhiều liên kết vào và trang có một vài liên kết vào có trọng số cao
Gọi r P( )i là PageRank của trang Pi Giá trị này bằng tổng các PageRank của các trang web trỏ tới Pi:
( ) ( )
j Pi
j i
Ta có: 1
( ) ( )
Trang 12Giả sử chúng ta có đồ thị web như Hình 1
Hình 1: Ví dụ về một đồ thị web
Ta sẽ có PageRank của các trang web sau 2 vòng lặp đầu như sau:
Ban đầu Vòng lặp 1 Vòng lặp 2 Thứ tự sau vòng
Trang 13Các công thức (1) và (2) tính PageRank cho từng trang tại một thời điểm Sử dụng ma trận, tại mỗi vòng lặp chúng ta tính một vectơ PageRank, là một vectơ 1 n lưu giữ các giá trị PageRank của toàn bộ trang web chúng ta có Chúng ta sử dụng một vectơ 1 n
để biểu diễn các giá trị PageRank của tất cả trang web Để làm được điều này, chúng ta đưa ra một ma trận n n H và một vectơ 1 n T Ma trận H là một ma trận siêu liên kết chuẩn hoá theo hàng với Hij 1 / P i nếu có một cạnh từ điểm i tới điểm j, và 0 nếu ngược lại
Giả sử với đồ thị ở hình 1, chúng ta có ma trận H như sau:
Các phần tử khác không ở hàng i tương ứng với các liên kết ra của trang i, trong khi đó các phần tử khác không ở cột i tương ứng với các liên kết vào của trang i Chúng ta cũng đưa ra vectơ ( )k T
là vectơ PageRank tại vòng lặp thứ k Sử dụng các quy ước này, công thức (2) có thể viết lại thành:
Trang 14- mỗi vòng lặp của công thức (3), tương ứng với một lần thực hiện phép nhân vectơ với
ma trận Phép tính này có độ phức tạp O(n2), trong đó n là kích thước của ma trận vuông H
- H là ma trận rất thưa (phần lớn các phần tử bằng 0) bởi hầu hết các trang web chỉ trỏ tới một lượng nhỏ các trang web khác Điều này dẫn tới hai lợi thế Thứ nhất, chúng cần dung lượng lưu trữ tối thiểu, vì chúng ta chỉ cần lưu trữ các phần tử khác không Thứ hai, việc nhân vectơ với ma trận thưa có khối lượng tính toán ít hơn nhiều so với O(n2) của ma trận dày Trên thực tế, nó có độ phực tạp tính toán là O(nnz(H)), trong đó nnz(H) là số lượng phần tử khác không của ma trận H Ước lượng cho thấy rằng các trang web có trung bình 10 liên kết ra, có nghĩa là H có khoảng 10n phần tử khác không, so với n2 phần tử khác không của một ma trận dày hoàn toàn Điều này dẫn tới việc nhân vectơ với ma trận trong công thức (3) có độ phức tạp giảm xuống còn O(n)
Brin và Page ban đầu khởi tạo quá trình lặp với (0)
sẻ Trong ví dụ ở Hình 2, node treo 3 là một vũng rank:
Hình 2: Node 3 là vũng rank
Trong ví dụ phức tạp hơn của hình 1, cụm các node 4, 5, 6 tạo nên một "kho" PageRank Chỉ sau 13 vòng lặp của công thức (2), ta có (13)T
= (0, 0, 0, 2/3, 1/3, 1/5)
Trang 15Ví dụ này còn cho thấy một vấn đề khác của PageRank gây ra bởi các vũng Vì một số node thu hút hầu hết PageRank, các node còn lại có điểm số bằng 0 Khi đó việc xếp hạng các node bằng PageRank sẽ gặp khó khăn khi phần lớn các node có PageRank bằng 0
1.2.2 Những điều chỉnh cho mô hình cơ bản
Để khắc phục những nhược điểm của mô hình ban đầu, Page và Brin đưa ra một số điều chỉnh Page và Brin sử dụng hình ảnh trực quan của một người lướt web một cách ngẫu nhiên (random surfer) để giải thích cho những thay đổi này Một người lướt web ngẫu nhiên sẽ đi một cách ngẫu nhiên dọc theo cấu trúc siêu liên kết của Web Khi đến một node với một vài liên kết ra, anh ta sẽ chọn một trong số chúng một cách ngẫu nhiên, đi đến một trang khác và tiếp tục quá trình này vô tận Tỷ lệ thời gian mà người duyệt web dừng ở một trang xác định là thước đo độ quan trọng tương đối của trang web đó
Tuy nhiên, mô hình người duyệt web ngẫu nhiên này có một vấn đề, anh ta sẽ dừng lại khi gặp các node treo Node treo là các node không có liên kết ra Để sửa chữa, Brin và Page đưa ra sự thay đổi đầu tiên, họ thay các dòng 0T gồm toàn các phần tử bằng 0 bởi các phần tử 1/neT Kết quả là, người duyệt web ngẫu nhiên, sau khi gặp một node treo
sẽ đi đến một node bất kỳ Với cấu trúc web như ở hình 1, ta có ma trận ngẫu nhiên như sau:
Trang 16Ta có thể thấy rằng: S H a(1 /ne T), trong đó ai bằng 1 nếu i là một node treo, và bằng 0 nếu ngược lại Vectơ nhị phân a được gọi là vectơ node treo S là ma trận có được bởi sự kết hợp giữa ma trận siêu liên kết ban đầu và mà trận cấp một 1 / T
ne
Sự điều chỉnh này đảm bảo rằng S là ngẫu nhiên Tuy nhiên, điều này chưa thể đảm bảo rằng kết quả sẽ hội tụ như mong muốn Brin và Page đưa ra một điều chỉnh khác, gọi là điều chỉnh nguyên thuỷ Điều chỉnh này như sau: khi những người duyệt web đi theo cấu trúc siêu liên kết của Web, sẽ có những thời điểm họ cảm thấy chán và bỏ cách duyệt web theo các siêu liên kết mà nhập một địa chỉ mới vào thanh địa chỉ của trình duyệt Khi việc này xảy ra, người duyệt web ngẫu nhiên sẽ "nhảy" đến một trang mới, từ đó anh ta tiếp tục duyệt web theo các siêu liên kết cho đến lần nhảy tiếp theo,
và tiếp tục như vậy Để mô hình hoá hoạt động này, Brin và Page đưa ra một ma trận mới G:
(1 ) eeT
G S n
Trong đó là một đại lượng vô hướng nằm trong khoản 0 và 1 G được gọi là ma trận Google Trong mô hình này, là tham số quyết định tỷ lệ thời gian người duyệt web ngẫu nhiên đi theo các siêu liên kết và thời gian anh ta nhảy ngẫu nhiên Giả sử = 0,6 khi đó 60% thời gian người duyệt web ngẫu nhiên đi theo các siêu liên kết và 40% thời gian anh ta nhảy đến một trang ngẫu nhiên Việc nhảy này là ngẫu nhiên vì ma trận dịch chuyển E1 / een Tlà đồng nhất, có nghĩa là người duyệt web dịch chuyển đến một trang bất kỳ với xác suất là như nhau
Ta có một số hệ quả từ sự điều chỉnh này:
- G là ngẫu nhiên: G được hình thành từ sự kết hợp của hai ma trận ngẫu nhiên là S và
1 / eeT
- G là tối giản: mọi trang web được nối trực tiếp đến mọi trang web khác
- G không tuần hoàn
Trang 17- G là nguyên thuỷ bởi Gk > 0 với mọi k Điều này dẫn tới là tồn tại một vectơ dương duy nhất T
, và công thức áp dụng trên G sẽ hội tụ đến vectơ này
- G là ma trận dày hoàn toàn, điều này không có lợi cho việc tính toán Tuy nhiên, G có thể được chuyển về ma trận siêu liên kết thưa H:
Tóm lại, công thức PageRank là:
Trang 182 Tính toán vectơ PageRank
Bài toán PageRank có thể được biểu diễn bởi hai cách:
1 Giải bài toán sau với T
Trang 19Tuy nhiên, với kích thước lớn của cấu trúc web, hai phương pháp này đều không thực
tế, chúng ta cần một phương pháp tính toán hiệu quả hơn Với những đặc điểm của ma trận G thì việc áp dụng phương pháp lặp có nhiều ưu điểm
Thứ nhất, phương pháp lặp là đơn giản, việc thực thi và lập trình là dễ dàng Ngoài ra, công thức lặp áp dụng cho G có thể được biểu diễn bởi ma trận rất thưa H:
Phương pháp lặp cũng có ưu điểm về mặt lưu trữ Ngoài ma trận thưa H và vectơ node treo a, chúng ta chỉ cần lưu trữ thêm một vectơ ( )k T
Vectơ này là hoàn toàn đặc, nghĩa là n số thực cần được lưu trữ
Lý do cuối cùng để sử dụng phương pháp lặp để tính vectơ PageRank liên quan đến số lượng vòng lặp cần cho tính toán Brin và Page ghi lại trong bài báo năm 1998, và được
Trang 20nhiều người công nhận, là chỉ cần khoảng 50-100 vòng lặp trước khi hội tụ và chúng ta được vectơ PageRank có độ chính xác xấp xỉ chấp nhận được Mỗi vòng lặp của phương pháp có độ phức tạp O(n) vì ma trận H rất thưa Kết quả là phương pháp lặp có
độ phức tạp tính toán tuyến tính và là phương pháp rất hiệu quả
Tham số trong công thức G S(1)Eđược dùng để điều chỉnh mức độ ưu tiên đối với việc duyệt theo cấu trúc web hay dịch chuyển theo ma trận E Tham số này cũng quyết định tốc độ hội tụ của phương pháp lặp PageRank Khi 1, số lượng vòng lặp cần thiết tăng lên đáng kể Việc chọn tham số phải được tính toán để cân bằng hai yếu tố: tác động của ma trận dịch chuyển E1 / een T được xây dựng nên với mục đích điều chỉnh và thời gian tính toán
Ngoài ra, hằng số không chỉ điều khiển sự hội tụ của phương pháp PageRank, nó còn ảnh hưởng đến mức độ nhạy cảm của vectơ PageRank cuối cùng Đặc biệt, khi
1
thì PageRank trở nên không ổn định và dao động mãnh liệt với cả các thay đổi nhỏ trong cấu trúc web Với tính chất động của cấu trúc web thì tính nhạy cảm này là một vấn đề quan trọng Chúng ta mong muốn một các lý tưởng rằng việc xếp hạng là
ổn định mặc dù có những thay đổi nhỏ trong cấu trúc web
4 Kết luận
Phương pháp PageRank được xây dựng dựa trên tư tưởng là: một trang web được đánh giá cao nếu trang web đó được nhiều trang web trỏ tới Giá trị PageRank của trang web xác định phụ thuộc vào giá trị PageRank của các trang có liên kết trỏ tới nó Công thức
Trang 21PageRank được xây dựng một cách đệ quy và được chuyển thành công thức lặp để phục vụ tính toán Một số thay đổi được đưa vào mô hình ba đầu với mục đích để vòng lặp hội tụ và có điểm dừng Việc tính toán PageRank được thực hiện trên một ma trận rất thưa với độ phức tạp tính toán O(n) Khối lượng tính toán để giải bài toán PageRank
là rất lớn do kích thước của dữ liệu đầu vào, điều này đòi hỏi cần có một công nghệ tính toán có hiệu năng cao Trong chương tiếp theo, chúng ta sẽ tìm hiểu công nghệ GPGPU để ứng dụng trong vào bài toán tính toán PageRank
Trang 22CHƯƠNG 2: GPU VÀ CÔNG NGHỆ TÍNH TOÁN ĐA DỤNG
GP-GPU
1 Các bộ xử lý đồ họa đa lõi của Nvidia
Trong vài năm gần đây, năng lực tính toán của các bộ xử lý đồ hoạ (GPU) đã tăng lên với tốc độ đáng kể so với CPU Tính đến tháng 6/2008, GPU thế hệ GT200 của NVidia
đã đạt tới ngưỡng 933GFlops gấp hơn 10 lần so với bộ xử lý hai lõi Intel Xeon 3.2 GHz tại cùng thời điểm Hình 2 thể hiện sự tăng tốc về năng lực tính toán của các bộ
xử lý đồ hoạ nVidia so với bộ xử lý Intel
Tuy vậy, sự vượt trội về hiệu năng này không đồng nghĩa với sự vượt trội về công nghệ GPU và CPU được phát triển theo hai hướng khác biệt: trong khi công nghệ CPU
cố gắng tăng tốc cho một nhiệm vụ đơn lẻ thì công nghệ GPU lại tìm cách tăng số lượng nhiệm vụ có thể thực hiện song hành Chính vì vậy, trong khi số lượng lõi tính toán trong CPU chưa đạt đến con số 8 lõi thì số lượng lõi xử lý GPU đã đạt đến 240 và còn hứa hẹn tiếp tục tăng tới trên 500 lõi trong năm 2010
Lý do phía sau sự khác biệt về khả năng tính toán dấu phẩy động giưa CPU và GPU chính là GPU được thiết kế cho mục đích tính toán mạnh, khả năng tính toán song song cao – và do đó được thiết kế sao cho có nhiều transistor được dùng để xử lý dữ liệu hơn
là dùng cho đệm dư liệu và điều khiển luồng, như hình minh họa trong Hình 3
Trang 23Hình 3: GPU dành cho nhiều transistor hơn CPU để xử lý dữ liệu
Hình 4: Số phép tính dấu phẩy động trên giây và băng thông bộ nhớ của CPU và
Trang 24Cụ thể hơn, GPU đặc biệt phù hợp để giải quyết các bài toán có thể tính toán song song
về dư liệu – tức là cùng chương trình được đem chạy trên nhiều bộ dữ liệu một cách song song – với cường độ số học cao – tỷ lệ số thao tác số học trên số thao tác với bộ nhớ Bởi vì cùng chương trình được thực hiện cho mỗi bộ dữ liệu, nên không cần đòi hỏi cao về hoạt động điều khiển luồng, và bởi vì chương trình được thực hiện trên nhiều bộ dữ liệu và có cường độ số học cao, nên độ trễ truy cập bộ nhớ có thể được ẩn
đi cùng với các phép tính thay vì phải đệm một lượng dư liệu lớn Rất may là đa số các bài toán yêu cầu năng lực tính toán lớn đều có thể quy về dạng song song dư liệu này
Xử lý song song dữ liệu ánh xạ các bộ dữ liệu tới các luồng (thread) xử lý xong xong Nhiều ứng dụng xử lý các tập dư liệu lớn có thể dùng một mô hình lập trình song song cho việc tăng tốc tính toán Trong kết xuất 3D, các tập lớn điểm ảnh và vectơ được ánh xạ tới các luồng song song Tương tự, các ứng dụng xử lý ảnh và đa phương tiện như là hậu xử lý các ảnh đã kết xuất, mã hóa và giải mã video, chỉnh kích cỡ ảnh,
và nhận dạng mẫu có thể ánh xạ các khối ảnh và các điểm ảnh tới các các luồng xử lý Thực tế, nhiều giải thuật năm ngoài lĩnh vực kết xuất và xử lý ảnh cũng được tăng tốc với xử lý dư liệu song song, từ xử lý tín hiệu nói chung hoặc mô phỏng vật lý tới tính toán kinh tế hoặc tính toán về sinh học
Bên cạnh việc phát triển các bộ xử lý đồ hoạ có năng lực tính toán lớn, các hãng sản xuất cũng quan tâm tới môi trường phát triển ứng dụng cho các bộ xử lý đồ hoạ này CUDA là môi trường phát triển ứng dụng cho các bộ xử lý đồ hoạ của nVidia, bao gồm một ngôn ngữ lập trình song song dữ liệu cùng với các công cụ biên dịch, gỡ rối,
và giám sát thực thi cho các ứng dụng trên các bộ xử lý này
Trang 252 Kiến trúc của GPU Tesla
Để tiến thêm một bước xa hơn nữa, NVIDIA tung ra dòng sản phẩm có tên gọi Tesla, đây là dòng sản phẩm chuyên dụng dành cho cho tính toán hiệu năng cao
Kiến trúc tính toán và đồ họa hợp nhất Tesla đã phát triển, gia tăng đáng kể về số lượng so với phạm vi của các GPU đồ họa không lập trình được – khả năng xử lý các mảng dữ liệu ồ ạt đa tiến trình của nó dần trở thành một nền tảng hợp nhất hiệu năng cao cho cả những ứng dụng tính toán đồ họa và ứng dụng tính toán song song thông thường trên GPU
Bằng cách chia tỉ lệ số các processors (bộ xử lý) và các thành phần bộ nhớ, kiến trúc Tesla đã mở rộng một dải thị trường các GPU bao gồm: những GPU có hiệu năng cao như GeForce 8800, những sản phẩm tính toán chuyên nghiệp như Quadro, Tesla và những dòng card GeForce GPU chủ đạo đa dạng về giá cả Những đặc trưng tính toán của các dòng card này làm cho việc lập trình với các các lõi GPU trở nên dễ dàng hơn trong môi trường lập trình C và với môi trường CUDA Và việc nó sẵn có trong các máy laptop, desktop, workstation, và server với môi trường lập trình C và phần mềm CUDA, đã tạo nên những nền tảng kiến trúc siêu máy tính Tesla đầu tiên ở khắp mọi nơi
Kiến trúc Tesla được xây dựng xung quanh một mảng có thể mở rộng của các SM (streaming multiprocessors – đa xử lý dòng lệnh) Những GPU hiện nay có thể thực hiện từ 768 cho tới 12288 tiến trình thực thi đồng thời Việc mở rộng qui mô thực thi song song hóa một cách trong suốt trên một dải rộng (của các dòng GPU) sẽ là chìa khóa mục tiêu của cả kiến trúc GPU và mô hình lập trình CUDA
Trang 26Hình 5: Kiến trúc Tesla
Hình trên trình bày một GPU với 14 SMs - tương đương với 112 lõi SP (streaming processor), kết nối liên thông với 4 bộ nhớ DRAM bên ngoài Khi một chương trình CUDA trên host CPU gọi một kernel – grid kernel (C dành cho CUDA là mở rộng của
C, nó cho phép người lập trình có thể định nghĩa các hàm C được gọi là nhân - kernel
Và khi được gọi, nhân này sẽ được thực hiện N lần song song với nhau bởi N tiến trình CUDA (CUDA thread) khác nhau, trái ngược với chỉ có một tiến trình được chạy như hàm C thông thường), đơn vị phân phát công việc tính toán, gọi tắt là CWD (compute work distribution) sẽ liệt kê các block (block – khối, trong khối này có nhiều thread,
và trong một grid thì có nhiều block) của lưới và bắt đầu phân phối các block này tới các SM với khả năng sẵn sàng thực thi (sẵn sàng chạy) Các tiến trình (thread) trong một block thread (block chứa nhiều thread) được thực hiện đồng thời trên một SM Và
Trang 27khi các block thread kết thúc, đơn vị CWD sẽ thực thi các block mới trên các bộ xử lý trống, rảnh rỗi
Một SM có chứa 8 lõi xử lý vô hướng SP – scalar processor (SP), 2 đơn vị chức năng đặc biệt – special function units (SFUs), dành cho tính toán siêu việt, 1 đơn vị dòng lệnh đa tiến trình – multithreaded instruction unit (MT IU), và 1 bộ nhớ chia sẻ trên nó (on-chip shared memory) SM đảm nhiệm việc tạo, quản lý, và thực hiện tới 768 tiến trình đồng thời trên phần cứng mà không tốn kém chi phí lập lịch Nó có thể thực thi 8 block tiến trình CUDA nhiều lần và trong cùng một thời điểm, và bị giới hạn bởi số thread và các bộ nhớ tài nguyên SM cung cấp rào chắn CUDA syncthreads(), rào chắn này có tác dụng đồng bộ hóa bên trong SM với một lệnh đơn Rào chắn nhanh chóng đồng bộ cùng nhau việc tạo các tiến trình thấp hơn và sắp xếp tiến trình một cách hiệu quả và không làm giảm hiệu năng, cho phép một thread mới được tạo để tính toán mỗi véc-tơ, điểm ảnh và con trỏ dữ liệu
Để quản lý hàng trăm tiến trình chạy trong nhiều ứng dụng khác nhau, Tesla SM sử dụng một kiến trúc mới gọi là “đơn dòng lệnh đa tiến trình” – SIMT (single-instruction, multiple-thread) SM ánh xạ mỗi thread tới một lõi vô hướng SP, và mỗi một thread vô hướng sẽ chạy độc lập với nhau với địa chỉ tập lệnh và trạng thái thanh ghi riêng của nó Đơn vị SM SIMT tạo, quản lý, sắp xếp và thi hành các thread trong một nhóm gồm 32 thread song song được gọi là warps (Thuật ngữ này bắt nguồn từ dệt may, công nghệ song song các tiến trình đầu tiên) Các thread riêng lẻ sắp xếp theo trật tự thành một SIMT warp khởi động cùng nhau tại cùng một địa chỉ chương trình nhưng tự do rẽ nhánh và thực thi một cách độc lập Mỗi SM quản lý một nhóm gồm 24 warp với 32 thread trên mỗi warp, và tổng cộng có 768 thread
Các lệnh được đưa ra cùng một thời điểm, đơn vị SMIT sẽ lựa chọn một warp mà đã sẵn sàng thực hiện và đưa ra lệnh tiếp theo tới các thread đã được chuẩn bị trong warp Một warp thực thi một lệnh chung tại một thời điểm, do vậy hiệu quả cao nhất thu
Trang 28chúng Nếu các thread của một warp phân rẽ qua một dữ liệu phụ thuộc điều kiện rẽ nhánh, thì warp sẽ thi hành từng nhánh đường dẫn lấy được, vô hiệu hóa các thread mà không ở trên đường dẫn đó, và khi tất cả các đường dẫn được hoàn thành, các thread hội tụ trở lại để thực hiện trong cùng một đường dẫn Sự rẽ nhánh xảy ra chỉ trong một warp; các warp khác nhau thực thi độc lập với nhau và không chú ý tới chúng đang thực thi một đường dẫn chung hoặc đường dẫn đoạn code rời rạc Và kết quả là, kiến trúc GPU Tesla đột nhiên trở nên mềm dẻo và hiệu quả hơn trên các nhánh code so với các GPU trước đây, như các warp 32 thread của chúng bị hạn chế nhiều hơn so với độ rộng SIMD (single-instruction multiple-data) của các GPU trước kia
Kiến trúc SIMT gần giống với cấu trúc véc-tơ SIMD mà trong đó một lệnh điều khiển nhiều quá trình xử lý các phần tử Một điều then chốt khác là cấu trúc véc-tơ SIMD bộc
lộ độ rộng với phần mềm, trong khi các lệnh SIMT định rõ việc thực thi và trạng thái phân nhánh của một thread đơn Trong sự trái ngược với các máy véc-tơ SIMD, SIMT cho phép lập trình viên viết đoạn code song song phân cấp các thread một cách độc lập, các thread vô hướng, cũng như là code song song dữ liệu dành cho phối hợp các thread Dành cho các mục đích đúng đắn, lập trình viên có thể về căn bản lờ đi động thái SIMT; tuy nhiên, chắc chắn hiệu năng có thể nhận thấy bởi việc chăm sóc đoạn code ít khi yêu cầu các thread trong warp phân rẽ
Trong thực tiễn, nó tương tự như vai trò của các dòng đệm trong code truyền thống: kích thước dòng đệm có thể lờ đi một cách an toàn khi thiết kế với tính chất đúng đắn nhưng phải được xem xét dưới cấu trúc đoạn code khi thiết kế cho hiệu năng tối đa Các kiến trúc véc-tơ, trên một hướng khác, yêu cầu phần mềm kết hợp một khối để load trong các véc-tơ và điều khiển sự phân rẽ một cách thủ công Một biến thread thường cư trú trong các thanh ghi đang sống Bộ nhớ chia sẻ 16Kb SM có độ trễ truy cập thấp và băng thông cao tương tự như bộ nhớ đệm L1; nó giữ các biến CUDA shared trên block để dành cho việc kích hoạt các block thread SM cung cấp việc nạp/lưu trư các lệnh để truy cập biến CUDA device trên GPU có bộ nhớ DRAM
Trang 29gắn ngoài Nó kết hợp thành một khối truy cập riêng lẻ của các thread song song trong cùng một warp và ở trong vài truy cập block bộ nhớ khi các địa chỉ rơi vào trong cùng một block và gặp các tiêu chuẩn liên kết Bởi vì việc trễ của bộ nhớ chung có thể tới hàng trăm xung nhịp xử lý, các chương trình CUDA copy dữ liệu tới bộ nhớ chia sẻ khi nó phải được truy cập rất nhiều lần bởi một block thread Tesla nạp/lưu trữ các lệnh
bộ nhớ sử dụng địa chỉ là các byte số nguyên để thuận tiện cho trình biên dịch chuyển đổi tối ưu các đoạn code Tiến trình lớn đếm trong mỗi SM, cũng như là hỗ trợ cho nhiều yêu cầu nạp còn tồn tại, giúp đỡ che phủ độ trễ trong việc nạp và sử dụng tới các
bộ nhớ DRAM gắn ngoài Kiến trúc GPU Tesla mới nhất cũng cung cấp các lệnh bộ nhớ đọc-sửa-ghi nguyên tử, thuận tiện cho sự giảm bớt song song và quản lý cấu trúc song song dư liệu
Các ứng dụng CUDA thực hiện tốt trên cácGPU kiến trúc Tesla bởi vì mô hình song song CUDA, sự đồng bộ, các bộ nhớ chia sẻ, và phân cấp của các nhóm thread ánh xạ hiệu quả tới các chức năng của kiến trúc GPU, và cũng bởi vì CUDA cũng là mô hình ứng dụng song song nhanh nhất
3 Môi trường phát triển ứng dụng cho GPU – CUDA
Vào tháng 11/2006, hãng NVIDIA phát hành CUDATM, một kiến trúc tính toán song song đa dụng – với một mô hình lập trình song song và kiến trúc tập lệnh mới – có thể thúc đẩy động cơ (engine) tính toán song song trong các GPU của NVIDIA để giải quyết nhiều bài toán tính toán phức tạp theo một hướng hiệu năng hơn nhiều so với CPU
CUDA đi cùng với một môi trường phần mềm cho phép người phát triển sử dụng C như ngôn ngữ lập trình cấp cao Như minh họa ở Hình 5, các ngôn ngữ hoặc các giao diện lập trình ứng dụng khác được hỗ trợ, như CUDA FORTRAN, OpenCL,
và DirectCompute
Trang 30Hình 6: CUDA được thiết kế để hỗ trợ nhiều ngôn ngữ hoặc các API khác nhau
3 1 Khả năng mở rộng của CUDA
Sự xuất hiện của các CPU đa lõi và GPU nhiều lõi cho thấy rằng xu thế chủ đạo của các chip xử lý bây giờ là các hệ thống song song Hơn nữa, đặc tính song song của chúng tiếp tục gia tăng theo luật của Moore Sự thách thức là để phát triển phần mềm ứng dụng mở rộng (scale) trong suốt về tính song song để tận dụng được sự gia tăng về
số lượng của các lõi xử lý, càng có nhiều các ứng dụng 3D mở rộng (scale) một cách trong suốt tính song song của nó tới các GPU nhiều lõi với các số lượng thay đổi lớn của các lõi
Mô hình lập trình CUDA được thiết kế để vượt qua thách thức này trong khi vẫn duy trì một độ khó về học tập thấp cho các người lập trình quen thuộc với ngôn ngữ lập trình chuẩn như C
Trang 31Tại nhân của CUDA là ba khái niệm trừu tượng chính – một cơ chế phân cấp của các nhóm thread, các bộ nhớ chia sẻ, và rào chắn đồng bộ - đơn giản được bộc lộ tới người lập trình như là một tập nhỏ các mở rộng về ngôn ngữ
Các khái niệm trừu tượng này cung cấp cơ chế song song dữ liệu và song song tiến trình nhỏ được lồng bên trong song song dữ liệu và song song tác vụ lớn Chúng hướng người lập trình phân chia bài toán thành các bài toán con thô có thể được giải quyết độc lập một cách song song bởi các block gồm các tiến trình, và mỗi bài toán con thành các phần mịn hơn mà có thể được giải quyết cùng nhau theo song song bởi tất cả các tiến trình bên trong block đó Sự phân chia này biểu hiện khả năng của ngôn ngữ đó là cho phép các tiến trình phối hợp với nhau để xử lý mỗi bài toán con, và tại cùng một thời điểm cho phép mở rộng một cách tự động Quả thực, mỗi block tiến trình có thể được lập lịch trên bất kỳ số lượng lõi xử lý nào đang có, theo bất cứ thứ tự nào, đồng thời hay là tuần tự, do đó một chương trình CUDA đã biên dịch có thể chạy trên mọi số lượng lõi xử lý như được minh họa ở Hình 6, và chỉ vào lúc chạy hệ thống mới cần biết
số lượng lõi xử lý vật lý
Mô hình lập trình có thể mở rộng này cho phép kiến trúc CUDA mở rộng một phạm vi thương mại rộng lớn băng cách là đơn giản mở rộng số lượng lõi xử lý và các phân vùng bộ nhớ: từ các GPU dành cho tính toán hiệu năng cao GeForce và các sản phẩm cao cấp Quadro và tính toán Tesla tới một số đa dạng các loại rẻ hơn, dòng chính là các GPU GeForce
Một chương trình đa luồng được phân chia thành các block tiến trình và chúng được thực thi độc lập với nhau, do đó một GPU nhiều lõi sẽ tự động thực hiện chương trình
đó nhanh hơn một GPU có ít lõi hơn
Trang 32Hình 7: Khả năng tự mở rộng
3.2 Các khái niệm chính
Phần này giới thiệu các khái niệm chính của mô hình lập trình CUDA bằng cách tóm tắt cách chúng được mở rộng từ ngôn ngữ C
Trang 33a Kernel
CUDA C mở rộng ngôn ngữ C bằng cách cho phép người lập trình định nghĩa các hàm của C, được gọi là các kernel, mà khi được gọi, sẽ được thực hiện N lần theo song song bởi N thread CUDA, ngược với chỉ một lần như các hàm thông thường của C
Một kernel được định nghĩa sử dụng đặc tả khai báo global và số tiến trình CUDA thực hiện kernel đó trong một lần gọi kernel được chỉ ra bằng cách dùng một cú pháp cấu hình sự thực thi mới <<< >>> Mỗi tiến trình thực thi kernel được gán một
ID tiến trình duy nhất mà có thể được truy cập bên trong kernel bằng biến có sẵn threadIdx
Để minh họa, đoạn mã ví dụ mẫu sau đây thực hiện cộng hai vector A và B có kích thước N và lưu kết quả vào vector C: