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

Kỹ Thuật Đường Ống Và Cân Bằng Tải Trong Lập Trình Song Song MPI

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 (1007.8 KB, 84 trang )

Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp


Lờ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ọ













Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp




MỤ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
2.3 Sử dụng MPI trên Linux và Windows 50
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp


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 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
BXL
Bộ xử lý

MIMD
Đa lệnh đa
dữ liệu
Multiple instruction multiple data
MPI
Giao diện
truyền thông
điệp
Message Passing Interface
OPENMP

Open MultiProcessing
SIMD
Đơn lệnh đa
dữ liệu
Single instruction multiple data
SMP
Đa xử lý đối
xứng
Symmetric MultiProcessor
UMA
Truy cập bộ

nhớ đồng
đều
Uniform Memory Access
CC-SMP

Cache coheren-Symmetric MultiProcessor







Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

1
MỞ ĐẦ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.





Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

2
Chươ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)
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

3
Tiể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 độ
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

4
mớ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.
Kiến trúc bộ nhớ phân tán.
Kiến trúc bộ nhớ lai.
1.2.1 Phân loại dựa trên sự tương tác giữa các BXL
1.2.1.1 Chia sẻ bộ nhớ chung







Hình 1.1 Máy tính song song chia sẻ bộ nhớ dùng chung
Máy tính loại này sử dụng bộ nhớ chia sẻ toàn cục (global shared memory) mà tất
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
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

5
Thứ 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.

BXL

BXL


BXL

BXL

MEMORY

BXL
Memory
Memory

BXL
Đường kết nối các
SMP
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

6
Má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
đến vấn đề tranh chấp BUS.








Hình 1.4 Máy tính có bộ nhớ phân tán

Memory

BXL

BXL

Memory

Memory

BXL

Memory


BXL
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

7
1.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)
Trong máy tính SIMD, tất cả các phần tử xử lý đều được điều hành bởi
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp


8
mộ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
BXL1
BXL2
BXLn
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

9

mớ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.

Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

10


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.
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

11


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
song song.
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

12
Nhữ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 {T
1
, T
2
, . . ., T
n
}, trong đó T
i+1
thực hiện sau khi T
i
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.
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp


13
 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, t
s
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, t
p
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ó:
t
p
=t
comp
+t
comm

Thờ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à:
t
comp
=t
comp1
+t
comp2
+t
comp3

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:
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

14
-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:
t
comm1
=t

startup
+wt
data

Thuật ngữ t
startup
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.
t
startup
còn được giả định là một hằng số.
Thuật ngữ t
data
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, t
comm
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
t
comm
=t
comm1

+t
comm2
………
Nhân tố đánh giá chuẩn:
Tốc độ (Speed up) =t
s
/t
p
=ts/(t
comp
+t
comm
)
Tỉ lệ tính toán/truyền thông=t
comp
/t
comm


Những ghi chú trong sự giải thích phương trình
Thời gian thực thi song song t
p
, 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
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

15
cù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, t
comm
sẽ có độ phức tạp thời gian là O(n). Độ
phức tạp thời gian của t
p
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)
t
comp
=n/2+1;

Truyền thông(1,3)
t
comm
=(t
startup
+n/2t
data
)+(t
startup
+t
data
)=2t
startup
+(n/2+1)t
data

Độ 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).
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

16


Tỉ 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(n

2
). 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ó, t
s
. Chi phí của tính
toán song song là t
p
*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í=t
p
*p=k*t
s

Ở đâ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 p
2
BXL và độ phức tạp về thời là O(n
2

/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ữ
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

17
liệ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:
t
comm
=t
startup
+wt
data

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à:
t
comm
=N(t
startup
+wt
data
)
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
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

18
Hì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ự x
0
,…,x
n
đượ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.
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

19
Chúng ta có thể xem xét chia dãy thành p phần, mỗi phần n/p số (x
0
…x

(n/p)-
1
),(x
n/p
…x
2n/p
),…(x
(p-1)n/p
… x
n-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.
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

20
Đầ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
tiến trình. Có p slaves:
Master
S=n/p;
for(i=0,x=0;i<p;i++,x=x+s)
Send(&number[x],s,p
i
)
Sum=0;
for(i=0;i<p;i++)
{
recv(&part_sum,p
any
);
sum=sum+part_sum;
}
Slave
recv(number,s,P
master
);
part_num=0;
for(i=0;i<s;i++)
part_sum=part_sum+numbers[i];
send(&part_sum,P
master

);
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:
Master
S=n/p;
bcast(numbers,s,p
slave_group
);
Sum=0;
For(i=0;i<p;i++)
{
recv(&part_sum,p
any
);
sum=sum+part_sum;
}
Slave
bcast(numbers,s,P
master
);
start=slave_number*s;
end=start+s;
part-sum=0;
for(i=start;i<end;i++)
part_sum=part_sum+numbers[i];
send(&part-sum,p
master
);
Code dùng scatter và reduce
Master

s=n/p;
scatter(numbers,&s,P
group
,root=master);
reduce_add(&sum,&s,P
group
,root=master);
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

21
Slave
scatter(numers,&s,P
group
,root=master);
….
reduce_add(&part_sum,&s,P
group
,root=master);

1.4.3.2 Chia để trị
Cá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ố:

int add(int *s)
{
if(number(s)<=2) return (n1+n2);
else
{
Divide(s,s1,s2);
part_sum1=add(s1);
part_sum2=add(s2);
return (part_sum1+part_sum2);
}
}
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à n
1
,n
2
. Nếu có một số trong danh sách, nó được gọi là n
1
và n
2
là 0. Nếu không
có số nào, cả n
1
và n
2
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
Nguyễn Hữu Hoàng Thọ Khóa luận tốt nghiệp

22
Trong 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 2
m
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 p
0
giao tiếp với p
4
,
chuyển một nửa danh sách đến p
4
. Sau đó p
0
,p
4
chuyển một nửa danh sách chúng

nắm đến p
2
và p
6
theo thứ tự định sẵn. Cuối cùng, p
0
,p
2
,p
4
và p
6
chuyển một nửa
danh sách chúng nắm đến p
1
,p
3
,p
5
,p
7
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.

×