Tải bản đầy đủ (.pdf) (6 trang)

Ứng dụng tính toán đa dụng trên các bộ xử lý đồ họa đa lõi vào tăng tốc bài toán pagerank

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (599.76 KB, 6 trang )

Ứng dụng tính tốn đa dụng trên các bộ xử lý đồ
họa đa lõi vào tăng tốc bài toán PageRank
Nguyễn Anh Tú


Tóm tắt-- PageRank, một phương pháp đánh giá độ quan trọng
của các trang web dựa trên siêu liên kết, là nền tảng cho việc xếp
hạng trang web trong máy tìm kiếm Google và nhiều máy tìm
kiếm khác. Tuy nhiên, việc tính tốn PageRank là một thách thức
khơng nhỏ do số lượng website ngày càng lớn (ước tính hơn 40 tỷ
trang). Đồng thời, mơi trường World Wide Web lại có sự thay
đổi liên tục về cấu trúc liên kết và số lượng các trang web. Trong
khi đó, để phục vụ cho truy vấn, giá trị PageRank cuả các trang
web lại phải được cập nhật liên tục và cần thực hiện trong
khoảng thời gian ngắn. Bài báo này đưa ra cách tiếp cận sử dụng
năng lực tính tốn song song rất lớn của các bộ xử lý đồ họa đa
lõi để tăng tốc q trình tính tốn PageRank. Bài báo trước hết
sử dụng một định dạng gọi là binary link structure file [3] để lưu
trữ dữ liệu đồ thị web. Sau đó tiến hành song song hóa giải thuật
PageRank để thực hiện tính tốn trên các lõi của GPU. Chương
trình được viết bằng ngôn ngữ CUDA và thử nghiệm trên hệ
thống trang bị 2 card kép NVIDIA Geforce GTX 295 (tổng cộng
4GPU), sử dụng bộ dữ liệu thực tế là tập các trang web tiếng việt
được crawling tại Việt Nam từ tháng 1/2011 tới tháng 2/2011,
gồm 7 triệu trang web, 132 triệu liên kết. Các kết quả thử nghiệm
cho thấy chương trình tính PageRank song song nhanh hơn từ 10
lần (1GPU) đến 20 lần (4GPU) so với một phiên bản tuần tự trên
CPU Intel Core 2 Quad Q8400 2.67GHz. Kết quả này minh
chứng khả năng ứng dụng cơng nghệ tính tốn trên các bộ xử lý
đồ họa trong lĩnh vực tính tốn PageRank.


Từ khóa-- CUDA, GOOGLE, GPGPU, PAGERANK
I. GIỚI THIỆU
Máy tìm kiếm (Search Engine) là công cụ không thể thiếu
trong thời đại thơng tin, giúp người dùng tìm kiếm thơng tin
mình cần một cách nhanh chóng và chính xác trên Internet.
Hầu hết các máy tìm kiếm hiện nay đều áp dụng phương pháp
xếp hạng để đưa những kết quả tốt nhất lên đầu. Trên thực tế,
việc sắp xếp được thực hiện dựa theo hai tiêu chí: nội dung và
độ quan trọng của trang 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 thứ hạng cho
chúng. Nhiều phương pháp đã được đưa ra để đánh giá độ
quan trọng của trang web, tuy nhiên có một phương pháp cho
thấy sự vượt trội, được dựa vào việc phân tích cấu trúc các
siêu liên kết (hyperlink) của trang web. Năm 1998, Sergey
Brin và Larry Page đã đưa ra một cơng thức tính độ quan
trọng dựa trên các siêu liên kết gọi là PageRank [1]. PageRank
Cơng trình này được thực hiện dưới sự bảo trợ của Trung tâm tính tốn
hiệu năng cao – trường Đại học Bách Khoa Hà Nội.
Nguyễn Anh Tú, sinh viên lớp Truyền thơng và Mạng máy tính, khóa 52,
Viện Công nghệ thông tin và Truyền thông, trường Đại học Bách Khoa Hà
Nội (điện thoại: 0166.639.29.68, e-mail: ).

© Viện Cơng nghệ thông tin và Truyền thông, trường
Đại học Bách Khoa Hà Nội.

đã trở thành nền tảng trong cơng cụ tìm kiếm Google và đã
cho thấy được sự vượt trội so với các phương pháp dựa trên
phân tích cấu trúc liên kết khác. PageRank thường được tính
tốn offline trong suốt q trình xử lý của Web Crawler [2]

trước khi bất cứ một câu truy vấn nào được thực hiện.
Việc tính tốn PageRank ngày nay đang trở thành một thách
thức không nhỏ do đồ thị web ngày càng lớn (ước tính hiện
nay lên tới hơn 40 tỷ trang web). Bên cạnh đó, một đặc điểm
của World Wide Web là tính động, có nghĩa là nội dung và số
lượng của các trang web thường thay đổi liên tục, dẫn đến sự
thay đổi các liên kết của trang web và tương ứng là sự thay đổi
của cấu trúc trang web. Trong khi đó, để phục vụ cho truy vấn,
giá trị PageRank của các trang web lại phải được cập nhật liên
tục và cần thực hiện trong khoảng thời gian ngắn.
Trong vài năm gần đây, một xu hướng nhằm tăng cường
năng lực tính tốn của các hệ thống máy tính với chi phí hợp
lý đó là sử dụng các bộ xử lý đồ họa (GPU) nhiều lõi phục vụ
cho các nhu cầu phi đồ họa. Với sự thiết kế đặc thù cho tính
tốn diễn họa, các bộ xử lý đồ họa thường có năng lực tính
tốn rất lớn, thậm chí đạt tới hàng TFLOPS, cao hơn nhiều lần
so với một máy tính cá nhân đơn CPU đơn lõi, dù là mạnh
nhất. Sự gia tăng năng lực tính tốn của GPU cùng với sự phát
triển của các mơi trường lập trình như CUDA, Brook+ đã mở
ra cho chúng ta một hướng đi mới trong tính tốn hiệu năng
cao: tính tốn đa dụng trên các bộ xử lý đồ họa (GPGPU –
General-purpose computation on Graphic Processing Units)
Bài báo này tập trung vào việc cải thiện thời gian tính tốn
PageRank bằng việc song song hóa các thao tác tính tốn giá
trị PageRank của từng website trên mỗi thread của GPU. Kết
quả thử nghiệm với bộ dữ liệu thực tế, là tập 7 triệu trang web
tiếng việt, 132 triệu liên kết được thu thập tại Việt Nam từ
tháng 1/2011, cho thấy phiên bản song song nhanh hơn 10 lần
(1GPU) tới 20 lần (4GPU) so với phiên bản tuần tự trên CPU.
Bài báo được trình bày như sau: Phần II đưa ra mô tả những

kết quả nghiên cứu đã được cơng bố trong lĩnh vực tính tốn
PageRank. Phần III mơ tả lý thuyết bài toán PageRank, và
định nghĩa cấu trúc lưu trữ binary link structure file. Phần IV
mô tả chi tiết việc áp dụng GPGPU trong tính tốn PageRank.
Phần V là kết quả thử nghiệm, và phần VI là kết luận của bài
báo.
II. NHỮNG KẾT QUẢ NGHIÊN CỨU ĐÃ CÔNG BỐ
Các cơng trình nghiên cứu đã cơng bố trong lĩnh vực tính
tốn PageRank tập trung khai thác sức mạnh tính toán của các
hệ thống song song phân cụm Cluster Computing. Nhìn
chung, trọng tâm của các nghiên cứu là giảm chi phí truyền
thơng, phân chia dữ liệu hiệu quả và đạt tốc độ hội tụ nhanh
nhất. Zhu [4] sử dụng phương pháp lặp để tăng tốc tính tốn
PageRank trong mơi trường phân tán. Greenwald và Wicks [5]


sắp xếp lại ma trận liên kết và giảm số phép nhân vector với
ma trận, kết quả là giảm khối lượng tính tốn và tổng chi phí
truyền thơng. Gleich [6] mơ hình hóa việc tính tốn PageRank
như là một hệ thống tuyến tính và đánh giá hiệu suất tính tốn
PageRank trên hệ thống 70 node tính tốn theo mơ hình
Beowulf cluster. Một đóng góp khác là Wu [7] thực hiện trên
các card đồ họa AMD sử dụng mơ hình lập trình OpenCL,
trong đó ơng chủ yếu tập trung vào việc song song hóa q
trình nhân vector với ma trận. Phương pháp này cũng được
Cevahir [8] triển khai trên hệ thống GPU Cluster với hơn 100
node tính tốn.
Bài báo này tác giả tập trung vào thực hiện việc song song
hóa quá trình tính tốn PageRank với mỗi thread tính tốn cho
một node, sử dụng phương pháp lặp, và được triển khai trên hệ

thống gồm 2 card kép NVIDIA Geforce GTX 295 (tổng cộng
4GPU).
III. CƠ SỞ LÝ THUYẾT
A. Bài tốn Pagerank
A.1 Cơng thức nguyên thủy
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 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 web 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 (được xác định qua số liên
kế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. Tóm lại, 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 ( ) là PageRank của trang . Giá trị này bằng tổng
các PageRank của các trang web trỏ tới .
( )=∑

(

)

|

|


(1)

Trong đó,
là tập các trang trỏ đến và | | là số lượng
liên kết ra của . Vấn đề với công thức này là giá trị ( ),
PageRank của trang web trỏ tới vẫn chưa được tính tốn.
Để giải quyết vấn đề này, Brin và Page sử dụng phương pháp
lặp. Họ giả sử rằng ban đầu tất cả các trang web có giá trị
PageRank như nhau (là ⁄ với n là tổng số lượng trang web
có được). Công thức (1) được áp dụng bằng cách thay thế giá
( ) là
trị PageRank của lần lặp trước vào ( ). Goi
PageRank của trang
tại vịng lặp k+1. Ta có:
( )=∑

(
|

)
|

(2)

Quá trình này được bắt đầu với ( ) =
cho tất cả các
trang và được lặp lại cho đến khi các giá trị PageRank hội
tụ đến một giá trị cuối cùng.
A.2 Biểu diễn công thức dưới dạng ma trận
Các công thức (1) và (2) có thể đưa về dạng ma trận để

thuận tiện cho tính tốn. Định nghĩa ma trận H là một ma trận
với
= ⁄| | nếu có một cạnh từ node i tới node j, và 0 nếu
ngược lại. Như vậy, các phần tử khác 0 ở 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 0 ở
cột i tương ứng với các liên kết vào của trang i. Như vậy, tại
mỗi vịng lặp ta tính một vector PageRank, kích thước
và kí hiệu là , lưu giữ các giá trị PageRank hiện tại của toàn
bộ trang web chúng ta có.
Với phương pháp lặp, người ta định nghĩa vector ( ) là
vector PageRank tại vòng lặp thứ k. Như vậy, cơng thức (2) có
thể viết lại thành:
(
)
= ( )
(3)
Có một nhận xét là ma trận H 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. Do đó, phép nhân vector với ma trận H có
( )), trong đó
( ) là số
độ phức tạp thực tế là O(
lượng các phần tử khác 0 của ma trận H.
Brin và Page ban đầu khởi tạo quá trình lặp với ( ) =

, với là vector hàng đơn vị. Tuy nhiên, có một vấn đề
khi sử dụng cơng thức (3) là vũng rank. Có nghĩa là các trang
web tích lũy ngày càng nhiều PageRank sau mỗi vòng lặp,
chiếm gần hết điểm số của các trang khác mà không chia sẻ.

Như vậy, 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 thì sẽ khơng thể xếp hạng cho chúng
được.
A.3 Những điều chỉnh cho công thức nguyên thủy
Để khắc phục những nhược điểm của công thức nguyên
thủy, Page và Brin đưa ra một số điều chỉnh. Vấn đề vũng
rank đề cập ở trên xảy ra khi một số node khơng có liên kết ra
(gọi là node treo). Khi đó, thực tế là người duyệt web sẽ nhảy
bất kì tới một node khác. Như vậy, trong ma trận siêu liên kết,
các hàng gồm toàn số 0 sẽ được thay bởi 1/n (là xác suất
anh ta nhảy ngẫu nhiên tới một node khác khi gặp node treo).
( ⁄
), trong đó bằng
Ta định nghĩa ma trận S:
1 nếu i là node treo, và bằng 0 nếu ngược lại. Vector nhị phân
a được gọi là vector node treo.
Sự điều chỉnh này đảm bảo S là ngẫu nhiên. Tuy nhiên, điều
này không đảm bảo được kết quả sẽ hội tụ như mong muốn.
Brin và Page đưa ra thêm một điều chỉnh nữa 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 hố hoạt động này, Brin và Page
đưa ra một ma trận mới G:
(
)
Trong đó, α là số thực trong khoảng [ ]. Nó 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. Tham số α này đóng vai trị quyết định tới
tốc độ hội tụ của phương pháp lặp PageRank.
Ta biến đổi một chút:
(
)

) (
)
= (
(
(
) ) ⁄
=


Tóm lại, cơng thức PageRank sẽ là:
(
)
= ( )
Ma trận G được gọi là ma trận Google. Ta sẽ biến đổi một
chút công thức trên như sau:
(
)
= ( )
( )
= ( )

( )
=
( ( )
)
(4)
Việc sử dụng phương pháp lặp có một số ưu điểm sau đây:
 Việc tính tốn PageRank không phụ thuộc vào ma
trận, cả trong việc lưu trữ và xử lý ma trận hệ số.
 Lợi điểm trong lưu trữ. Ngoài ma trận thưa H và
vector node treo a, ta chỉ cần lưu trữ thêm một vector
( )
. Vector này hoàn toàn đặc, nghĩa là n số thực
cần được lưu trữ.
 Số lượng vòng lặp cần cho tính tốn chỉ cần khoảng
50-100 vịng lặp trước khi hội tụ và chúng ta được
vector 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( ) 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 tốn tuyến tính và là phương
pháp rất hiệu quả.
B. Binary link structure file
Đầu vào của PageRank là đồ thị web trong đó mỗi trang
web là một node và các siêu liên kết tạo nên các cạnh của đồ
thị. Để phục vụ cho tính tốn, các URL mà Web Crawler thu
thập được sẽ được băm thành các số nguyên 4 byte gọi là ID,
nhằm phục vụ cho lưu trữ và đảm bảo hai URL khác nhau sẽ
có hai ID khác nhau. Sau quá trình thu thập, kết quả nhận
được là đồ thị web được mô tả như sau:

Số liên kết ra

(4 byte)

ID nguồn (4 byte)
3345
342
56939
46274

2
1
2
3

Danh sách ID đích
(4 byte / phần tử)
45, 1889
832
12, 1026
242, 3563, 19257


Hình 1: Mơ tả cấu trúc lưu trữ đồ thị
Cả đồ thị được lưu trữ theo các bản ghi. Mỗi bản ghi gồm
ba trường: trường đầu tiên là ID của node nguồn, trường thứ
hai chiếm 4 byte ghi số lượng liên kết ra của node đó. Trường
cuối cùng là một danh sách các ID tương ứng với các trang
web đích. Với cách tổ chức như thế này, dung lượng lưu trữ
đồ thị chiếm là:
(
) byte, trong đó V là số node

và E là số cạnh.
IV. ÁP DỤNG GPGPU VÀO TÍNH TỐN PAGERANK
A. Tiền xử lý dữ liệu
Dữ liệu đầu vào của bài toán PageRank là một đồ thị web
trong đó mỗi trang web là một node và các siêu liên kết tạo
nên các cạnh của đồ thị. Tuy nhiên, có một khó khăn trong
việc tham chiếu tới các node trong đồ thị làm ảnh hưởng tới
tốc độ tính tốn, đó là hàm băm của Web Crawler khi băm
mỗi URL ra một số nguyên 4 byte (ID) thì các ID này lại
khơng liên tục từ 0 tới n-1. Do đó, trước hết tác giả tiến hành

tiền xử lý đồ thị bằng cách đánh lại chỉ số cho n ID, để chúng
]. Chương trình đánh lại chỉ số
nằm trong khoảng [
được thực hiện trên CPU như mô tả dưới đây.
Đầu tiên là sử dụng mảng array để lưu trữ n ID tương ứng
với n node. Như vậy, chỉ số mới sẽ là số thứ tự của mỗi ID
trong mảng array. Sử dụng hàm QuickSort để sắp xếp mảng
theo thứ tự tăng dần. Do tính chất của hàm băm, khơng có 2
phần tử nào giống nhau; do đó, mảng array sau khi sắp xếp sẽ
cho ra dãy đơn điệu tăng. Bài báo sử dụng mảng index để lưu
lại vị trí cũ của n ID, phục vụ cho việc truy xuất tới phần tử
sau này.
Sau đó, tơi tiến hành đọc các ID trong đồ thị web. Với mỗi
ID, chương trình sẽ tiến hành tìm kiếm nhị phân trên mảng
array để tìm tới vị trí của nó, chắc chắn vị trí mới này là một
]. Vị trí tìm được chính là ID
số nguyên trong khoảng [
mới cho node đang xét, và được cập nhật vào đồ thị web mới.
). Giả

Độ phức tạp của quá trình đánh lại chỉ số là (
mã của giải thuật như sau:
for i = 0 to n-1 do
{
// tạo mảng array gồm ID của n node nguồn
}
/*
sắp xếp tăng mảng array.
lưu ý giữ lại chỉ số cũ để phục vụ cho truy xuất
sau này
*/
QuickSort(array);
for i=1 to graph_size do
{
fread(node); //đọc ID node nguồn
binary_search(node, array, new_index);
graph_new += new_index;
fread(link_out); //đọc link_out
graph_new += link_out;
for j=1 to link_out do
{
fread(node); //đọc ID node đích
binary_search(node, array, new_index);
graph_new += new_index;
}
}

Hình 2: Chương trình đánh lại chỉ số cho đồ thị Web
B. Giải thuật tuần tự
Để tính tốn PageRank, tác giả sử dụng cơng thức tính đã

được đưa về theo ma trận H:
( )
( ( )
)
Vế phải của cơng thức có thể được chia làm ba số hạng:
( )
( )
)
,
và (
. Ngồi tốn hạng
cuối cùng là hằng số, việc tính tốn hai tốn hạng đầu cần sử
dụng kết quả tính tốn của vịng lặp trước (PageRank tính
được từ vịng lặp cuối).
Việc tính tốn hạng đầu tiên có thể được suy trực tiếp từ
cơng thức (1). Việc nhân ma trận với vector ( )
có độ
phức tạp O( ) bởi H là ma trận rất thưa. Giải thuật tuần tự của
được trình bày như sau:


( )
while ( ( )
) //điều kiện hội tụ
{
// Đặt lại giá trị của PageRank về 0 (O(V))
for i = 0 to n – 1
{
(


)

}
foreach
//duyệt từng cạnh của đồ thị (O(E))
{
(

)

(

( )

)
|

|

}
foreach
{

//duyệt qua các node treo
( )

}
//cộng số hạng thứ 2 và 3
for i = 0 to n – 1
{

(

)

(

)

(

)

}
}

Hình 3: Giải thuật tuần tự tính PageRank

tất cả các luồng của GPU sẽ đều phải truy cập đến biến chung.
Một cách tiếp cận là dùng giải thuật PrefixSum [9] để tính
tổng này. Nhưng ở đây có thể nhận xét rằng số lượng node
treo trong đồ thị web là không lớn, vì thế tơi lựa chọn một
phương án khác: sử dụng thao tác nguyên tử và kết hợp việc
giá trị dangling_value vào trong q trình duyệt cạnh để tính
số hạng đầu tiên ở bước thứ nhất. Phương pháp này tỏ ra hiệu
quả bởi hai lý do: thứ nhất, như đã nói, tỷ lệ các node treo
trong đồ thị là không lớn, do đó xác suất để hai luồng cùng
truy cập vào hai node treo là khơng nhiều, do đó mặc dù ta sử
dụng thao tác nguyên tử nhưng khả năng đụng độ giữa hai
luồng là thấp, nhờ đó vẫn giữ được tính song song cao trong
q trình tính tốn; thứ hai, ta không phải tốn thêm bộ nhớ để

lưu trữ các node treo (chỉ cần xét số liên kết ra trong khi duyệt
đồ thị) cũng như bộ nhớ trong quá trình thực hiện giải thuật
PrefixSum.
Bước cuối cùng là tính số hạng thứ ba và tính giá trị
PageRank cuối cùng của vịng lặp. Cũng giống như bước đầu
tiên, thao tác này được thực hiện bằng cách tạo p luồng nhiều
lần, mỗi luồng thao tác trên một phần tử của vector PageRank.
Khác với bước thứ nhất, cơng đoạn tính tốn cuối cùng này
khơng có đụng độ giữa các luồng và do đó đạt được mức độ
song song tối đa.
Giải thuật tính tốn trên GPU như sau:
( )
while (| ( )
|
) //điều kiện hội tụ
{
//đặt lại giá trị PageRank về 0
for i = 0 to n – 1 in parallel
{

Trong quá trình thực hiện tính tốn, chương trình lưu trữ hai
mảng là thể hiện của hai vector ( ) và ( ). Sau khi mỗi vòng
lặp kết thúc, giá trị của mảng ( ) được copy về mảng ( ) ,
sau đó được đặt toàn bộ giá trị về 0 để phục vụ cho lần lặp tiếp
theo.
Độ phức tạp của giải thuật tuần tự theo tính tốn ở trên là
O(V+E), trong đó V là số node và E là số cạnh của đồ thị.
C. Hướng song song hóa
Nhận thấy, các giai đoạn tính tốn trong mỗi vịng lặp ở
giải thuật tuần tự trên có thể được song song hoá bằng cách

phân ra cho nhiều luồng của GPU. Về lý thuyết khi thao tác
trên vector PageRank có kích thước n, ta có thể sử dụng p
luồng với p = n để thực hiện trên toàn bộ vector cùng một lúc.
Tuy nhiên do giới hạn về phần cứng nên p thường rất nhỏ so
với n; do đó để thực hiện tính tốn song song chương trình sẽ
gọi nhiều lần, mỗi lần tạo ra p luồng, mỗi luồng xử lý một
phần tử của vector.
Để tính số hạng thứ nhất, mỗi luồng của GPU sẽ duyệt một
node tại một thời điểm, mỗi node sẽ có một danh sách các
cạnh ra của node đó. Luồng của GPU sẽ duyệt qua từng cạnh
ra này và lấy giá trị PageRank của node đang xét tại vịng lặp
trước (k) đóng góp vào giá trị PageRank tổng của các node mà
nó trỏ tới theo cơng thức tính tổng (1).

(

)

}
for i = 0 to n – 1 in parallel
{
if | |
{
foreach
{
(

)

(


( )

)
|

|

}
}
else
{

//node treo
//atomicAdd
( )

}
}
for i = 0 to n – 1 in parallel /*cộng số hạng
thứ 2 và 3 */
{
(

)

(

)


}
}

Hình 5: Giải thuật song song trên GPU
C.1 Hàm ngun tử atomicAdd

Hình 4: Tính PageRank trên nhiều luồng GPU
Theo bước thứ hai của giải thuật tuần tự, ta sẽ tính giá trị
dangling_value được tạo bởi các node treo. Tuy nhiên, nếu áp
dụng phương pháp tính như trong giải thuật tuần tự như trên
thì ta khơng thể song song hoá thao tác này được. Lý do là vì

Trong giải thuật, tác giả sử dụng một hàm có sẵn của CUDA
được gọi là hàm nguyên tử atomicAdd. Bởi vì, việc tính tốn
PageRank bằng nhiều luồng của GPU sẽ có xảy ra đụng độ,
khi hai hay nhiều node cùng trỏ tới một node. Khi đó, hai
luồng có thể đồng thời truy cập vào cùng một node ra để cộng
dồn giá trị PageRank. Hàm atomicAdd bản chất là một cơ chế
khóa hiệu quả để tuần tự hóa việc truy cập vào các node. Hàm


này đọc một từ 32bit ở một địa chỉ toàn cục hoặc shared, cộng
một số nguyên vào đó, và ghi kết quả trở lại địa chỉ. Trong
tồn bộ q trình, chỉ có luồng thực hiện lệnh atomicAdd được
truy cập vào địa chỉ, khơng một luồng nào khác có thể truy
cập vào địa chỉ này cho tới khi thao tác kết thúc. Tuy nhiên,
có một vấn đề nghiêm trọng là khi áp dụng hàm ngun tử để
tính tốn, các hàm này chỉ dùng được cho số nguyên. Trong
khi đó, giá trị PageRank lại là giá trị thực nằm trong khoảng
( ). Để khắc phục, tác giả biến đổi giá trị PageRank thành

các giá trị nguyên mà không ảnh hưởng tới độ chính xác u
cầu của bài tốn. Tác giả định nghĩa vector PageRank mới là
( )
:
( )

cho đến khi chỉ còn một node duy nhất, node này chứa giá trị
lớn nhất của phần tử trong mảng.

( )

( )

Tức là
chính là giá trị của với dấu phẩy được dịch
phải w chữ số. Nhân 2 vế công thức (4) với
ta được:
(
)
( )
( ( )
(
)
)
Lúc này mọi tính tốn được thực hiện trên vector
thay vì
. Các phép chia cũng được làm trịn về số ngun. Càng
dịch phải nhiều thì độ chính xác mà ( ) biểu diễn được càng
nhiều nhưng ( ) cũng ngày càng lớn. Có nghĩa là, tham số w
phải được chọn một cách hợp lý để vẫn đảm bảo độ chính xác

của các phép tốn mà khơng gây ra tràn số. Với số trang web
lên tới hàng triệu, bài báo này đặt
. Khi đó các giá trị
), khoảng này là an tồn cho các
nằm trong khoảng (
phép tốn trong cơng thức.
C.2 Điều kiện dừng
( )
Điều kiện duy trì vịng lặp là (| ( )
|
), tức là
khoảng cách giữa vector PageRank của hai vòng lặp liên tiếp
lớn hơn một ngưỡng xác định. Ở đây, tác giả chọn cơng thức
Chebyshev[10] để tính khoảng cách này. Theo đó, khoảng
cách giữa hai vector là sự chênh lệch lớn nhất giữa hai giá trị
của cùng một chiều:
|
|=
(|
|)
Như vậy việc tính khoảng cách Chebysev thực ra là tìm
).
phần tử lớn nhất trong tập các phần tử (
Với số lượng node trong đồ thị có thể lên tới hàng triệu
hoặc hàng chục triệu thì giá trị ε trên lý thuyết phải có độ
chính xác từ 8 số sau dấu phẩy trở lên, đó là độ chính xác cần
thiết để phân biệt giá trị PageRank của các node khác nhau.
Tuy nhiên, trên thực tế, vì PageRank khơng phải là thước đo
duy nhất để xếp hạng các trang web trong kết quả trả về (vì
cịn kết hợp mức độ liên quan về nội dung) thì độ chính xác

cao của giá trị PageRank là không quá cần thiết, nên giá trị
hoặc
là có thể chấp nhận được. Như đã
đề cập ở phần trên, các giá trị PageRank chúng ta thao tác là
( )
( )
với
thì giá trị tương ứng sẽ là
.
Trên GPU, tác giả dùng giải thuật scan [11] để tính
PrefixSum. Đầu tiên là xây dựng mảng gồm hiệu các phần tử
tương ứng với nhau trong hai mảng PageRank. Quá trình này
được thực hiện song song bởi p luồng GPU. Sau khi được
mảng hiệu này, ta tiến hành áp dụng giải thuật scan. Chương
trình chia mảng ra là các block, mỗi block gồm 1024 phần tử
(ngoại trừ block cuối cùng có số lượng phần tử có thể ít hơn).
Ý tưởng của giải thuật scan là xây dựng một cây nhị phân
cân bằng song song theo phương pháp từ dưới lên (bottom
up). Hai node cùng cấp được so sánh với nhau, giá trị lớn hơn
sẽ được dùng để làm gốc của cây lớn hơn. Quá trình lặp lại

Hình 6: Giải thuật scan tìm max trên 8 phần tử
Với n phần tử, số block sẽ là ⌈
⌉. Mỗi block này cũng
tương ứng là một block tính tốn của GPU, trong đó số lượng
luồng bằng 512 (số lượng luồng tối đa trong một block
CUDA). Áp dụng giải thuật scan cho mỗi block ta được mảng

⌉ phần tử ghi lại giá trị lớn nhất trong mỗi block. Với
mảng này, ta tiếp tục áp dụng việc chia block và thực hiện

scan trên mỗi block. Quá trình được lặp lại cho đến khi chỉ
cịn 1 block và ta tìm được phần tử lớn nhất của block đó,
cũng là phần tử lớn nhất của mảng ban đầu.
V. KẾT QUẢ THỬ NGHIỆM VÀ ĐÁNH GIÁ
A. Thử nghiệm
Hai chương trình tính tốn PageRank trên CPU và GPU
được xây dựng và triển khai thực hiện tại trung tâm tính tốn
hiệu năng cao trường Đại học Bách Khoa Hà Nội. Môi trường
thử nghiệm bao gồm một server được trang bị:
- Bộ xử lý Intel Core 2 Quad Q8400 2.67GHz.
- 8GB RAM.
- 2 card đồ họa kép NVIDIA GeForce GTX 295.
- Hệ điều hành CentOS 5.3.
A.1 Phiên bản trên CPU
Phiên bản chạy trên CPU được xây dựng với hai chương
trình. Một chương trình đơn giản chỉ sử dụng 1 luồng để tính
tốn theo giải thuật tuần tự đã đề cập ở trên. Một chương trình
dùng 4 luồng tính tốn để tận dụng tối đa tồn bộ core của bộ
xử lý. Giải thuật đa luồng trên CPU tương tự giải thuật trên
GPU. Một vấn đề là cần có thao tác trên CPU tương tự với
thao tác nguyên tử atomicAdd trên GPU. Hệ thống Linux cung
cấp hàm __sync_fetch_and_add có chức năng tương tự hàm
atomicAdd. Cũng giống như atomicAdd trên GPU, hàm
__sync_fetch_and_add cũng chỉ thao tác trên các số nguyên.
Vì vậy, các giá trị PageRank cũng phải biến đổi như đã làm
trong khi tính tốn trên GPU.
A.2 Phiên bản trên GPU
Trong đề tài, tác giả viết hai phiên bản chạy trên GPU, một
phiên bản chạy trên 1 GPU và một phiên bản chạy trên 4
GPU.



Đối với phiên bản chạy trên 1 GPU, dữ liệu về đồ thị web
được tải từ CPU lên GPU, sử dụng 2 mảng để tính tốn cho
lần lặp k và k+1 (tương ứng với hai vector ( ) và ( ) )
Đối với phiên bản chạy trên 4GPU, dữ liệu được phân chia
như sau: Đồ thị web được chia làm bốn phần bằng nhau, mỗi
phần được tải lên bộ nhớ của mỗi GPU. Chương trình sử dụng
hai mảng tương ứng hai vector ( ) và ( ) . Tuy nhiên,
trong mỗi vịng lặp, mỗi GPU sẽ tính tốn trên một phần tư
vector ( ) , tương ứng với một phần tư đồ thị web chứa trên
GPU đó. Kết thúc mỗi vòng lặp, bốn vector ( ) trên 4 GPU
được truyền về CPU để trộn lại, trước khi truyền ngược lại lên
GPU và truyền vào vector ( ) .
Để kiểm tra khả năng tăng tốc mạnh mẽ của GPU, tác giả
thực hiện thử nghiệm với bộ dữ liệu là đồ thị web được xây
dựng từ tập các web tiếng việt thu thập trong khoảng thời gian
từ tháng 1 đến tháng 2 năm 2011. Bộ dữ liệu này chứa khoảng
7 triệu trang web và 132 triệu liên kết.
A.3 Kết quả thử nghiệm
Việc đánh giá được thực hiện trên các giá trị α khác nhau.
Thời gian tính tốn được đo bằng đơn vị giây (s).
CPU 1
CPU 4
Single
Multi
α
thread
threads
GPU

GPU (4)
0.5
29.19165
15.76771
3.01419
1.60587
0.6
34.97308
18.90085
3.60987
2.05013
0.7
46.57511
25.19583
4.82156
2.62897
0.75
58.37653
31.62574
6.01332
3.45451
0.8
75.73101
40.95702
7.81736
4.60283
0.85
99.06957
53.49526
10.24953

5.59358
0.9
157.2996
85.28265
16.24351
8.29304
0.95
309.1649
167.2162
31.89439
16.17999
Hình 7: Bảng hiển thị kết quả thời gian tính tốn với bốn
phiên bản.

Hình 8: Biểu đồ so sánh thời gian tính tốn của bốn phiên bản
B. Đánh giá
Kết quả thử nghiệm cho thấy hiệu năng tính tốn PageRank
được tăng đáng kể khi thực hiện trên GPU: tăng 10 lần so với
khi chạy trên 1GPU và 20 lần so với việc tính tốn trên 4GPU.
Thử nghiệm này cũng cho thấy tác động của tham số α tới
q trình tính tốn. Giá trị α càng lớn, số vòng lặp để đạt tới
trạng thái hội tụ càng nhiều. Điều này đúng với lý thuyết đã đề
cập ở trên.

VI. KẾT LUẬN
Bài báo này đã đưa ra một cách tiếp cận sử dụng ưu điểm
tính tốn song song cực lớn của các bộ xử lý đồ họa đa lõi
nhằm tăng tốc q trình tính tốn PageRank, sử dụng hệ thống
hai card kép NVIDIA Geforce GTX 295. Giải thuật song song
được thực hiện dựa trên những biến đổi từ dữ liệu đồ thị các

trang web được thu thập dưới dạng Binary link structure file,
trong đó tập chỉ số đã được tác giả đánh lại. Nhờ đó, việc truy
xuất tới các node trong đồ thị được thực hiện một cách trực
tiếp, giảm đáng kể thời gian tính tốn.
Các kết quả thử nghiệm đã cho thấy khả năng tăng tốc đáng
kể khi áp dụng giải thuật song song trên GPU so với giải thuật
tuần tự, cụ thể là trên 1 GPU tăng được 10 lần và trên 4 GPU
là 20 lần.
VII. LỜI TRI ÂN
Tác giả xin gửi lời chân thành cám ơn tới TS. Nguyễn Hữu
Đức – giám đốc trung tâm Tính Tốn Hiệu Năng Cao, anh
Dương Nhật Tân – cán bộ trung tâm, và toàn thể anh chị em
trên trung tâm đã nhiệt tình giúp đỡ, tạo điều kiện cho tác giả
hồn thành đề tài nghiên cứu.
VIII. TÀI LIỆU THAM KHẢO
Brin, S. and Page, L. “The Anatomy of a Large-Scale Hypertextual Web
Search Engine”. In: Seventh International World-Wide Web Conference
(WWW 1998), April 14-18, 1998, Brisbane, Australia.
[2] Kobayashi, M. and Takeda, K. "Information retrieval on the web". ACM
Computing Surveys (ACM Press) pp 144–173, 2000.
[3] Bundit Manaskasemsak, Amon Rungsawang, "Parallel PageRank
Computation on a Gigabit PC Cluster", In Proceedings of 18th
International Conference on Advanced Information Networking and
Application, 2004.
[4] Yangbo Zhu, Shaozhi Ye, and Xing Li, “Distributed PageR-ank
computation based on iterative aggregation-disaggregation methods” in
Proceedings of the 14th ACM international conference on Information
and knowledge management.
[5] J. R. Wicks and A. Green wald , “More efficient parallel computation of
pagerank ,” in SIGIR ’07: Proceedings of the 30th annual international

ACM SIGIR conference on Research and development in information
retrieval. New York , NY, USA : ACM , 2007 ,pp. 861 – 862.
[6] David Gleich, “Fast parallel PageRank: A linear system approach,”
Tech. Rep., 2004.
[7] Tianji Wu, Bo Wang, Yi Shan, Feng Yan, Yu Wang, and Ningyi Xu,
“Efficient PageRank and spmv computation on AMD gpus,” Parallel
Processing, International Conference on, vol. 0, pp. 81–89, 2010.
[8] Ata Turk B. Barla Cambazoglu Akira Nukada Ali Cevahir, Cevdet
Aykanat and Satoshi Matsuoka, “Efficient PageRank on GPU clusters,”
18th Workshop for the evaluation of high-performance computing
architecture, 2009.
[9] Guy E. Blelloch, “Prefix Sums and Their Applications”, School of
Computer Science Carnegie Mellon University Pittsburgh, PA 15213
3890
[10] Cyrus. D. Cantrell “Modern Mathematical Methods for Physicists and
Engineers”. Cambridge University Press, 2000
[11] Mark Harris “Parallel Prefix Sum (Scan) with CUDA”, nVIDIA, 2007
[1]



×