KỸ THUẬT ĐƯỜNG ỐNG VÀ CÂN BẰNG TẢI TRONG LẬP TRÌNH SONG SONG MPI Chương I Tổng quan về xử lý song song ........................................................ 2 1.1 Tính toán song song ....................................................................................... 2 1.1.1 Giới thiệu về tính toán song song ................................................................ 2 1.1.2 Xu thế của tính toán song song trong công nghệ mới .................................. 2 1.2 Phân loại máy tính song song ......................................................................... 4 1.2.1 Phân loại dựa trên sự tương tác giữa các BXL............................................. 4 1.2.1.1 Chia sẻ bộ nhớ chung ............................................................................... 4 1.2.1.2 Bộ nhớ phân tán ....................................................................................... 6 1.2.1.3 Máy tính với bộ nhớ lai ............................................................................ 7 1.2.2 Phân loại dựa trên cơ chế điều khiển chung................................................. 7 1.2.2.1 Hệ thống đơn lệnh đa dữ liệu(SIMD) ....................................................... 7 1.2.2.2 Hệ thống đa lệnh đa dữ liệu(MIMD) ........................................................ 8 1.3 Mô hình trừu tượng của máy tính song song .................................................. 8 1.3.1 Mô hình chia sẻ bộ nhớ dùng chung ............................................................ 9 1.3.2 Mô hình luồng ............................................................................................ 9 1.3.3 Mô hình truyền thông điệp ........................................................................ 10 1.3.4 Mô hình song song dữ liệu ........................................................................ 10 1.3.5 Mô hình lai ............................................................................................... 11 1.4 Thiết kế giải thuật song song........................................................................ 11 1.4.1 Nguyên lý thiết kế song song .................................................................... 11 1.4.2 Đánh giá chương trình song song .............................................................. 13 1.4.3 Chiến lược phân chia và chia để trị ........................................................... 18 1.4.3.1 Sự phân chia .......................................................................................... 18 1.4.3.2 Chia để trị .............................................................................................. 21 1.4.3.3 Bài toán tích phân .................................................................................. 25 1.4.4 Tính toán đường ống ................................................................................. 28 1.4.4.2 Sắp xếp số .............................................................................................. 32 1.4.4.3 Thuật toán sắp xếp so sánh và đổi chỗ .................................................... 33 1.4.4.4 Giải bài toán hệ phương trình tuyến tính dạng đặc biệt ........................... 35 Chương II Kỹ thuật truyền thông điệp trong tính toán song song với MPI ..... 37 2.1 Cơ bản về truyền thông điệp ........................................................................ 37 2.1.1 Mô hình truyền thông điệp ........................................................................ 37 2.1.2 Kênh truyền thông .................................................................................... 37 2.1.3 Truyền thông đồng bộ ............................................................................... 38 2.1.4 Truyền thông dị bộ .................................................................................... 39 2.1.5 Mô hình lập trình ...................................................................................... 39 2.1.5.1 Phát sinh tiến trình ................................................................................. 39 2.1.5.2 Hàm send và receive .............................................................................. 41 2.1.5.3 Truyền thông nhóm ................................................................................ 42 2.2 MPI ............................................................................................................. 45 2.2.1 Tạo tiến trình và thực thi ........................................................................... 46 2.2.2 Sử dụng mô hình tính toán SPMD ............................................................. 46 2.2.3 Các hàm MPI cơ bản ................................................................................. 47 2.3 Sử dụng MPI trên Linux và Windows .......................................................... 50 2.3.1 Linux ........................................................................................................ 50 2.3.2 Windows ................................................................................................... 54 Chương III Kỹ thuật đường ống và cân bằng tải trong lập trình song song .... 59 3.1 Cân bằng tải tập trung trong bài toán tìm đường đi n gắn nhất với giải thuật Moore ................................................................................................................ 59 3.2 Giải hệ phương trình tuyến tính bằng phương pháp khử Gaus sử dụng tính toán đường ống .................................................................................................. 67 PHỤ LỤC ............................................................................................................. 71 Cài đặt song song các thuật toán trong luận văn ................................................. 71
Trang 1Lời cảm ơn
Điều đầu tiên cho tôi gửi lời cảm ơn sâu sắc đến TS Nguyễn Mậu Hân
người đã hướng dẫn chỉ bảo tôi trong suốt quá trình thực hiện đề tài Thầy đã cho
tôi những lời khuyên bổ ích, dạy cách viết báo cáo - một kỹ năng không thể thiếu
đối với một nhà nghiên cứu Khóa luận sẽ không hoàn thiện nếu thiếu sự hướng dẫn
của thầy từ việc nghiên cứu lý thuyết đến thực nghiệm và hoàn thành khóa luận
Tôi xin cảm ơn các thầy trong Khoa Công Nghệ Thông Tin đã giúp đỡ tôi
trang thiết bị máy móc trong quá trình thực nghiệm Tôi cũng xin cảm ơn đến tập
thể lớp TinK26A và cô giáo chủ nhiệm Hoàng Thị Lan Giao đã có những đóng góp
quý báu cho khóa luận cũng như trong quá trình học tập
Và cuối cùng tôi xin cảm ơn đến gia đình, bạn bè những người luôn quan
tâm cổ vũ động viên tôi trong suốt thời gian học tập và làm khóa luận
Huế, tháng 5 năm 2006
Nguyễn Hữu Hoàng Thọ
Trang 2MỤC LỤC
Chương I Tổng quan về xử lý song song 2
1.1 Tính toán song song 2
1.1.1 Giới thiệu về tính toán song song 2
1.1.2 Xu thế của tính toán song song trong công nghệ mới 2
1.2 Phân loại máy tính song song 4
1.2.1 Phân loại dựa trên sự tương tác giữa các BXL 4
1.2.1.1 Chia sẻ bộ nhớ chung 4
1.2.1.2 Bộ nhớ phân tán 6
1.2.1.3 Máy tính với bộ nhớ lai 7
1.2.2 Phân loại dựa trên cơ chế điều khiển chung 7
1.2.2.1 Hệ thống đơn lệnh đa dữ liệu(SIMD) 7
1.2.2.2 Hệ thống đa lệnh đa dữ liệu(MIMD) 8
1.3 Mô hình trừu tượng của máy tính song song 8
1.3.1 Mô hình chia sẻ bộ nhớ dùng chung 9
1.3.2 Mô hình luồng 9
1.3.3 Mô hình truyền thông điệp 10
1.3.4 Mô hình song song dữ liệu 10
1.3.5 Mô hình lai 11
1.4 Thiết kế giải thuật song song 11
1.4.1 Nguyên lý thiết kế song song 11
1.4.2 Đánh giá chương trình song song 13
1.4.3 Chiến lược phân chia và chia để trị 18
1.4.3.1 Sự phân chia 18
1.4.3.2 Chia để trị 21
1.4.3.3 Bài toán tích phân 25
1.4.4 Tính toán đường ống 28
1.4.4.2 Sắp xếp số 32
1.4.4.3 Thuật toán sắp xếp so sánh và đổi chỗ 33
1.4.4.4 Giải bài toán hệ phương trình tuyến tính dạng đặc biệt 35
Chương II Kỹ thuật truyền thông điệp trong tính toán song song với MPI 37
2.1 Cơ bản về truyền thông điệp 37
2.1.1 Mô hình truyền thông điệp 37
2.1.2 Kênh truyền thông 37
2.1.3 Truyền thông đồng bộ 38
2.1.4 Truyền thông dị bộ 39
2.1.5 Mô hình lập trình 39
2.1.5.1 Phát sinh tiến trình 39
2.1.5.2 Hàm send và receive 41
2.1.5.3 Truyền thông nhóm 42
2.2 MPI 45
2.2.1 Tạo tiến trình và thực thi 46
2.2.2 Sử dụng mô hình tính toán SPMD 46
2.2.3 Các hàm MPI cơ bản 47
Trang 32.3.1 Linux 50
2.3.2 Windows 54
Chương III Kỹ thuật đường ống và cân bằng tải trong lập trình song song 59
3.1 Cân bằng tải tập trung trong bài toán tìm đường đi ngắn nhất với giải thuật Moore 59
3.2 Giải hệ phương trình tuyến tính bằng phương pháp khử Gaus sử dụng tính toán đường ống 67
PHỤ LỤC 71
Cài đặt song song các thuật toán trong luận văn 71
KẾT LUẬN 80
Tài liệu tham khảo 81
Bảng các chữ viết tắt
Chữ viết tắt Tiếng Việt Tiếng Anh
dữ liệu
Multiple instruction multiple data
truyền thông điệp
Message Passing Interface
dữ liệu
Single instruction multiple data
xứng
Symmetric MultiProcessor
đều
Uniform Memory Access
Trang 4MỞ ĐẦU
Ngày nay các phương pháp tính toán song song ra đời với sự thực thi đồng thời
của nhiều tài nguyên máy tính giúp giải quyết các bài toán yêu cầu thời gian xử lý
nhanh đồng thời xử lý khối lượng dữ liệu lớn như bài toán dự báo thời tiết, bài toán
mô phỏng các hiện tượng vật lý Hiện nay đã có nhiều chuẩn hỗ trợ cho việc lập
trình song song như MPI (Message Passing Interface) hỗ trợ lập trình song song
trên mô hình bộ nhớ phân tán, OpenMP (Open MultiProcessing) hỗ trợ lập trình
song song trên mô hình chia sẻ bộ nhớ chung, Pthread hỗ trợ lập trình luồng
Xử lý song song xuất hiện từ lâu và đã giải quyết nhiều bài toán trong thực tế
Nhiều hệ điều hành, ngôn ngữ lập trình hỗ trợ lập trình song song như WindowsNT,
Linux
Mục đích của luận văn là nghiên cứu chuẩn MPI và ứng dụng MPI vào lập
trình song song, tiến hành cài đặt một số thuật toán theo hai kỹ thuật lập trình song
song được sử dụng nhiều trong thực tế đó là kỹ thuật phân chia và kỹ thuật đường
ống
Nội dung của luận văn được phân thành 3 chương:
Chương 1: Giới thiệu tổng quan về xử lý song song
Chương 2: Giới thiệu về lập trình truyền thông điệp MPI trên môi trường
Linux và Windows
Chương 3: Áp dụng kỹ thuật cân bằng tải và đường ống để giải quyết bài toán
tìm đường đi ngắn nhất và bài toán giải hệ phương trình bằng phương pháp khử
Gaus Các bài toán này đã được cài đặt thử nghiệm trên hệ thống giả lập của hệ điều
hành Linux và Window
Trang 5Chương I Tổng quan về xử lý song song
1.1 Tính toán song song
1.1.1 Giới thiệu về tính toán song song
Ngày nay các chương trình chúng ta đang sử dụng thông thường là các chương
trình được viết theo các giải thuật tuần tự, nghĩa là một bài toán được giải quyết
thông qua một chuỗi các câu lệnh tuần tự, thường thì bài toán này sẽ được thực hiện
trên một máy tính đơn với một BXL
Tính toán song song là một bước tiếp theo và là tất yếu của sự phát triển của
khoa học máy tính Tính toán song song, đó là sự giải quyết bài toán dựa trên sự
thực thi một cách đồng thời của nhiều tài nguyên máy tính Tài nguyên máy tính
bao gồm:
- Một máy tính với nhiều BXL
- Nhiều máy tính đơn BXL kết nối với nhau
- Kết hợp cả hai loại trên
Tính toán song song được sử dụng để giải quyết các vấn đề 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 lượng dữ liệu lớn như: các bài toán
dự báo thời tiết,các vấn đề khoa học như khai phá dữ liệu, trí tuệ nhân tạo, xử lý ảnh
ba chiều (3-D), mô phỏng các hệ thống lớn Hầu hết các bài toán này, những máy
tính xử lý tuần tự đều không đáp ứng được yêu cầu về thời gian và khối lượng công
việc
Mặc dù tốc độ tính toán của các BXL tăng nhiều qua từng năm, nhưng do giới
hạn vật lý nên khả năng tính toán của chúng không thể tăng mãi Nếu muốn tăng
khả năng tính toán thì chúng ta phải khai thác được khả năng xử lý song song
Xử lý 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 bài toán
1.1.2 Xu thế của tính toán song song trong công nghệ mới
Tiểu trình (thread)
Trang 6Tiểu trình là một luồng dữ liệu đi vào bộ xử lý Mỗi ứng dụng đều tạo ra một
hay nhiều tiểu trình khác nhau của chúng tùy thuộc công việc chúng cần giải quyết
Với kiến trúc đa nhiệm ngày nay, mỗi CPU tại mỗi thời điểm chỉ có thể xử lý một
tiểu trình, trong máy tính đơn VXL, sự đa nhiệm đồng thời là ảo, nghĩa là các hệ
điều hành tạo ra ảo tưởng có nhiều bộ xử lý ảo, mỗi bộ xử lý xử lý một nhiệm vụ,
thật ra CPU chỉ có thể xử lý một thread(tiểu trình) tại mỗi thời điểm, nhưng nó
chuyển đổi trong việc thực thi các thread một cách liên tục, với thời gian rất nhanh
nên tạo ra ảo giác nhiều chương trình có thể chạy đồng thời Thường thì chính hệ
điều hành đa nhiệm tạo ra các ảo giác này, bằng cách phân chia thời gian hợp lý cho
các thread
Trong những năm gần đây, với sự phát triển của phần cứng, các chíp lõi kép đã xuất
hiện ngày càng nhiều và càng trở nên thông dụng Mở đầu là công nghệ siêu luồng
Hyper-threading(HT) của Intel với các dòng chíp của họ, đây là một khái niệm khác
với multithread, sự khác biệt ở đây là siêu luồng được tích hợp ngay trên một lõi
đơn của CPU chứ không phải do hệ điều hành tạo ra, CPU sẽ “đánh lừa” hệ điều
hành nhận ra nhiều BXL Công dụng thực tế của nó tăng tốc độ chuyển đổi giữa các
thread của hệ thống và nâng cao khả năng xử lý đa nhiệm Thời điểm này CPU vẫn
đơn lõi Khi Pentium D 800 đầu tiên gắn hai CPU Prescott trên cùng đế và lúc này
hiện thực hóa CPU ảo HT thành CPU vật lý thực sự Lúc này CPU ảo đã trở thành
CPU thật
Và thật sự, sự ra đời của chip lõi kép đã làm tăng hiệu năng đáng kể cho tốc độ máy
tính
Vai trò của xử lý song song trong nền tảng công nghệ đa lõi
Mặc dù lý thuyết về sức mạnh của các BXL lõi kép là rất thuyết phục nhưng
thực tế vẫn còn tồn tại một số khó khăn khá lớn Câu hỏi lớn đặt ra là liệu người
dùng có tận dụng được sức mạnh đa xử lý, đó là phần mềm được sử dụng trên máy
tính phải hỗ trợ xử lý song song nhiều thread cùng lúc Nếu không có điều này một
phần mềm bình thường sẽ chỉ gởi luồng dữ liệu của nó vào một lõi duy nhất và hầu
như không cải thiện được tốc độ Tuy các hệ điều hành hiện nay đều hỗ trợ đa xử lý,
nhưng khả năng xử lý song song phải được đưa vào từng ứng dụng đơn lẻ thì tốc độ
Trang 7mới thực sự được cải thiện Hầu hết các ứng dụng trên thị trường ngày nay chưa
được viết theo cách này Ví dụ trong các game, có các sự kiện và các dạng trí tuệ
nhân tạo, với một BXL lõi đơn, cả hai yếu tố này đều được xử lý song song nhưng
theo cách chuyển đổi liên tục thread Nếu như chạy hệ thống đa lõi, hay lõi kép thì
mỗi lõi sẽ đảm nhận một loại nhiệm vụ, khi đó tốc độ sẽ tăng lên thấy rõ
1.2 Phân loại máy tính song song
Một trong những khía cạnh quan trọng của máy tính song song là cơ chế trao
đổi thông tin giữa các BXL Có 3 kiến trúc phổ biến:
Kiến trúc chia sẻ bộ nhớ dùng chung
cả các BXL đều có thể truy cập đến Một BXL này có thể trao đổi thông
tin với một BXL khác bằng cách ghi vào bộ nhớ toàn cục và BXL thứ hai sẽ đọc dữ
liệu tại cùng vị trí đó trong bộ nhớ Điều này cho phép trao đổi thông tin giữa các
BXL, tuy nhiên, nó đã dẫn đến một vấn đề là đồng thời có nhiều BXL cùng truy cập
tới cùng một vị trí trong bộ nhớ toàn cục Máy tính loại này có hai loại chính dựa
trên thời gian truy cập bộ nhớ
MEMORY
BXL
BXL
BXL
BXL
Trang 8Thứ nhất là máy tính truy cập đồng bộ (UMA) Là loại máy tính với các BXL giống
nhau Tất cả các BXL đều có thể truy cập bộ nhớ đồng thời và thông qua một BUS
dùng chung
Hình 1.2 Máy tính Uniform Access Memory (UMA)
Máy tính loại này gọi là Cache coheren-UMA (CC-UMA) Cache coheren ở đây có
nghĩa là khi một BXL cập nhật một vị trí trong bộ nhớ thì tất cả các BXL khác đều
nhận biết được sự cập nhật đấy
Thứ hai là máy tính truy cập không đồng bộ (NUMA) Với máy tính loại này có
một đường vật lý nối hai hay nhiều SMP lại với nhau
Hình 1.3 Máy tính Non-Uniform Access Memory (NUMA)
Mỗi một SMP lại có thể truy cập tới bộ nhớ của SMP khác, tuy nhiên với kiến trúc
kiểu này thì tất cả các BXL không thể truy cập cùng một lúc tới các bộ nhớ và với
việc kết nối các SMP bằng đường vật lý nên thời gian truy cập bộ nhớ chậm đi
MEMORY
BXL
BXL
Đường kết nối các SMP
Trang 9Máy tính chia sẻ bộ nhớ chung có thuận lợi là giúp cho người lập trình thuận tiện
khi viết các chương trình song song Dữ liệu chia sẻ giữa các nhiệm vụ đảm bảo cả
hai tiêu chuẩn nhanh và đồng thời Tuy nhiên máy tính loại này có một số khó khăn
là rất khó mở rộng số lượng các BXL vì việc thêm các BXL, về phương diện hình
học có thể làm tăng các đường kết nối giữa bộ nhớ toàn cục và các BXL Đối với hệ
thống Cache coheren thì làm tăng sự truyền thông giữa cache và thiết bị quản lý bộ
nhớ Với máy tính loại này người lập trình phải chịu trách nhiệm đồng bộ chương
trình để đảm bảo tính đúng đắn của dữ liệu dùng chung
1.2.1.2 Bộ nhớ phân tán
Ngược với máy tính chia sẻ bộ nhớ chung là máy tính với bộ nhớ phân tán
trong đó không tồn tại bộ nhớ chia sẻ chung mà mỗi BXL có bộ nhớ cục bộ riêng
của chúng Trong máy tính song song có bộ nhớ phân tán, các BXL liên lạc với
nhau bằng các thông điệp (message) qua một mạng liên kết (interconnection
network) gồm các liên kết truyền thông trực tiếp giữa một số cặp BXL Một trong
những lựa chọn quan trọng trong thiết kế lúc đó sẽ là các cặp BXL nào được nối với
nhau Tốc độ liên lạc là tối ưu khi các BXL được nối trực tiếp với nhau Tuy nhiên
điều này thường là không khả thi do số lượng các liên kết là quá lớn dẫn đến việc
tăng giá thành của hệ thống Cách thứ hai được sử dụng là các BXL liên lạc thông
qua một BUS chia sẻ Điều này dẫn đến việc độ trễ cao khi số lượng BXL lớn dẫn
Memory
BXL
Trang 101.2.1.3 Máy tính với bộ nhớ lai
Hầu hết các máy tính nhanh và lớn ngày nay đều xây dựng dựa trên
sự kết hợp giữa kiến trúc chia sẻ bộ nhớ chung và bộ nhớ phân tán Sự kết hợp đó
tạo nên một máy tính với tên gọi máy tính có bộ nhớ lai
Hình 1.5 Máy tính bộ nhớ lai
Các thành phần chia sẻ bộ nhớ chung trong máy tính bộ nhớ lai thường là các máy
CC-SMP Các BXL trong thành phần chia sẻ bộ nhớ chung có thể truy cập bộ nhớ
toàn cục riêng của thành phần đó Thành phần bộ nhớ phân tán được biết như là một
mạng các SMP Các SMP chỉ có thể truy cập đến bộ nhớ toàn cục trong thành phần
chia sẻ bộ nhớ phân tán của chúng, chứ không truy cập được bộ nhớ của các thành
phần chia sẻ bộ nhớ chung khác Cái mạng kết nối được xây dựng để chuyển dữ
liệu từ SMP này đến SMP khác
1.2.2 Phân loại dựa trên cơ chế điều khiển chung
Phần lớn các máy tính song song thường có một cơ chế điều khiển chung
Song vấn đề đặt ra ở đây là các hoạt động của máy tính được điều khiển ở mức độ
nào Xem việc điều khiển theo hai khía cạnh khác nhau
Khía cạnh thứ nhất: Cơ chế điều khiển chung chỉ được sử dụng để nạp
chương trình và dữ liệu vào các BXL còn sau đó các BXL hoạt động độc lập
Khía cạnh thứ hai: Cơ chế điều khiển được sử dụng để hướng dẫn các BXL
các công việc phải làm tại mỗi bước Giữa hai khía cạnh này là những cơ chế điều
khiển trung gian Hai loại cơ chế điều khiển phổ biến nhất là:
1.2.2.1 Hệ thống đơn lệnh đa dữ liệu(SIMD)
Trang 11một đơn vị điều khiển (CU) Tất cả các đơn vị xử lý nhận được cùng một lệnh từ
CU nhưng hoạt động trên những tập dữ liệu khác nhau Mô hình máy tính SIMD
được chỉ ra như hình 1.6 có những đặc tính sau:
Phân tán việc xử lý trên nhiều phần cứng
Thao tác đồng thời trên nhiều phần tử dữ liệu
Thực hiện cùng một tính toán trên tất cả các phần tử dữ liệu
Hình 1.6 Hệ thống đơn lệnh đa dữ liệu(SIMD)
1.2.2.2 Hệ thống đa lệnh đa dữ liệu(MIMD)
Máy tính kiểu MIMD là loại đa BXL hoặc còn gọi là hệ thống đa máy tính,
trong đó mỗi BXL có đơn vị điều khiển (CU) riêng và thực hiện chương trình riêng
của mình MIMD có những đặc trưng sau:
Xử lý phân tán trên một số BXL độc lập
Chia sẻ với nhau một số tài nguyên, trong đó có hệ thống bộ nhớ
Mỗi BXL thao tác độc lập và có thể thực hiện đồng thời với nhau
Mỗi BXL chạy một chương trình riêng
Hình 1.7 Hệ thống đa lệnh đa dữ liệu(MIMD)
1.3 Mô hình trừu tượng của máy tính song song
Việc đưa ra một mô hình máy tính chung cho việc lập trình giúp cho việc thiết
kế giải thuật trở nên đơn giản hơn Lập trình song song đưa thêm những khó khăn
Câu lệnh
Trang 12mới vào mô hình lập trình tuần tự Nếu chương trình được thực hiện ở mức thấp
nhất thì không những số lệnh thực hiện là rất lớn mà nó còn phải quản lý trực tiếp
quá trình thực hiện song song của hàng nghìn BXL và kết hợp hàng triệu tương tác
liên BXL Bởi vậy khả năng trừu tượng và tính toán module là các đặc tính rất quan
trọng trong lập trình song song
Các mô hình thông dụng bao gồm:
Mô hình chia sẻ bộ nhớ chung
Mô hình luồng
Mô hình truyền thông điệp
Mô hình song song dữ liệu
Mô hình lai
1.3.1 Mô hình chia sẻ bộ nhớ dùng chung
Trong mô hình chia sẻ bộ nhớ chung các nhiệm vụ cùng chia sẻ một không
gian địa chỉ chung có thể được truy cập đọc ghi theo phương thức không đồng bộ
Các cơ chế khác nhau như khóa (locks) và semaphore được điều khiển để truy cập
đến bộ nhớ toàn cục Xét theo quan điểm của lập trình viên thì ưu điểm của mô hình
này là không có khái niệm sở hữu dữ liệu Nghĩa là không phải chỉ định rõ ràng quá
trình truyền dữ liệu giữa nhiệm vụ gửi và nhiệm vụ nhận dữ liệu Tính chất này giúp
cho phát triển các chương trình đơn giản hơn Tuy nhiên khi đó việc hiểu và đảm
bảo tính cục bộ trở nên khó khăn và cũng được chú ý nhiều nhất trong kiến trúc chia
sẻ bộ nhớ chung Việc viết các chương trình xác định cũng trở nên khó khăn
1.3.2 Mô hình luồng
Trong mô hình luồng chương trình chính được chia thành các nhiệm vụ Mỗi
nhiệm vụ được thực hiện bởi các luồng một cách đồng thời Mỗi một luồng có dữ
liệu riêng của nó và chia sẻ dữ liệu toàn cục của chương trình chính Các nhiệm vụ
đưa cho mỗi luồng là các thủ tục con của chương trình chính Bất kì luồng nào cũng
có thể thực hiện bất kì thủ tục con nào tại cùng thời điểm với các luồng khác Trong
mô hình luồng các luồng kết nối với nhau thông qua bộ nhớ toàn cục Với việc kết
nối này thì chương trình phải được xây dựng một cách đồng bộ để tránh cùng một
lúc có nhiều luồng cùng cập nhập một vị trí trong bộ nhớ toàn cục
Trang 13
Hình 1.8 Mô hình luồng
1.3.3 Mô hình truyền thông điệp
Trong mô hình truyền thông điệp chương trình song song được chia thành
các nhiệm vụ Mỗi nhiệm vụ sử dụng bộ nhớ cục bộ của nó Các nhiệm vụ này có
thể được cư trú trên các máy vật lý giống nhau kết nối với nhau qua mạng với số
lượng tùy ý
Hình 1.9 Mô hình truyền thông điệp
Các nhiệm vụ trao đổi dữ liệu với nhau qua hai phương thức gửi và nhận thông
điệp Xét trên khía cạnh lập trình thì các thông điệp chứa trong một thư viện thông
điệp Thư viện này phải được gắn vào mã nguồn của chương trình song song MPI
là một thư viện ngày nay được dùng rất phổ biến
1.3.4 Mô hình song song dữ liệu
Mô hình lập trình song song dữ liệu giúp lập trình các chương trình song
song được thực hiện trên một tập dữ liệu lớn Tập dữ liệu ở đây thường được sắp
xếp theo một cấu trúc nhất định như là mảng hoặc theo khối
Trang 14
Hình 1.10 Mô hình lập trình song song dữ liệu
Với mô hình này thì các nhiệm vụ của chương trình làm việc với cùng một cấu trúc
dữ liệu Tuy nhiên mỗi nhiệm vụ sẽ làm việc trên từng phân vùng khác nhau của dữ
liệu và các nhiệm vụ phải thực hiện các thao tác giống nhau
Trong kiến trúc chia sẻ bộ nhớ chung thì tất cả các nhiệm vụ truy cập vào cấu trục
dữ liệu thông qua bộ nhớ toàn cục Còn đối với kiến trúc bộ nhớ phân tán thì dữ liệu
được chia ra và lưu trữ trên các bộ nhớ cục bộ của các BXL
1.3.5 Mô hình lai
Mô hình lai là sự kết hợp của hai hay nhiều mô hình lập trình song song kết
hợp lại với nhau
Hiện nay, mô hình lai phổ biến nhất là mô hình kết hợp giữa mô hình truyền thông
điệp với mô hình luồng hoặc với mô hình chia sẻ bộ nhớ chung Một mô hình lai
khác nữa là sự kết hợp giữa mô hình song song dữ liệu với mô hình truyền thông
điệp Mô hình dạng này rất thuận tiện vì mô hình song song dữ liệu trên kiến trúc
bộ nhớ phân tán sử dụng thông điệp để trao đổi dữ liệu giữa các nhiệm vụ một cách
trong suốt đối với lập trình viên song song
1.4 Thiết kế giải thuật song song
1.4.1 Nguyên lý thiết kế song song
Nói đến xử lý song song là phải xét cả kiến trúc máy tính lẫn các thuật toán
Trang 15Những thuật toán, trong đó có một số thao tác có thể thực hiện đồng thời được
gọi là thuật toán song song Tổng quát hơn, thuật toán song song là một tập các tiến
trình hoặc các tác vụ có thể thực hiện đồng thời và có thể trao đổi dữ liệu với nhau
để kết hợp cùng giải một bài toán đặt ra
Có năm nguyên lý chính trong thiết kế thuật toán song song:
1 Các nguyên lý lập lịch: Giảm tối thiểu các bộ xử lý sử dụng trong thuật toán
sao cho thời gian tính toán là không tăng (xét theo khía cạnh độ phức tạp)
Nói chung, nếu độ phức tạp tính toán của thuật toán là O(f(n)) thì thời gian
thực hiện của chương trình khi số bộ xử lý giảm, có thể tăng và thời gian
tính toán tổng thể tăng lên một hằng số nào đó Nghĩa là xét theo khía cạnh
độ phức tạp tính toán vẫn không thay đổi, vẫn là O(f(n))
2 Nguyên lý hình ống: Nguyên lý này được áp dụng khi bài toán xuất hiện
một dãy các thao tác {T1, T2, , Tn}, trong đó Ti+1 thực hiện sau khi Ti kết
thúc
3 Nguyên lý chia để trị: Chia bài toán thành những phần nhỏ hơn tương đối
độc lập với nhau và giải quyết chúng một cách song song
4 Nguyên lý đồ thị phụ thuộc dữ liệu: Phân tích mối quan hệ dữ liệu trong tính
toán để xây dựng đồ thị phụ thuộc dữ liệu và dựa vào đó để xây dựng thuật
toán song song
5 Nguyên lý điều kiện tranh đua: Nếu hai tiến trình cùng muốn truy cập vào
cùng một mục dữ liệu chia sẻ thì chúng phải tương tranh với nhau, nghĩa là
chúng có thể cản trở lẫn nhau
Ngoài những nguyên lý nêu trên, khi thiết kế thuật toán song song còn một số điểm
cần quan tâm:
Tương tự như kiến trúc, hiệu quả thực hiện của thuật toán song song có thể
rất khác nhau, mà yếu tố quan trọng nhất ảnh hưởng tới độ phức tạp tính
toán là cấu hình tô pô liên kết mạng Ví dụ: DAP là máy tính kiểu SIMD với
64 * 64 bộ xử lý, thời gian nhân ma trận là tuyến tính theo kích cỡ của ma
trận và phụ thuộc vào đường truyền dữ liệu giữa các hàng với cột
Trang 16 Thuật toán song song phải được thiết kế dựa trên những kiến thức về kiến
trúc máy tính, ngôn ngữ lập trình song song và các phương pháp tính toán
1.4.2 Đánh giá chương trình song song
Sự đánh giá thời gian thực thi song song
Chúng ta có thể bắt đầu bằng sự đánh giá thời gian thực thi của một chương
trình đơn, ts là thời gian của việc đếm từng bước tính toán của giải thuật tuần tự một
cách tốt nhất Với một thuật toán song song ,bên cạnh việc xác định số các bước
tính toán, chúng ta cần đánh giá sự truyền thông
Trong hệ thống truyền thông điệp, thời gian để gởi thông điệp phải được xem
xét trong thời gian thực thi của bài toán Thời gian thực thi song song, tp bao gồm
hai phần, một phần tính toán và một phần truyền thông Như vậy chúng ta có:
tp=tcomp+tcommThời gian tính toán có thể đánh giá như thời gian tuần tự, bằng cách đếm số lượng
các bước tính toán Khi có nhiều hơn một tiến trình được thực thi đồng thời, chúng
ta cần đếm từng số bước tính toán của tiến trình phức tạp nhất Thông thường, tất cả
các tiến trình thực thi cùng một thao tác tính toán, vì vậy chúng ta cần đếm một
cách đơn giản số lượng các bước tính toán của một tiến trình Trong trường hợp
khác chúng ta sẽ tìm số lượng các bước tính toán lớn nhất của những tiến trình thực
hiện cùng một thời gian
Để thuận lợi chúng ta cần bỏ qua thời gian tính toán trong thành phần phân chia thời
gian truyền thông báo Khi đó thời gian cho tính toán là:
tcomp=tcomp1+tcomp2+tcomp3…
Sự phân tích thời gian tính toán thường được giả định rằng tất cả các bộ vi xử lý là
cùng thao tác và cùng tốc độ
Một đặc tính mạnh của cụm là máy tính không cần như nhau Việc tính đến
một hệ thống không đồng nhất thì khó trong phân tích toán học, vì vậy trong phân
tích, chúng ta sẽ giả định các máy tính là giống hệt nhau Những kiểu máy tính khác
nhau sẽ được tính bởi những phương pháp thi hành cân bằng tải
Thời gian truyền thông
Thời gian truyền thông phụ thuộc vào:
Trang 17-Số lượng các thông điệp
-Kích thước của mỗi thông điệp
-Kiến trúc liên quan bên dưới và kiểu di chuyển (mode of transfer)
Thời gian truyền thông của mỗi thông điệp là phụ thuộc vào nhiều yếu tố, bao
gồm kiến trúc mạng và sự tranh chấp mạng Một sự xấp xỉ đầu tiên:
tcomm1=tstartup+wtdata
Thuật ngữ tstartup là thời gian khởi động, thời gian tối thiểu cần để truyền một
thông báo mà không có dữ liệu Nó bao gồm thời gian gói thông điệp ở nguồn và
mở thông điệp ở đích Nó còn được sử dụng để mô tả thời gian trì hoãn hoàn tất
tstartup còn được giả định là một hằng số
Thuật ngữ tdata là thời gian để gởi một từ (word) dữ liệu, cũng được giả định là
một hằng số và có w (word) từ dữ liệu Tốc độ truyền thường được đo lường bởi
đơn vị bit/second
Chúng ta không có một quan hệ tuyến tính hoàn hảo trong hệ thống thực
Nhiều nhân tố có thể ảnh hưởng đến thời gian truyền thông, bao gồm (contention)
sự tương tranh (medium) trong trung gian truyền thông Phương trình lờ đi tình
huống nguồn và đích không liên kết trực tiếp trong hệ thống thực để mà thông điệp
phải được truyền xuyên qua những node (nút) trung gian
Thời gian truyền thông cuối cùng, tcomm sẽ là tổng của thời gian truyền thông của
tất cả các thông điệp tuần tự từ một tiến trình Như vậy
tcomm=tcomm1+tcomm2………
Nhân tố đánh giá chuẩn:
Tốc độ (Speed up) =ts/tp=ts/(tcomp+tcomm)
Tỉ lệ tính toán/truyền thông=tcomp/tcomm
Những ghi chú trong sự giải thích phương trình
Thời gian thực thi song song tp, tất nhiên sẽ phụ thuộc vào hệ thống máy tính
Để dễ dàng phân tích, giả định rằng hệ thống là đồng nhất Mỗi tiến trình phải giống
nhau và thao tác cùng tốc độ Hơn nữa, tất cả các thao tác tính toán được quy định
Trang 18cùng thời gian, lấy ví dụ phép chia quy định cùng thời gian như phép cộng Tuy
điều này không đúng trong thực tế, nhưng đó là sự giả định chung trong phân tích
Chúng ta sẽ không phân biệt giữa việc gửi một số nguyên và một số thực hoặc là
những dạng khác Tất cả được giả định là cùng thời gian (điều này không đúng
trong thực tế, một kí tự 8 bit thì đòi hỏi ít thời gian hơn một kí tự 64 bit ) Tuy nhiên
trong nhiều vấn đề, kiểu dữ liệu của dữ liệu được gởi thường là cùng như nhau ở
khắp nơi Thật sự thời gian khởi động và thời gian truyền tải là khác nhau tùy thuộc
vào hệ thống máy tính
Thường thời gian khởi động lớn hơn thời gian truyền thông, cũng lớn hơn thời gian
thao tác số học Trong thực tế thời gian khởi động sẽ chi phối thời gian truyền thông
trong nhiều trường hợp Chúng ta không thể lờ đi số hạng này trừ phi n quá lớn
Sự phức tạp trong thời gian của thuật toán song song
Nếu phân tích sự phức tạp về thời gian, tcomm sẽ có độ phức tạp thời gian là O(n) Độ
phức tạp thời gian của tp sẽ là tổng của độ phức tạp của tính toán và song song
Ví dụ:
Giả sử chúng ta thực hiện việc cộng n số với sự tham gia của hai máy tính, mỗi máy
tính cộng n/2 số với nhau và những số này được khởi tạo trong máy tính đầu tiên
Máy tính thứ hai gởi trả kết quả của nó đến máy tính thứ nhất để cộng kết quả tổng
hai phần với nhau Bài toán này có một vài giai đoạn:
1 Máy 1 gởi đến máy 2 : n/2 số
2 Cả hay máy cộng n/2 số một cách đồng thời
3 Máy 3 gởi phần kết quả của nó trở lại máy 1
4 Máy 1 cộng phần tổng đó để tạo ra kết quả cuối cùng
Phân tích:
Tính toán(2,4)
tcomp=n/2+1;
Truyền thông(1,3)
tcomm=(tstartup+n/2tdata)+(tstartup+tdata)=2tstartup+(n/2+1)tdata
Độ phức tạp của tính toán là O(n) Độ phức tạp của truyền thông là O(n) Toàn bộ
độ phức tạp thời gian là O(n)
Trang 19Tỉ lệ comp/comm (tính toán/truyền thông)
Thông thường, truyền thông là rất hao tốn ( nghĩa là mất nhiều thời gian), nếu cả
tính toán và truyền thông cùng độ phức tạp, tăng n là không chắc cải thiện sự thực
thi Một cách lý tưởng, độ phức tạp của tính toán sẽ lớn hơn truyền thông, trong
trường hợp tăng n sẽ cải tiến sự thực thi
Ví dụ: giả sử thời gian truyền thông có độ phức tạp là O(n) và thời gian tính toán
có độ phức tạp là O(n2
) Bằng cách tăng n, cuối cùng là n có thể là nguyên nhân mà thời gian tính toán chi phối hầu hết thời gian thực thi
Chi phí và chi phí tối ưu thuật toán
Chi phí tính toán có thể định nghĩa:
Chi phí=(thời gian thực thi)X(tổng số các bộ xử lý được sử dụng)
Chi phí của tính toán tuần tự đơn giản là thời gian xử lý của nó, ts Chi phí của tính
toán song song là tp*p Giải thuật song song tối ưu về chi phí là một trong những
giải thuật mà chi phí để giải quyết một vấn đề là cân xứng như thời gian thực thi
trên một hệ thống bộ xử lý đơn
Chi phí=tp*p=k*ts
Ở đây k là hằng số Phân tích độ phức tạp thời gian, chúng ta có thể nói rằng giải
thuật song song là tối ưu về chi phí nếu:
Độ phức tạp thời gian song song*số bộ xử lý = độ phức tạp thời gian tuần tự
Ví dụ:
Giả sử giải thuật tuần tự tốt nhất cho một vấn đề với n số có độ phức tạp về thời
gian là O(nlogn) Một thuật toán song song giải quyết cùng vấn đề sử dụng n BXL
và có độ phức tạp về thời gian là O((n/p)*logn) là chi phí tối ưu Nhưng ngược lại,
một giải thuật song song sử dụng p2
BXL và độ phức tạp về thời là O(n2/p) là không tối ưu về chi phí
Thời gian truyền thông của quảng bá và kết hợp (broadcast/gather)
Mặc dù những thảo luận của chúng ta là về phân tích lý thuyết, chúng ta hãy xem
thao tác broadcast/gather và độ phức tạp của chúng Hầu hết các vấn đề cần đến dữ
Trang 20liệu được quảng bá (broadcast) đến các tiến trình và dữ liệu sẽ được kết hợp
(gather) từ các tiến trình Hầu hết các môi trường phần mềm cung cấp broadcast và
gather Giải thuật thực tế được sử dụng phụ thuộc vào kiến trúc bên trong của nhiều
máy tính Trước đây, người lập trình được trang bị kiến thức của kiến trúc nối liền
với nhau và có lẽ sẽ có thể nắm lấy lợi thế của nó, nhưng ngày nay điều này thường
ẩn với người lập trình
Trong phần này, chúng ta tập trung vào sử dụng cụm (Cluster) máy tính Một lần
nữa kiến trúc kết nối mạng được ẩn từ người dùng, mặc dù nó có vẻ cung cấp đầy
đủ tính kết nối đồng thời giữa các phần của những máy tính sử dụng switches
Trong quá khứ, Ethernet dùng một dây đơn nối tất cả các máy tính Broadcast trên
một kết nối Ethernet đơn có thể được sử dụng với một thông điệp đơn mà được đọc
bởi tất cả các điểm đích trên mạng đồng thời (Giao thức Ethernet cung cấp nghi
thức này trong truyền thông)
Sau đó broadcast có thể rất hiệu quả và quy định trong một thông điệp đơn:
tcomm=tstartup+wtdata
Với độ phức tạp O(1) cho mỗi mục dữ liệu, cho w mục dữ liệu là O(w)
Tất nhiên , hầu hết các cụm máy tính là sử dụng những kiến trúc mạng khác nhau,
broadcast trong 1 mạng Ethernet đơn nói chung sẽ không thích hợp
Mỗi lần một thông báo đến tại nơi cần đến, nó được thực hiện theo kiểu lan truyền 1
tới N (từ một node đến n node)
Cũng tương tự cho gather, ngoại trừ thông điệp chuyển đến phương hướng đối diện
Thời gian truyền thông là:
tcomm=N(tstartup+wtdata)
O(N) độ phức tạp thời gian truyền thông cho một nguồn kết nối đến N đích
Sequential
N destination Source
Trang 21Hình 1.11 1 đến n quảng bá hệ số phân đầu ra
1.4.3 Chiến lược phân chia và chia để trị
Trong mục này chúng ta khảo sát tỉ mỉ hai kỹ thuật cơ bản nhất trong lập
trình song song: phân chia và chia để trị Những kỹ thuật này liên quan với nhau
Trong phân chia, bài toán được chia thành nhiều phần khác nhau và mỗi phần được
tính toán khác nhau Chia để trị thường áp dụng phân chia (recursive manner) đệ
quy Đầu tiên, chúng ta sẽ xem xét kỹ thuật phân chia Sau đó chúng ta thảo luận về
phương pháp chia để trị Tiếp theo chúng ta phát thảo một vài vấn đề tiêu biểu mà
có thể được giải quyết bằng những cách tiếp cận này
1.4.3.1 Sự phân chia
Sự phân chia là chia vấn đề thành nhiều phần Nó là những khái niệm cơ bản
trong hầu hết lập trình song song trong hình thức này hoặc hình thức khác Ta có
thể sử dụng phân chia mà không có sự tương tác giữa các nhiệm vụ Phân chia có
thể được áp dụng đến dữ liệu của chương trình ( chia dữ liệu và thao tác trên dữ liệu
đã được chia đồng thời) Điều này được gọi là sự phân chia dữ liệu hay sự phân rã
dữ liệu
Sự phân chia có thể chỉ được áp dụng đến những chức năng của một chương trình
(nghĩa là chia nó thành những chức năng độc lập và thực thi chúng cùng lúc) Đây
là sự phân rã chức năng Ý tưởng thực thi một nhiệm vụ là chia nó thành một số nhỏ
hơn những nhiệm vụ và hoàn thành chúng đồng thời Tất nhiên, phải thực sự hiểu
biết tốt về nó thì mới có thể áp dụng được cho nhiều ngữ cảnh
Dù chia thành những chức năng độc lập nhưng không phải dễ để tìm thấy những
chức năng thực thi đồng thời trong một vấn đề, do đó phân chia dữ liệu là chiến
lược chính cho lập trình song song
Lấy ví dụ phân chia dữ liệu đơn giản, giả sử có một dãy số tuần tự x0,…,xn được
cộng lại với nhau Trừ khi đó là một dãy số vô cùng lớn, nếu không một lời giải
song song sẽ là không thể đáng giá Tuy nhiên, cách tiếp cận này có thể được sử
dụng trong nhiều ứng dụng thực tế bao hàm những tính toán phức tạp trên những dữ
liệu lớn
Trang 22Chúng ta có thể xem xét chia dãy thành p phần, mỗi phần n/p số (x0…x
(n/p)-1),(xn/p…x2n/p),…(x(p-1)n/p… xn-1), tại BXL p (hay là tiến trình) có thể cộng mỗi dãy
một cách độc lập để tạo những tổng riêng phần P tổng riêng phần phải được cộng
lại với nhau để được tổng cuối cùng Hình 1.12 cho thấy một sự sắp xếp mà trong
đó một BXL đơn cộng tổng riêng phần p Chú ý rằng mỗi BXL yêu cầu truy cập
đến những số mà nó phải tính toán Trong hệ thống truyền thông điệp, các số này
cần được truyền đến những BXL riêng lẻ (trong hệ thống chia sẻ bộ nhớ, mỗi BXL
có thể truy cập những số nó muốn từ bộ nhớ chia sẻ, và trong khía cạnh này, hệ
thống chia sẻ bộ nhớ có thể thuận tiện trong những vấn đề tương tự)
Hình 1.12 Phân chia 1 dãy số tuần tự và tính tổng riêng phần trên các tiến trình
Mã song song của ví dụ này không phức tạp Với cách tiếp cận master-slave, những
số này sẽ được gởi từ BXL master đến những BXL slave Chúng sẽ cộng những số
của chúng, thao tác độc lập đồng thời, và gởi kết quả tính tổng riêng phần đến BXL
master BXL master sẽ cộng những kết quả riêng phần để thiết lập kết quả cuối
cùng Thường chúng ta nói tiến trình hơn là BXL cho dãy mã, ở đây tiến trình là
được ánh xạ lên một BXL
Một quan điểm gây tranh luận là quảng bá hầu hết danh sách những số đến mỗi
slave hay là chỉ gởi những số đặc biệt đến slave là tốt nhất hay không ? Vì trong cả
hai trường hợp tất cả những số phải được gởi từ master Một sự quảng bá có thời
gian khởi động đơn lẻ hơn là thực hiện khởi động nhiều lần khác nhau khi sử dụng
nhiều hàm gởi và có lẽ là được thích hơn
Trang 23Đầu tiên chúng ta gởi những số đặc biệt đến mỗi slave sử dụng send() riêng biệt
Cho n số chia thành p nhóm, ở đây n/p là số nguyên và mỗi nhóm được gán đến một
Nếu dùng quảng bá chúng ta sẽ gởi một danh sách tới mỗi tiến trình slave, mã cần
cho mỗi slave sẽ chọn những phần dãy thích hợp để sử dụng:
scatter(numbers,&s,Pgroup,root=master);
reduce_add(&sum,&s,Pgroup,root=master);
Trang 24Cách tiếp cận chia để trị được mô tả bởi việc chia một bài toán thành những
bài toán con cùng dạng như là bài toán lớn Việc phân chia này thường được thực
thiện bởi kỹ thuật đệ quy Kỹ thuật đệ quy sẽ tiếp tục chia bài toán cho đến khi bài
toán không thể chia nhỏ được nữa Khi đó những bài toán đơn này sẽ được giải
quyết và kết quả được kết hợp lại Jájá(1992) đã phân biệt khi công việc chính là
phân chia bài toán và khi nó kết hợp kết quả Ông phân loại phương thức như là
chia và trị, trị khi công việc chính là kết hợp những kết quả và phân chia khi công
việc chính là chia bài toán Chúng ta sử dụng thuật ngữ chia và trị là sự phân chia
tiếp tục bài toán càng lúc càng nhỏ
Một sự định nghĩa đệ quy tuần tự cho việc cộng danh sách các số:
Trong đệ quy, một phương thức phải được đưa ra để giới hạn sự đệ quy khi sự phân
chia có thể không thể tiến xa hơn nữa Trong đoạn mã, number (s) trả về số các số
trong danh sách được xem bởi s Nếu có hai nhóm số trong danh sách, chúng được
gọi là n1,n2 Nếu có một số trong danh sách, nó được gọi là n1 và n2 là 0 Nếu không
có số nào, cả n1 và n2 là 0 Câu lệnh if được sử dụng cho các trường hợp 0,1,2 nhóm
số trong danh sách Khi mỗi sự phân chia tạo ra hai phần, việc đưa ra công thức chia
để trị một cách đệ quy sẽ thiết lập một cây nhị phân
Thực thi song song
Trang 25Trong thực thi tuần tự, chỉ một node trên cây có thể được viếng thăm tại mỗi thời
điểm Một giải pháp song song đề nghị viếng thăm một vài node của cây đồng thời
Một trong số đó là sự chia cắt được tạo ra hai phần, cả hai phần có thể được xử lý
đồng thời Mặc dù giải pháp song song một cách đệ quy được xem xét, có thể dễ
hơn khi hình dung nó không đệ quy, mấu chốt ở đây là cấu trúc cây Một trong số
đó có thể đơn giản là gán mỗi BXL cho mỗi node của cây Điều này rốt cuộc sẽ yêu
cầu 2(m+1)
-1 BXL để chia những nhiệm vụ thành 2m phần Mỗi BXL chỉ hoạt động
tại một cấp trong cây, điều này đưa đến một phương thức không hiệu quả
Để hiệu quả hơn ta sử dụng lại những BXL tại mỗi cấp của cây, sự phân chia sẽ
dừng lại khi tổng số các BXL là có giới hạn Cho đến khi mỗi cấp của BXL giữ một
nửa danh sách và chuyển một nửa cho BXL khác Đầu tiên p0 giao tiếp với p4,
chuyển một nửa danh sách đến p4 Sau đó p0,p4 chuyển một nửa danh sách chúng
nắm đến p2 và p6 theo thứ tự định sẵn Cuối cùng, p0,p2,p4 và p6 chuyển một nửa
danh sách chúng nắm đến p1,p3,p5,p7 mỗi danh sách tại cấp cuối cùng có n/8 số,hay
là n/p trong trường hợp chung của p BXL, có logp cấp của cây
Hình 1.13 Chia một danh sách thành nhiều phần
Việc kết hợp tính tổng của những tổng riêng phần được thấy tại hình 1.14 Một
trong những tổng riêng phần đã được thiết lập, mỗi bộ xử lý chuyển tổng riêng phần
của nó đến BXL riêng phần kế cận p1 chuyển tổng đến p0, p3 chuyển tổng của nó
đến p2, p5 đến p4 và vân vân Mỗi BXL cộng tổng riêng phần với tổng riêng phần
của nó và chuyển kết quả về phía trước Tiếp tục cho đến khi p0 có kết quả cuối
cùng
Trang 27Những dãy tương tự được yêu cầu trên những tiến trình khác Một cách sáng tỏ,
những thao tác kết hợp khác, như nhân,logic OR, AND, minimum, maximum, hay
chuỗi có thể móc nối vào nhau, có thể thay thế thao tác cộng trong ví dụ trước
Phân tích
Chúng ta giả sử n là lũy thừa của 2 Giai đoạn phân chia tối thiểu chỉ có truyền
thông nếu chúng ta giả định rằng sự phân chia danh sách thành hai phần đòi hỏi tính
toán ít nhất Giai đoạn kết hợp yêu cầu cả tính toán và phân chia để cộng những
tổng riêng phần được nhận và chuyển thành kết quả
Truyền thông
Thời gian truyền thông trong giai đoạn này cho bởi:
tcomm1=n/2*tdata +n/4*tdata+n/8*tdata+…+n/p*tdata=n(p-1)/p*tdata_
Ở đây, tdata là thời gian truyền thông cho một từ dữ liệu Thời gian tcomm1 là mép tốt
hơn là một broadcast đơn Giai đoạn kết hợp cũng tương tự, ngoại lệ là chỉ có một
mục dữ liệu được gởi trong mỗi thông điệp ( tổng riêng phần) đó là tcomm2=(logp)tdata
Tổng cộng thời gian truyền thông là:
tcomm=tcomm1+tcomm2=n(p-1)/p*tdata+(logp)*tdata
hoặc độ phức tạp là O(n) cho một số tiến trình cố định
Tính toán
Kết thúc giai đoạn phân chia, kết quả các dãy số được cộng lại với nhau, khi đó:
tcomp= n/p+logp
Một lần nữa có độ phức tạp là O(n) cho một số tiến trình cố định Với n lớn và biến
thiên p, chúng ta lấy O(n/p)
Toàn bộ thời gian tính toán:
Thời gian thực thi song song tổng cộng sẽ là:
tp=(n(p-1)/p+logp)*tdata+n/p+logp
Nhân tố tốc độ
Tốc độ=ts/tp=(n-1)/{((n/p)(p-1)+logp)*tdata+n/p+logp}
Trang 28Tốc độ tốt nhất mà ta mong chờ với phương thức này, tất nhiên, khi tất cả các tiến
trình p tính toán tổng riêng phần của nó Tốc độ thực sự sẽ nhỏ hơn giai đoạn phân
chia và kết hợp
Tỉ lệ tính toán trên truyền thông
tcomp/tcomm=(n/p+logp)/(((n/p)(p-1)+logp)*tdata)
Tính toán song song trong tích phân
Trước kia, chúng ta chia một bài toán và giải quyết mỗi bài toán con Bài toán đã
được giả định được chia thành những phần bằng nhau, và sự phân chia đã được tận
dụng Thỉnh thoảng, sự phân chia đơn giản sẽ không cho một giải pháp tối ưu
Một kỹ thuật chia để trị tổng quát là chia những vùng thành những phần liên tiếp và
để cho một hàm tối ưu quyết định khi nào những vùng được chia chắc chắn thích
Để tính tích phân của hàm này(nghĩa là tính vùng ở dưới đường cong), chúng ta có
thể chia vùng này thành các phần khác nhau, mỗi phần được tính toán trên một tiến
trình riêng Mỗi vùng được tính toán sử dụng giá trị gần đúng của hình chữ nhật
Hình 1.15 Tích phân dùng những hình chữ nhật
Ở đây f(p),f(q) là chiều cao của hai cạnh của vùng hình chữ nhật, và dx là chiều
rộng của hình chữ nhật Tích phân hoàn tất có thể xấp xỉ bằng cách cộng tất cả
Trang 29Một sự xấp xỉ tốt nhất có thể thu được bởi liên kết những hình chữ nhật để trung
điểm của mỗi hình chữ nhật cắt ngang với hàm
Hình 1.16 Tích phân chính xác hơn sử dụng hình chữ nhật
Những kiến trúc khác rõ ràng hơn là sử dụng những đường cắt nhau thật sự với hàm
để tạo vùng hình thang Mỗi vùng được tính toán là :
½(f(p)+f(q))*dx
Sự gán tĩnh
Chúng ta hãy xem xét phương thức hình thang Ưu tiên để bắt đầu tính toán, mỗi
tiến trình sẽ được gán tĩnh để chịu trách nhiệm tính toán mỗi vùng Bằng cách tạo
những vùng nhỏ hơn, chúng ta sẽ tính chính xác hơn Từ đó mỗi bước tính toán là
cùng hình thức, chế độ SPMD là thích hợp trong tình huống này Giả sử chúng ta
tính tổng vùng từ a đến b sử dụng p tiến trình đánh số từ 0 đến p-1.Kích thước mỗi
vùng cho tiến trình là (b-a)/p Để tính toán vùng theo kiểu đã được mô tả, một đoạn
giả mã SPMD được sử dụng
Trang 30Hình 1.17 Tích phân sử dụng phương thức hình thang
Thao tác rút gọn là được sử dụng để cộng những vùng đã được tính toán bởi những
tiến trình riêng biệt Để tính toán hiệu quả, sự tính toán ở mỗi vùng có thể được viết
lại như sau:
area=0.0;
for(x=start;x<end;x=x+d)
area=area+f(x)+f(x+d);
area=0.5*area*d;
Chúng ta giả định biến area không vượt quá giá trị max cho phép Để hiệu quả hơn,
chúng ta có thể đơn giản tính toán bởi rút gọn đại số, như sau:
Area
2
) ( ) ) 1 ( ( (
2
) 2 ( ) ( ( 2
) ( ) (
Trang 31)
n a f a
f a
f a
Trong phần này, chúng ta sẽ giới thiệu một kỹ thuật xử lý song song gọi là
đường ống, chúng được ứng dụng rộng rãi trong nhiều bài toán Tính toán đường
ống là cần thiết để tăng cường khả năng thi hành
1.4.4.1 Kỹ thuật đường ống
Trong kỹ thuật đường ống, bài toán được chia thành một loạt những nhiệm vụ
phải được hoàn thành theo cách: nhiệm vụ này hoàn tất sau những nhiệm vụ khác
Thật ra đây điều là cơ bản của lập trình tuần tự Trong kỹ thuật đường ống, mỗi
nhiệm vụ được thực thi bởi một tiến trình khác nhau Chúng ta thỉnh thoảng đề cập
đến một tiến trình đường ống như là một giai đoạn đường ống Mỗi giai đoạn góp
phần hoàn thành bài toán và chuyển thông tin cần thiết cho giai đoạn kế tiếp Tính
song song có thể nhận thấy như là một hình thức phân tán chức năng Bài toán được
chia thành nhiều giai đoạn khác nhau và được thực thi Nhưng trong trường hợp này
những chức năng được thực thi liên tiếp Như chúng ta sẽ thấy, dữ liệu đầu vào
thường được phân ly và xử lý khác nhau
Hình 1.18 Xử lý đường ống Một ví dụ của chương trình tuần tự có thể được trình bày rõ ràng như là một
đường ống, xem xét vòng lặp sau:
for (i=0;i<n;i++) sum=sum+a[i];
Với tổng của các phần tử của mảng a, vòng lặp có thể được tháo ra như sau:
sum=sum+a[0];
sum=sum+a[1];
sum=sum+a[2];
Trang 32sum=sum+a[3];
sum=sum+a[4];
Một giải pháp đường ống là mỗi giai đoạn riêng biệt cho mỗi câu lệnh Mỗi
giai đoạn tính tổng với đầu vào của nó, sin
Và với một phần tử a[] tạo ra một tổng cho đầu ra của nó, sout
Do đó giai đoạn i thực thi:
Sout=sin+a[i];
Thay vì những câu lệnh đơn, một loạt các chức năng có thể được thực thi theo
phong cách đường ống Một bộ lọc tần số là một ví dụ thực sự trong đó bài toán
được chia thành một loạt các chức năng Mục tiêu ở đây là di chuyển những tần số
đặc biệt (f0,f1,f2,f3 v.v) từ một tín hiệu Tín hiệu có thể tham gia vào đường ống từ
bên trái Mỗi giai đoạn sẽ đáp lại bằng cách dịch chuyển một tần số
Hình 1.19 Đường ống trong vòng lặp
Hình 1.19 Đường ống trong bộ lọc tần số Cách tiếp cận đường ống có thể cung cấp việc tăng tốc theo 3 kiểu tính toán sau:
1 Nếu có nhiều hơn một yêu cầu để hoàn tất bài toán là được thi hành
2 Nếu một loạt những mục dữ liệu phải được xử lý, những mục dữ liệu này đòi
hỏi nhiều thao tác tính toán
3 Nếu thông tin để bắt đầu cho tiến trình kế tiếp được chuyển lên sau khi một tiến
trình hoàn tất những thao tác bên trong của nó
Chúng ta sẽ định danh 3 giải pháp như 3 kiểu: kiểu 1, kiểu 2, kiểu 3
Trang 33Sự sắp xếp theo kiểu 1 được sử dụng rộng rãi trong thiết kế phần cứng
Kiểu đường ống 1 được minh họa như hình dưới:
Hình 1.20 Sơ đồ không gian thời gian của một ống dẫn Trong hình này, mỗi tiến trình được giả định là cho cùng thời gian để hoàn tất
những nhiệm vụ của nó Mỗi giai đoạn thời gian là một chu kì đường ống Mỗi yêu
cầu của bài toán đòi hỏi 6 tiến trình liên tiếp, P0 P1 P2 P3 P4 và P5
Những thông tin tương tự có thể thấy như hình sau:
Hình 1.21 Sơ đồ không gian thời gian luân phiên Dạng tương tự của biểu đồ này thỉnh thoảng hữu ích nếu nó cần thiết để cho thấy
thông tin được chuyển từ một yêu cầu của nhiệm vụ này đến nhiệm vụ khác
Với p tiến trình lập thành đường ống và m yêu cầu của bài toán để thực thi, số
lượng các chu kì đường ống để thực thi tất cả m yêu cầu được cho bởi m+p-1 chu
kì
Sự sắp xếp theo kiểu 2: Một loạt những mục dữ liệu phải được xử lý trong một
chuỗi, xuất hiện trong thuật toán tính toán, ví dụ như: nhân những phần tử của một
mảng, ở đây những phần tử đơn lẻ tham gia vào đường ống như là một loạt các số
Trang 34tuần tự Kiểu sắp xếp này được thể hiện như hình sau: ở đây 6 tiến trình thiết lập
đường ống và 6 phần tử d0 đến d5 được xử lý Với p tiến trình và m mục dữ liệu, tất
cả thời gian thực thi là (p-1)+n chu kì đường ống
(a) Kiến trúc đường ống
(b) Sơ đồ thời gian Hình 1.22 Đường ống đang xử lý với 6 phần tử dữ liệu
Thông dụng nhất là kiểu sắp xếp thứ 3, nó được ứng dụng nhiều trong lập trình
song song Ở đây chỉ có một yêu cầu của bài toán được thi hành nhưng mỗi tiến
trình có thể chuyển thông tin của yêu cầu này đến tiến trình tiếp theo trước khi yêu
cầu được hoàn tất Hình 1.23 cho thấy khoảng thời gian khi mà thông tin có thể
chuyển từ một tiến trình đến một tiến trình khác trước khi nó kết thúc việc thi hành
của một tiến trình
(a) Tiến trình với cùng thời gian (b) Tiến trình không cùng
Trang 35Hình 1.23 Xử lý đường ống mà ở đó thông tin được chuyển đến giai đoạn tiếp theo
sau khi một tiến trình kết thúc
Nếu số lượng các giai đoạn lớn hơn số lượng các tiến trình trong đường ống,
một nhóm các giai đoạn có thể được gán đến mỗi tiến trình( có thể thấy như hình
1.23) Tất nhiên, những giai đoạn đường ống giới hạn trong một tiến trình phải
được thi hành tuần tự
Hình 1.23 Phân chia sự thi hành cho nhiều tiến trình
1.4.4.2 Sắp xếp số
Mục đích của sắp xếp số là sắp lại một tập các số theo chiều tăng hay giảm dần
Một giải pháp đường ống cho việc sắp xếp là bắt đầu bằng tiến trình đầu tiên, P0
nhận một loạt các số một lần, lưu trữ số lớn nhất mà nó nhận được và chuyển về
phía trước các số nhỏ hơn số được lưu trữ Nếu một số được nhận là lớn hơn số
hiện tại lưu trữ, nó sẽ thay thế số hiện tại được lưu trữ và số đã lưu trữ trước đó sẽ
được chuyển về phía trước Mỗi tiến trình tiếp theo sẽ thực hiện thuật toán tương
else send(&number,Pi+1);
Với n số, tiến trình thứ i phải biết n-i số, và chuyển n-i+1 số về phía trước
Một vòng lặp đơn có thể được sử dụng như sau:
Trang 36Hình 1.24 Từng bước của thuật toán sắp xếp chèn với 5 số
1.4.4.3 Thuật toán sắp xếp so sánh và đổi chỗ
Một trong các thuật toán sắp xếp đơn giản nhất là thực hiện so sánh hai phần tử liền kề
với nhau và nếu chúng chưa theo thứ tự cần sắp thì đổi chỗ của chúng với nhau Quá trình
này lặp lại cho đến khi không còn cặp nào thoả mãn thì dừng
a/ Thuật toán tuần tự: sắp xếp mảng a[n] theo thứ tự tăng dần
for(i=n-1; i > 0; i )
for(j=0; j < i; i++) {
k = j + 1;
if(a[j] > a[k])
{ temp = a[j];
a[j] = a[k];
a[k] = temp;
Trang 37}
b/ Thuật toán song song:
Chúng ta có thể sử dụng n tiến trình kết hợp theo nguyên lý hình ống để sắp xếp
mảng a[n] Hệ thống được chia thành hai pha: pha chẵn và pha lẻ
Pha chẵn: các tiến trình được đánh số chẵn so sánh với những tiến trình
tiếp theo (tiến trình có số lẻ), nếu nó giữ phần tử lớn hơn thì đổi dữ liệu
với tiến trình đó
Pha lẻ: các tiến trình có số lẻ hoạt động tương tự như trên
Ví dụ: n = 8 và dãy số ban đầu là 4, 2, 7, 8, 5, 1, 3, 6
Hình 1.25 Sắp xếp theo nguyên lý ống
Ở pha thứ 6 và 7, không có cặp nào phải đổi chỗ do vậy thuật toán dừng và cho kết
quả là một dãy được sắp xếp Trong hình 5-4, mũi tên hai chiều đứt nét để chỉ
những cặp so sánh với nhau nhưng không cần đổi chỗ, còn mũi tên nét liền là phải
đổi giá trị cho nhau
Giả thiết dữ liệu được lưu ở những tiến trình chẵn là B và ở những tiến trình lẻ là A
Thuật toán song song theo hình ống được mô tả trong mô hình truyền thông điệp
như sau:
a/ Pha chẵn
Pi, i = 0, 2, 4, , n-2 (chẵn) Pi, i = 1, 3, 5, , n-3 (lẻ)
b/ Pha lẻ
Pi, i = 1, 3, 5, , n-3 (lẻ) Pi, i = 0, 2, 4, , n-2 (chẵn)
Trang 38if(A > B) A = B; if(A > B) B = A;
Trong cả hai trường hợp, các tiến trình (bộ xử lý) được đánh số lẻ đều gọi hàm
send() sau đó mới gọi recv() Kết hợp lại chúng ta được thuật toán song song:
Pi, i = 1, 3, 5, , n-3 (lẻ) Pi, i = 0, 2, 4, , n-2 (chẵn)
send(&A, Pi-1); recv(&A, Pi+1);// pha chẵn
recv(&B, Pi-1); send(&B, Pi+1);
send(&A, Pi+1); recv(&A, Pi-1);// pha lẻ
recv(&B, Pi+1); send(&B, Pi-1);
Thuật toán này có độ phức tạp O(n)
1.4.4.4 Giải bài toán hệ phương trình tuyến tính dạng đặc biệt
Mục tiêu của việc giải bài toán hệ phương trình tuyến tính ở đây là giải hệ
phương trình tuyến tính dạng tam giác
0 0
a
b
x Giá trị thu được từ x0 là được sử dụng trong phương trình tiếp theo để thu được x1:
1 , 1
0 0 , 1 1 1
a
x a b
Giá trị thu được từ x0 và x1 sẽ được dùng trong hệ phương trình tiếp theo để thu
được x2:
2 , 2
1 1 , 2 0 0 , 2 2 2
a
x a x a b
Rõ ràng, giải thuật này có thể được thi hành bởi một đường ống Đầu tiên đường
ống nhận x0 và chuyển x0 sang giai đoạn thứ 2 để tính x1 từ x0 và chuyển cả x0,x1
sang giai đoạn tiếp theo để tính x từ x ,x , v.v mỗi giai đoạn thực thi với một tiến
Trang 39trình Có n tiến trình cho n phương trình Tiến trình thứ i(0<i<p) nhận giá trị từ
x0,x1,…,xi-1 và tính giá trị xi:
i
j j i
j i
i
a
x a b
x
, , 1 0
Mã tuần tự của chương trình:
Cho ai,j và bk là hằng số và được lưu trong mảng a[][] và b[] theo thứ tự định sẵn,
và biến cần tìm được lưu trong mảng x[], mã tuần tự như sau:
Trang 40Chương II Kỹ thuật truyền thông điệp trong tính toán song
song với MPI
2.1 Cơ bản về truyền thông điệp
2.1.1 Mô hình truyền thông điệp
Giống như mô hình chia sẻ bộ nhớ, các đơn vị xử lý song song trong mô hình
truyền thông điệp là các tiến trình Tuy nhiên cũng có một số điểm khác nhau giữa
hai mô hình này Trong mô hình truyền thông điệp:
Các tiến trình có thể thực hiện trên những bộ xử lý khác nhau và không truy cập
được vào không gian địa chỉ chia sẻ Vì lý do này, những chương trình trao đổi
thông điệp với nhau còn được gọi là các chương trình phân tán
Chỉ có kênh truyền là có thể chia sẻ cho các tiến trình, thường đó là LAN hoặc
mạng diện rộng
Việc truyền thông và đồng bộ hoá hoạt động của các tiến trình được thực hiện
thông qua hai phương thức send() và receive()
Tất cả các biến là cục bộ của các tiến trình Vì thế, những vấn đề về xung đột dữ
liệu (cần phải khoá dữ liệu khi một tiến trình truy cập), hay tranh chấp thông tin (bài
toán loại trừ nhau) không xuất hiện trong mô hình tính toán phân tán
Việc đồng bộ hoá các tiến trình của một chương trình song song được thực hiện
theo có chế truyền thông điệp Khi một tiến trình muốn gửi một thông điệp thì nó
phải chờ cho đến khi tiến trình nhận sẵn sàng nhận thông điệp đó và ngược lại, cũng
tương tự Ở đây không có các buffer để tạm lưu giữ các thông điệp cần trao đổi giữa
các tiến trình
2.1.2 Kênh truyền thông
Những hệ thống khác nhau sẽ cung cấp những kênh truyền ở những mức trừu
tượng khác nhau Hầu hết các hệ thống đều đảm bảo rằng các kênh truyền thông
không có các lỗi thông thường Nghĩa là, tất cả các thông điệp được gửi đi và sẽ đến
được đích mà không bị sai lạc
Kênh truyền thông có thể được xem như là hàng đợi, và thông điệp sẽ được gửi đến
đích theo thứ tự nó được gửi đi Kênh truyền thông cũng có thể được xem như là