Công nghệ tính toán song song cho phép giảm thời gian thực thi bài toán tùy thuộc cách phân chia và số bộ xử lý thực thi chương trình.. Với mục đích tìm hiểu và nghiên c u về thuật toán
Trang 1Đ I H C ĐÀ NẴNG
TR NG ĐẠI H C S PHẠM
-
NGUY N ĐĔNG KHOA
NÂNG CAO HI U NĔNG TệNH TOÁN
CHO CÁC BÀI TOÁN TÌM Đ NG ĐI NGẮN NHẤT
Trang 2Công trình được hoàn thành tại
TR NG ĐẠI H C S PHẠM
Ng i h ng d n khoa học: TS Nguy n Đình Lầu
Phản biện 1: PGS TSKH Trần Quốc Chiến
Phản biện 2: TS Nguyễn Quang Thanh
Luận văn đã được bảo vệ trước Hội đồng chấm Luận văn tốt nghiệp thạc sĩ ngành Hệ thống thông tin họp tại trường Đại học
Sư phạm vào ngày 06 tháng 4 năm 2019
Có thể tìm hiểu luận văn tại:
- Thư viện Trường Đại học Sư phạm – ĐHĐN
- Khoa Công nghệ thông tin, trường Đại học Sư phạm - ĐHĐN
Trang 3M Đ U
1 Lý do ch ọn đ tài
Công nghệ thông tin đang phát triển với một tốc độ chóng
mặt, đi cùng đó là lượng dữ liệu khổng lồ Để xử lý lượng dữ liệu khổng lồ đó đòi hỏi khối lượng tính toán rất lớn và thời gian là yếu tố quyết định tính thực tiễn c a bài toán đó.Để tăng tốc độ tính toán, các nhà khoa học đã đưa ra hai giải pháp:
Th nhất là cải tiến công nghệ, tăng tốc độ xử lý c a máy tính Công việc này đỏi hỏi nhiều thời gian, công s c và tiền bạc nhưng tốc độ thì chỉ đạt đến một giới hạn nhất định
Th hai là chia bài toán ra thành những bài toán nhỏ để chạy song song trên nhiều bộ xử lý
Các nhà khoa học đã tập trung nghiên c u ở giải pháp th hai, từ đó ra đời thuật toán song song Đó là việc sử dụng đồng thời nhiều tài nguyên tính toán để giải quyết một bài toán Các tài nguyên tính toán có thể bao gồm một máy tính với nhiều bộ vi xử lý hay một tập các máy tính kết nối mạng hay là một sự kết hợp c a hai dạng trên Công nghệ tính toán song song cho phép giảm thời gian thực thi bài toán tùy thuộc cách phân chia và số bộ xử lý thực thi chương trình Nguyên tắc quan trọng nhất c a tính toán song song chính là tính đồng thời hay xử lý nhiều tác vụ cùng một lúc
Với mục đích tìm hiểu và nghiên c u về thuật toán song song để giải quyết bài toán đồ thị một cách hiệu quả hơn, thời gian
xử lý ngắn hơn do đó tôi chọn đề tài: “Nâng cao hiệu năng tính toán
cho các bài toán tìm đường đi ngắn nhất và cây khung nhỏ nhất “
2 M c tiêu và nhi m v
2.1 Mục tiêu
Nghiên c u thuật toán song song, ng dụng một thư viện cụ
Trang 4thể nâng cao hiệu năng tính toán cho hai thuật toán Dijkstra và Prim nhằm giảm thời gian thực hiện, góp phần nâng cao hiệu năng hoạt động c a hệ thống
3.1 Đối tượng nghiên cứu của đề tài
⁻ XLSS và thuật toán song song
⁻ Các bài toán đồ thị
⁻ Lập trình song song với MPI
3.2 Phạm vi nghiên cứu của đề tài
⁻ Tổng quan về XLSS và phân tán
⁻ Tổng quan về lý thuyết đồ thị
4 Ph ng pháp nghiên c u
4.1 Nghiên cứu lý thuyết
⁻ XLSS và thuật toán song song
⁻ Đồ thị và các bài toán trên đồ thị
⁻ Tìm hiểu lập trình song song với MPI
4.2 Nghiên cứu thực nghiệm
⁻ Xây dựng sơ đồ, thuật toán song song
⁻ Lập trình song song với MPI bằng Visual Studio
5 B c c đ tài
Ngoài phần mở đầu và kết thúc, nội dung chính c a luận văn
Trang 5có 3 chương
Chương 1: Xử lý song song và lập trình với MPI
Chương 2: Các thuật toán trên đồ thị
Chương 3: Nghiên cứu ứng dụng thuật toán song song trên thư viện MPI
6 ụ nghĩa khoa học và thực ti n c a đ tài
Nghiên c u và nâng cao hiệu năng c a hệ thống bằng XLSS Tối ưu hơn về thời gian và chi phí so với phương pháp thông thường
Có thể áp dụng cho một số lĩnh vực cụ thể và một số bài toán
có độ ph c tạp về thời gian lớn, những bào toán thời gian thực
Làm giảm chi phí giá thành, thời gian cho các cơ quan, doanh nghiệp khi ng dụng, triển khai thực tế
CH NG 1 X LÝ SONG SONG VÀ L P TRÌNH
V I MPI 1.1 Gi i thi u v x lý song song
Ngày nay, rất nhiều bài toán yêu cầu khả năng tính toán và lưu trữ rất lớn thì mô hình kiến trúc này còn hạn chế Do đó để giải quyết các bài toán này cần có những hệ thống máy tính đ mạnh để thực hiện một cách nhanh chóng và hiệu quả Vì vậy, hướng xử lý song song với việc kết hợp nhiều bộ xử lý vào trong một máy tính được lựa chọn để giải quyết các bài toán đặt ra
Xử lý song song hay tính toán song song là quá trình xử lý
gồm nhiều tiến trình được kích hoạt đồng thời và cùng tham gia giải quyết một vấn đề, nói chung là thực hiện tính toán trên những hệ thống đa bộ xử lý [1]
Máy tính song song là tập hợp các bộ xử lý kết nối với nhau
Trang 6theo một kiến trúc xác định cùng hợp tác hoạt động và trao đổi song song
1.2 Ki n trúc máy tính song song
1.2.1. Mô hình SISD
1.2.2. Kiến trúc song song SIMD
1.2.3. Kiến trúc song song MISD
1.2.4. Mô hình máy tính MIMD
1.3 Thu t toán song song
1.3.1. Quy trình thiết kế thuật toán song song
1.3.2. Nguyên lý thiết kế thuật toán song song
1.3.3. Các cách tiếp cận trong thiết kế
1.3.4. Phân tích đánh giá thuật toán song song
Trong thuật toán tuần tự chúng ta chỉ quan tâm đến độ ph c tạp
về thời gian và không gian, nhưng trong thuật toán song song thường có thêm một số đại lượng đo lường khác Độ ph c tạp thời gian c a thuật toán song song không chỉ đơn giản là việc đếm số câu lệnh cơ bản như trong thuật toán tuần tự mà thay vào đó nó phụ thuộc vào các phép toán
cơ bản này có thể được thực hiện trên p bộ xử lý như thế nào Bên cạnh
độ ph c tạp thời gian độ ph c tạp về số bộ xử lý cũng là một đại lượng quan trọng trong phân tích thiết kế thuật toán song song
Thiết kế thuật toán song song hiệu quả bao gồm việc lựa chọn cấu trúc dữ liệu phù hợp, phân bố bộ xử lý và cuối cùng là thực hiện thuật toán Ba đại lượng này tác động lẫn nhau như một tổ ch c tính toán
1.4 Các mô hình l p trình song song
1.4.1. Mô hình chia sẽ bộ nhớ
1.4.2. Mô hình luồng
1.4.3. Mô hình truyền thông điệp
Trang 71.4.4. Mô hình phân hoạch dữ liệu
1.5 L p trình song song trong môi tr ng MPI
1.5.1. Giới thiệu
Giao th c truyền thông điệp MPI là một thư viện các hàm và macro có thể được gọi từ các chương trình sử dụng ngôn ngữ C, Fortran, và C++ Như tên gọi c a nó MPI được xây dựng nhằm sử dụng trong các chương trình để khai thác hệ thống các bộ xử lý bằng cách truyền thông điệp
1.5.1. Một số đặc điểm của lập trình MPI
1.6.1. Các lệnh quản lý môi trường MPI
Các lệnh này có nhiệm vụ thiết lập môi trường cho các lệnh thực thi MPI, truy vấn chỉ số c a tác vụ, các thư viện MPI,
- MPI Init khởi động môi trường MPI
MPI_Init (&argc, &argv)
Init ((argc, argv)
- MPI Comm size trả về tổng số tác vụ MPI đang được thực hiện trong communicator (chẳng hạn như trong MPI_COMM_WORLD)
MPI_Comm_size (comm,&size)
Comm::Get_size()
- MPI Comm rank trả về chỉ số c a tác vụ (rank) Ban đầu mỗi tác vụ
sẽ được gán cho một số nguyên từ 0 đến (N-1) với N là tổng số tác
vụ trong communicator
MPI_COMM_WORLD
Trang 8MPI_Comm_rank (comm, &rank)
Comm::Get_rank()
- MPI Abort kết thúc tất cả các tiến trình MPI
MPI_Abort (comm, errorcode)
1.6.3. Cơ chế truyền thông điệp
1.6.4. Các lệnh truyền thông điệp blocking
Một số lệnh thông dụng cho chế độ truyền thông điệp blocking gồm có:
- MPI Send gửi các thông tin cơ bản
Trang 9MPI_Send(&buf,count,datatype,dest,tag,comm)
Comm::Send(&buf,count,datatype,dest,tag)
- MPI Recv nhận các thông tin cơ bản
MPI_Recv(&buf,count,datatype,source,tag,comm,&status) Comm::Recv(&buf,count,datatype,source,tag,status)
- MPI Ssend gửi đồng bộ thông tin, lệnh này sẽ chờ cho đến khi thông tin đã được nhận (thông tin được gửi sẽ bị giữ lại cho đến khi
bộ đệm c a tác vụ gửi được giải phóng để có thể sử dụng lại và tác
vụ đích (destination process) bắt đầu nhận thông tin)
MPI_Ssend (&buf,count,datatype,dest,tag,comm)
Comm::Ssend(&buf,count,datatype,dest,tag)
- MPI Bsend tạo một bộ nhớ đệm (buffer) mà dữ liệu được lưu vào cho đến khi được gửi đi, lệnh này sẽ kết thúc khi hoàn tất việc lưu dữ liệu vào bộ nhớ đệm
Comm::Rsend(&buf,count,datatype,dest,tag)
Trang 10- MPI Sendrecv gửi thông tin đi và sẵn sàng cho việc nhận thông tin
từ tác vụ khác
MPI_Sendrecv (&sendbuf,sendcount,sendtype,dest,sendtag,
&recvbuf,recvcount,recvtype,source,recvtag,comm,&status) Comm::Sendrecv(&sendbuf,sendcount,sendtype,dest,sendtag,
1.6.5. Các lệnh truyền thông điệp non-blocking
Một số lệnh thông dụng cho chế độ truyền thông điệp blocking gồm có:
non-MPI Isend gửi thông điệp non-blocking, xác định một khu vực c a
bộ nhớ thực hiện nhiệm vụ như là một bộ đệm gửi thông tin
MPI_Isend (&buf,count,datatype,dest,tag,comm,&request) Request Comm::Isend(&buf,count,datatype,dest,tag)
- MPI Irecv nhận thông điệp non-blocking, xác định một khu vực c a
bộ nhớ thực hiện nhiệm vụ như là một bộ đệm nhận thông tin
MPI_Irecv (&buf,count,datatype,source,tag,comm,&request) Request Comm::Irecv(&buf,count,datatype,source,tag)
- MPI Issend gửi thông điệp non-blocking đồng bộ (synchronous) MPI_Issend (&buf,count,datatype,dest,tag,comm,&request) Request Comm::Issend(&buf,count,datatype,dest,tag)
- MPI Ibsend gửi thông điệp non-blocking theo cơ chế buffer
Trang 11MPI_Ibsend (&buf,count,datatype,dest,tag,comm,&request) Request Comm::Ibsend(&buf,count,datatype,dest,tag)
- MPI Irsend gửi thông điệp non-blocking theo cơ chế ready
MPI_Irsend (&buf,count,datatype,dest,tag,comm,&request) Request Comm::Irsend(&buf,count,datatype,dest,tag)
- MPI Test kiểm tra trạng thái kết thúc c a các lệnh gửi và nhận thông điệp non-blocking Isend(), Irecv() Tham số request là tên biến yêu cầu đã được dùng trong các lệnh gửi và nhận thông điệp, tham số flag sẽ trả về giá trị 1 nếu thao tác hoàn thành và giá trị 0 trong trường hợp ngược lại
MPI_Barrier (comm)
Intracomm::Barrier()
- MPI Bcast gửi bản sao c a bộ đệm có kích thước count từ tác vụ root đến tất cả các tiến trình khác trong cùng một communicator MPI_Bcast (&buffer,count,datatype,root,comm)
Intracomm::Bcast(&buffer,count,datatype,root)
- MPI Scatter phân phát giá trị bộ đệm lên tất cả các tác vụ khác, bộ
Trang 12đệm được chia thành sendcnt phần
MPI_Scatter(&sendbuf,sendcnt,sendtype,&recvbuf,recvcnt,recvtype,root,comm)
Intracomm::Scatter(&sendbuf,sendcnt,sendtype,&recvbuf,recvcnt,recvtype,root)
- MPI Gather tạo mới một giá trị bộ đệm riêng cho mình từ các mảnh
dữ liệu gộp lại
MPI_Gather(&sendbuf,sendcnt,sendtype,&recvbuf,recvcnt,recvtype,root,comm)
Intracomm::Gather(&sendbuf,sendcnt,sendtype,&recvbuf,recvcnt,recvtype,root)
- MPI Allgather tương tự như MPI_GATHER nhưng sao chép bộ đệm mới cho tất cả các tác vụ
MPI_Allgather(&sendbuf,sendcnt,sendtype,&recvbuf,recvcount,recvtype,comm)
Intracomm::Allgather(&sendbuf,sendcnt,sendtype,&recvbuf,recvcnt,recvtype)
- MPI _ Reduce áp dụng các toán tử rút gọn (tham số op) cho tất cả các tác vụ và lưu kết quả vào một tác vụ duy nhất
tử OR logic), MPI_BOR (toán tử OR bitwise), MPI_LXOR (toán tử XOR logic), MPI_BXOR (toán tử XOR bitwise), MPI_MAXLOC
Trang 13(giá tri cực đại và vi trí), MPI_MINLOC (giá tri cực tiểu và vi trí)
- MPI Allreduce tương tự như MPI_Reduce nhưng lưu kết quả vào tất cả các tác vụ
Intracomm::Reduce_scatter(&sendbuf,&recvbuf,recvcount[], datatype,op)
- MPI Alltoall tương đương với việc áp dụng lệnh MPI_Scatter rồi tới lệnh MPI_Gather
MPI_Alltoall(&sendbuf,sendcount,sendtype,&recvbuf,recvcnt,recvtype,comm)
Intracomm::Alltoall(&sendbuf,sendcount,sendtype,&recvbuf,recvcnt,recvtype)
- MPI Scan kiểm tra việc thực hiện toán tử rút gọn c a các tác vụ MPI_Scan(&sendbuf,&recvbuf,count,datatype,op,comm) Intracomm::Scan(&sendbuf,&recvbuf,count, datatype,op)
1.7 K t lu n ch ng
Để giải những bài toán đặt ra một cách hiệu quả trên những máy tính mà chúng ta có, vấn đề chính là làm thế nào để xây dựng được những thuật toán song song Cách làm khá thông dụng là biến đổi các thuật toán tuần tự về song song, hay chuyển từ một dạng
Trang 14song song về dạng song song phù hợp hơn nhưng vẫn bảo toàn được
tính tương đương trong tính toán
Dựa vào bốn công đoạn và những nguyên lý thiết kế chính: nguyên lý lập lịch, nguyên lý hình ống, nguyên lý chia để trị, nguyên
lý đồ thị phụ thuộc dữ liệu, nguyên lý điều kiện tranh đua để xây dựng một số thuật toán song song
Để đánh giá được tính hiệu quả c a thuật toán song song thường phải dựa vào độ ph c tạp thời gian c a thuật toán Độ ph c
tạp thời gian c a thuật toán song song không chỉ phụ thuộc vào kích
cỡ c a dữ liệu đầu vào mà còn phụ thuộc vào kiến trúc máy tính song song và số lượng các bộ xử lý được phép sử dụng trong hệ thống
CH NG 2 CÁC THU T TOÁN TRểN Đ TH 2.1 Thu t toán Dijkstra tìm đ ng đi ngắn nh t
2.1.1. Mô tả thuật toán
+ Đầu vào: Đồ thị liên thông G(V,E,w), w(i,j) > 0 (i,j)
Trang 15nhớ ta có đường đi ngắn nhất (L(z) không thay đổi, nếu L(z) = thì không tồn tại đường đi
Ngược lại sang b c 4
B c 4: Với mỗi x T kề v gán L(x) := min {L(x), L(v) +
w(v,x)} Nếu L(x) thay đổi thì ghi nhớ đỉnh v cạnh đỉnh x bằng mảng truoc[] (với truoc[] c a đỉnh 1 = 0) để sau này xây dựng đường đi
ngắn nhất
Quay về b c 2
Độ ph c tạp c a thuật toán Dijkstra: Thuật toán dùng không quá n-1 bước lặp Trong mỗi bước lặp, dùng không hơn 2(n-1) phép cộng và phép so sánh để sửa đỗi nhãn c a các đỉnh Ngoài ra, một đỉnh thuộc Sk có nhãn nhỏ nhất nhờ không quá n – 1 phép so sánh
Do đó thuật toán có độ ph c tạp O(n2
Trang 16(3) Thêm cạnh:
Ký hiệu M là tập M ={ (i,j)E| iT&jT} Tìm cạnh (k,h)M sao cho :
ckh=min{cij|(i,j)M} Nếu ckh<∞, thêm cạnh (k,h) và đỉnh h vào T, sang bước (2) Ngược lại t c M=, kết thúc Kết luận đồ thị G không liên thông
2.2.2. Ví dụ minh họa
CH NG 3 NGHIÊN C U NG D NG THU T TOÁN SONG SONG TRểN TH VI N MPI
3.1 Thu t toán song song Prim tìm cây khung cực ti u: 3.1.1. Cách thực hiện thuật toán:
Đầu vào: Đồ thị G=(V,E) với trọng số Các đỉnh ký hiệu là
B c 2: Bộ xử lý P1 gửi một đỉnh ban đầu lên cho các BXL
P1,P2,…,Pm
B c 3: Trên mỗi BXL (P1,P2,…,Pm) thực hiện các bước sau đây:
Trang 17Khởi tạo T= (1 đỉnh mà P1 đã phát ra ở bước 2, không cạnh)
B c 4: Kiểm tra điều kiện kết thúc:Nếu T có n-1 cạnh thì
kết thúc, ngược lại sang bước 5
B c 5: Thêm cạnh: Trên mỗi BXL Ký hiệu Mk là tập trên BXL k
Mk={(i,j) Ek iT&jT(k=1,…,m)}
Trên mỗi BXL tìm cạnh (xk,yk) Mk(k=1,…,m)
sao cho c( xkyk) =min{cij|(i,j) Mk(k=1,…,m)} Nếu tất cả các Mk trên tất cả m BXL là rổng thì kết thúc, kết luận đồ thị không liên thông, ngược lại sang bước 6
B c 6: BXL P1 thực hiện tìm c( xy )nhỏ nhất trên tất cả m BXL
BXL P1 thêm cạnh (x,y) và đỉnh y vào T
BXL P1 chuyển số cạnh c a T và đỉnh y lên tất cả các BXL để lặp lại b c 4
3.1.2. Ví dụ thực hiện thuật toán song song Prim
3.2 Thu t toán song song Dijkstra tìm đ ng đi ngắn
nh t t m t đ nh đ n t t cả các đ nh
3.2.1. Cách thực hiện thuật toán
Đầu vào: Đồ thị liên thông G(V,E,w), w(i,j) ≥ 0 (i,j)E, đỉnh nguồn a, 1 bộ xử lý chính và m-1 bộ xử lý phụ
Đầu ra: Chiều dài đường đi ngắn nhất là đường đi ngắn nhất
từ đỉnh a đến tất cả các đỉnh trên đồ thị
ụ t ng: Chia đồ thị ban đầu cho m bộ xử lý (P0, P1,…,P
m-1), cùng tính toán đồng thời, mỗi bộ BXL đảm nhận n/m đỉnh c a đồ thị (n là số đỉnh c a đồ thị, m là số BXL ) và ma trận trọng số n/m