Tải bản đầy đủ (.doc) (14 trang)

TỔNG QUAN VỀ TÍNH TOÁN SONG SONG TRONG KHOA HỌC MÁY TÍNH

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 (216.84 KB, 14 trang )

TỔNG QUAN VỀ TÍNH TOÁN SONG SONG
I. Tổng quan thuật toán song song
1. Khái niệm thuật toán song song
Tính toán song song hay xử lý song song: là quá trình xử lý thông tin trong đó nhấn
mạnh việc nhiều đơn vị dữ liệu được xử lý đồng thời bởi một hay nhiều bộ xử lý để giải
quyết một bài toán.
Siêu máy tính: là những máy tính đa năng thông thường có tốc độ tính toán vô cùng
lớn. Chúng chia làm hai loại:
- Máy tính song song dựa trên bộ vi xử lý : được thiết kế với rất nhiều bộ xử lý có
tốc độ vừa phải.
- Siêu máy tính truyền thống (supercomputer) : ít bộ xử lý hơn nhưng tốc độ của
mỗi bộ xử lý đó lại cực cao.
Song song về dữ liệu (data parallelism): Là cơ chế sử dụng nhiều đơn vị xử lý thực
hiện cùng một thao tác trên nhiều đơn vị dữ liệu .
Song song điều khiển (control parallelism) : là cơ chế trong đó nhiều thao tác khác
nhau tác động lên nhiều đơn vị dữ liệu khác nhau một cách đồng thời.
Dây chuyền (pipeline) : là cơ chế chia công việc thành nhiều chặng nối tiếp, mỗi
chặng được thực hiện bởi một bộ phận khác nhau. Đầu ra của bộ phận này là đầu vào của
bộ phận tiếp theo.
Tăng tốc : tăng tốc của thuật toán song song là tỉ số giữa thời gian thực hiện trong tình
huống xấu nhất của thuật toán tuần tự tốt nhất và thời gian thực hiện cũng công việc đó
của thuật toán song song.

2. Các mức độ song song
Tăng tốc =
Thời gian thực hiện trong tình huống xấu nhất
theo thuật toán tuần tự nhanh nhất
Thời gian thực hiện trong tình huống xấu nhất
của thuật toán song song đang xét
Giả sử có 10 công việc từng đôi một khác nhau thì ta giao cho 10 máy làm, ta có mức
song song cao nhất, và chúng ta gọi là mức chương trình song song. Mỗi công việc ta lại


chia thành các công đoạn (Task) và có thể thực hiện song song, ta gọi mức độ song song
này là mức song song chương trình con. Mỗi chương trình cũng như chương trình con lại
có hàng loạt câu lệnh, ta có mức độ song song câu lệnh, trong câu lệnh lại có hành loạt
thao tác (operation) => mức độ song song thao tác.
3. Phân loại các kiến trúc song song
Một trong những phân loại hay được nhắc tới là của Flynn – 1972. Michael Flynn
phân các kiến trúc máy tính thành bốn loại dựa trên tương tác giữa lệnh và dữ liệu :
- SIMD(single instruction stream, single data stream) Đây chính là kiến trúc tuần tự
Von Neuman, trong đó tại mỗi thời điểm chỉ một lệnh được thực hiện.
- MISD (multiple instruction stream, single data stream) Kiến trúc này cho phép
một vài lệnh cùng thao tác trên một dữ liệu
- SIMD (single instruction stream, multiple data stream) Cho phép một lệnh được
thực hiện đồng thời trên các dữ liệu khác nhau.
- MIMD (multiple instruction stream, multiple data stream). Cho phép nhiều lệnh
khác nhau có thể đồng thời xử lý nhiều dữ liệu khác nhau trong cùng một thời
điểm.
4. Đánh giá độ phức tạp của thuật toán song song
Trong thuật toán tuần tự chúng ta chỉ quan tâm tới độ phức tạp về thời gian và không
gian, nhưng trong thuật toán song song thường có thêm một số đại lượng đo lường khác.
Hơn nữa, độ phức tạp thời gian của thuật toán song song không chỉ đơn giản là việc đếm
số câu lệnh cơ bản như trong thuật toán tuần tự mà thay vào đó nó phụ thuộc vào các
phép toán cơ bản này có thể được thực hiện trên P (P > 1) bộ xử lý như thế nào. Bên cạnh
độ phức tạp thời gian độ phức tạp về số bộ xử lý cũng là một đại lượng quan trọng trong
phân tích thuật toán song song. Thiết kế thuật toán song song hiệu quả bao gồm việc lựa
chọn cấu trúc dữ liệu phù hợp, phân bố bộ xử lý và cuối cùng là thực hiện thuật toán. Ba
đại lượng này tác động lẫn nhau như một tổ chức tính toán.
4.1 Song song giới hạn và song song không giới hạn
Độ phức tạp thời gian của thuật toán song song cũng là một hàm của kích thước dữ
liệu đầu vào – n . Độ phức tạp thời gian là đại lượng quan trọng nhất của thuật toán song
song bởi vì động cơ chính của song song là nhằm tăng tốc thời gian tính toán.

Độ phức tạp thời gian tồi nhất (hay đơn giản là độ phức tạp thời gian) của thuật toán
song song giải quyết bài toán P
n
với kích thước đầu vào n là một hàm f(n) cho thời gian
lớn nhất từ lúc bắt đầu thực hiện thuật toán trên một hay nhiều bộ xử lý đến lúc kết thúc
thuật toán bởi một hay nhiều bộ xử lý với bất kỳ bộ dữ liệu nào.
Các thuật toán song song được thực hiện trên một tập các bộ xử lý nên đòi hỏi việc
truyền dữ liệu giữa chúng. Vì thế nó bao hàm hai hoạt động khác nhau. Một hoạt động là
tính toán (như các phép toán số học hay logic) được thực hiện một cách cục bộ trên một
bộ xử lý, hoạt động khác là gửi dữ liệu giữa các bộ xử lý. Trong thuật toán song song một
bước cơ bản là một tập các hoạt động cơ bản có thể được thực hiện một cách đồng thời
bởi một tập các bộ xử lý – độ phức tạp thời gian của một bước cơ bản là hằng số hay
O(1). Độ phức tạp thời gian của thuật toán song song được xác định bởi việc đếm số
bước cơ bản và số bước chuyển giao dữ liệu, trong đó thời gian chuyển giao dữ liệu tại
mỗi bước phụ thuộc vào mô hình liên kết giữa các bộ xử lý. Một số tài liệu còn gọi độ
phức tạp thời gian của thuật toán song song là độ sâu.
Độ phức tạp thời gian của thuật toán song song phụ thuộc vào mô hình tính toán song
song được sử dụng một cách tốt nhất trên số lượng bộ xử lý. Vì thế, khi đưa ra độ phức
tạp thời gian của thuật toán song song cần thiết đưa ra số lượng lớn nhất bộ xử lý cần sử
dụng như một hàm của kích thước dữ liệu đầu vào n, và gọi là độ phức tạp số bộ xử lý
của thuật toán. Việc tổng hợp và phân tích một thuật toán song song dưới mô hình có P
bộ xử lý (P là một số nguyên cố định và P > 1) được gọi là mô hình song song có giới
hạn. Ngược lại, mô hình song song không giới hạn là khi mà chúng ta có và được phép
tùy ý sử dụng một số lượng bộ xử lý không giới hạn .
Thuật toán song song thực hiện trên mô hình P bộ xử lý được gọi là P-song song. Nếu
thuật toán P-song song cho bài toán kích thước n đòi hỏi t(n) bước song song thì được gọi
là P-có thể tính toán trong thời gian t. Chúng ta giả sử rằng một thuật toán song song A
giải quyết bài toán kích thước n với P bộ xử lý.Nếu tồn tại đa thức F sao cho ∀n , P ≤
F(n) , thì số lượng bộ xử lý được gọi là cận đa thức, ngược lại thì không có cận đa thức.
Thuật toán song song có giới hạn là thích hợp trong thực tế. Tuy nhiên, các thuật toán

song song không giới hạn có một sự quan tâm lớn về mặt lý thuyết, vì chúng đưa ra các
giới hạn cho tính toán song song. Bằng trực giác điều đó có nghĩa là chúng ta giả sử tồn
tại một số lượng vô hạn bộ xử lý( nghĩa là thuật toán có thể sử dụng tùy ý số lượng bộ xử
lý), và cũng không có giới hạn về truyền thông và truy cập bộ nhớ, thì thời gian tính toán
không thể giảm dưới một giới hạn nào đó.
Thực tế số lượng bộ xử lý là có giới hạn, nên thuật toán trên mô hình song song
không giới hạn chỉ có thể sử dụng trong thực tế nếu chúng được chuyển thành thuật toán
P-song song. Có hai phương pháp đưa ra các phép chuyển đổi này : phân tách bài toán
hoặc là phân tách thuật toán. Ta có thuật toán song song A giải bài toán P
n
kích thước đầu
vào n trong thời gian t
1
(n) sử dụng p
1
(n) bộ xử lý. Giờ ta đi thiết kế thuật toán mới B giải
bài toán P
n
trong thời gian t
2
(n) sử dụng p
2
(n) bộ xử lý, trong đó p
2
(n) < p
1
(n). Cách thứ
nhất phân tách bài toán thành các bài toán nhỏ hơn với kích thước m (m < n), mỗi bài
toán được giải bởi thuật toán ban đầu với số lượng bộ xử lý nhỏ hơn – p
2

(m). Cách thứ
hai là phân tách một thuật toán, mỗi bước của nó được phân tách thành các bước nhỏ hơn
theo một cách nào đó sao cho chúng được thực hiện với một số lượng bộ xử lý nhỏ hơn.
4.2. Cận trên và cận dưới
Thuật toán song song nhanh nhất được biết để giải quyết bài toán cho ta cận trên của
tính toán đó. Nếu một ai đó thiết kế ra một thuật toán nhanh hơn thuật toán nhanh nhất
trước đó để giải quyết cùng một bài toán thì chúng ta nói rằng cận trên mới đã được thiết
lập cho việc tính toán lời giải của bài toán đó. Cận dưới xác định độ phức tạp của bài
toán, nghĩa là nó đưa ra lượng thời gian tối thiểu để giải quyết bài toán sử dụng một thuật
toán song song tùy ý.
4.3. Chi phí, tăng tốc, và hiệu quả của thuật toán song song
Tăng tốc và hiệu suất : xét bài toán với thuật toán tuần tự tốt nhất có thời gian T
s
,
thuật toán song song T
p
; số bộ xử lý là P. Khi đó:
Tăng tốc = T
s
/T
p
Hiệu suất = T
s
/(PT
p
)
Tăng tốc luôn nhỏ hơn số bộ xử lý, cố gắng đạt tới bằng nên hiệu suất đạt cùng lắm là
1.
4.4. Các kĩ thuật cho việc nâng cao hiệu quả của thuật toán song song
- Giảm số lượng bộ xử lý

- Giảm độ phức tạp thời gian
4.5. Độ phức tạp của bài toán
Dưới đây là mô hình phân lớp độ phức tạp của bài toán
Nói chung xử lý song song không có tác dụng cho việc giải quyết các bài toán NP.
Một bài toán thực hiện trong 400 tỷ thế kỷ trên một bộ xử lý sẽ mất 400 thế kỷ nếu chúng
ta thực hiện song song hóa một cách hoàn hảo và thực hiện trên 1 tỷ bộ xử lý. Vì thế, xử
lý song song được sử dụng chính cho việc tăng tốc thời gian thực hiện của bài toán P.
II. Tổng quan MPI
1. Môi trường gửi nhận MPI.
1.1 Khái niệm SPMD độc trình dùng bộ nhớ phân tán.
Mỗi máy hoạt động theo nhịp đồng hồ riêng của mình và chỉ có thể đọc dữ liệu ở trên
máy của mình (distributed memory system & asynchronous operation mode). Đối với
một mạng như vậy, thì về nguyên tắc, trên mỗi máy ta có thể cho chạy một trình riêng và
dữ liệu của mỗi trình là riêng (MPMD). Các trình này có thể khác nhau, tức là chúng giải
quyết các bài toán khác nhau, hoạt động độc lập và chỉ đến một lúc nào đó thì chúng mới
trao đổi dữ liệu cho nhau.
Sự việc xảy ra là: nếu thời điểm khởi động các trình trên các máy khác nhau mà
không xác định, thì thời điểm cho việc chúng trao đổi dữ liệu cho nhau cũng không thể
xác định được. Vậy chúng ta vẫn cần phải có một “trọng tài” để xác định thời điểm bắt
đầu hoạt động cho chúng. Với quan niệm này người ta coi như tất cả chúng chỉ là một
trình chung thôi độc trình. Điều này hàm ý: - (1) Trên mỗi máy tính chạy một trình,
nhưng chúng hoàn toàn giống nhau, - (2) Tất cả các trình ấy được khởi động để chạy
cùng một lúc.
Tuy chỉ sử dụng một độc trình, nhưng các máy tính khác nhau vẫn sẽ làm những
“phần việc” của mình, bởi trong trình chung ấy, mỗi “phần việc” là những đoạn lệnh
riêng – mà mỗi máy sẽ tự kiểm tra xem mình cần chạy đoạn lệnh nào.
Các trình, tức là các đoạn lệnh “riêng” ấy, chỉ có thể truy cập trực tiếp vào bộ nhớ
RAM trong máy của mình – độc trình dùng bộ nhớ phân tán. Nếu ở trong trình có một
biến được khai báo thì tức là nó sẽ có mặt ở tất cả các máy tính.
Điều vừa được trình bày ra ở trên hàm ý là các máy tính không thể thực hiện được

việc trao đổi giá trị với nhau thông qua các ô nhớ (bởi trên thực tế chúng chẳng có ô nhớ
chung nào cả!). Các máy tính muốn trao đổi dữ liệu với nhau thì phải thông qua các lệnh
gửi-nhận mà MPI cung cấp. Đó là môi trường đảm nhận nhiệm vụ truyền tải dữ liệu qua
mạng. Mỗi máy tính muốn tham gia vào hệ thống MPI phải được cài thêm một trình
thường trú, gọi là Driver-MPI. Nó gửi/nhận dữ liệu truyền theo đường mạng rồi chuyển
đến nơi qui định.
1.2 Khái niệm mạng ảo.
Mục đích của MPI là tạo ra một môi trường gửi-nhận dữ liệu thân thiện, cho phép
chúng ta soạn thảo và thử trình MPI chỉ trên một máy, để sau đó chạy nó trên một mạng
máy tính – có thể có cấu trúc rất phức tạp. Để làm việc này MPI cho phép mô phỏng một
mạng ảo chỉ trên một máy tính. Độc trình của chúng ta sẽ chạy trên các máy ảo này (vẫn
theo nguyên tắc trên mỗi máy chạy một trình). MPI bảo đảm để về mặt hình thức máy ảo
hoàn toàn tương đương với máy thật. Điểm lưu ý là các độc trình trên cùng một máy thật
thì dùng chung đĩa cứng.
Cho dù là trên cùng một máy, nhưng các độc trình không thể trực tiếp trao đổi dữ liệu
cho nhau (vì chúng chạy trên các máy ảo khác nhau). Hoàn toàn giống như các máy tính
độc lập trong mạng, các chúng chỉ có thể trao đổi dữ liệu với nhau thông qua môi trường
MPI.
Thông thường người ta viết và chạy thử trình trên một máy tính, khi ấy sẽ có sự phân
biệt giữa giữa trình và máy tính. Tuy nhiên, khi sử dụng trên một mạng gồm nhiều máy
tính thì, thường là, trên mỗi máy chỉ chạy có một trình. Vì vậy, mỗi khi không có khả
năng xảy ra nhầm lẫn, chúng ta sẽ dùng từ máy tính với hàm ý chỉ trình chạy trên nó.
1.3 Cấu trúc một trình MPI
Cấu trúc khái quát của một trình MPI chạy trên nhiều máy bao gồm 2 phần. Phần thứ
nhất là việc mỗi máy tự “nhận biết” đoạn trình mà mình cần thực hiện, và phần thứ hai là
thủ tục gửi-nhận dữ liệu cho nhau.
Sơ đồ như sau:
#include <stdlib.h>
#include <stdio.h>
#include <mpi.h>

main(int argc,char **argv)
{

if (MPI_Init(&argc, &argv) != MPI_SUCCESS) exit(1); /* Initialize MPI */
MPI_Comm_size( , &np );
MPI_Comm_rank( , &ip );

If (ip == me)
{
… do work-of-me …
}

MPI_Finalize(); exit(0); /* check-out */
}
Trong đó “np” là số lượng tiến trình, và “ip” là số hiệu của tiến trình hiện tại. Dựa
vào số hiệu “ip” mà ta biết được là phải thực hiện khúc lệnh nào.
1.4 Tuần tự hóa song song
Cho dù muốn hay không, thì vấn đề tuần tự hóa cũng xuất hiện khi các đối tượng hoạt
động song song cùng sử dụng chung một thiết bị, ví dụ như màn hình. Quá trình chuyển
từ song song sang tuần tự còn dính đến một vấn đề rắc rối là thứ tự trước sau. Ví dụ như
việc các máy tự tìm ra số hiệu của mình, rồi in ra trên màn hình (của máy số 0). Trên màn
hình, số hiệu có thể xuất hiện theo một thứ tự không thể đoán trước được, và điều này là
do giữa các máy không có một giao tiếp nào để định ra thứ tự in; và do chúng chạy song
song nên máy nào “may mắn” hơn thì sẽ in ra trước, máy nào “ít may mắn” hơn sẽ in ra
sau(!).
Để các máy có thể in số hiệu của mình theo thứ tự tăng dần, chúng ta cần phải có biện
pháp xử lý – biện pháp như thế được gọi là tuần tự hóa song song.
Có thể có 2 biện pháp:
1. Biện pháp thứ nhất là gọi tên. Theo cách này chúng ta bắt tất cả các máy phải
dừng lại trước “barrier” để chờ và chỉ máy nào được gọi tên thì mới được “đi qua”

để thực hiện công việc của mình.
2. Biện pháp thứ hai là “chuyền cờ”. Theo phương pháp này có một chiếc “cờ” được
chuyền từ máy này đến máy khác theo số hiệu tăng dần. Chỉ máy nào nhận được
cờ thì mới được thực hiện tiếp các lệnh của mình.
1.5 Các phương pháp gửi-nhận cơ bản
Bản chất của việc gửi dữ liệu từ một máy tính này sang một máy tính khác là việc
truyền một dãy xung điện qua dây dẫn. Xung điện này chuyển tải nội dung của một ô nhớ
đặc biệt – “port” của máy “A” sang “port” của máy “B”. Cùng lúc ấy một chương trình
chuyên dụng của máy “B” được kích hoạt để vận chuyển dữ liệu ấy tới nơi qui định. Như
vậy vào thời điểm máy “A” gửi dữ liệu thì máy “B” phải hoạt động. Trường hợp ngược
lại mà “B” vẫn muốn nhận được dữ liệu thì những dữ liệu ấy phải được một máy “C” nào
đó khác nhận vào hộ.
Về nguyên lý chỉ có thể có hai kiểu gửi-nhận:
1. Gửi trực tiếp – transient: “A” gửi, “B” nhận. Nếu “B” không nhận thì những dữ
liệu này sẽ bị mất.
2. Gửi gián tiếp – persistence: “A” gửi vào “C”, “B” nhận từ “C”. Máy “C” phải liên
tục hoạt động.
Mỗi kiểu gửi nói trên có thể được thực hiện theo một trong hai phương án sau:
1. Gửi không đồng bộ – asynchorous. “A” đẩy luôn dữ liệu cho “B” mà không cần
biết là “B” có nhận được dữ liệu không. Nếu B chưa sẵn sàng nhận thì dữ liệu sẽ
bị mất.
2. Gửi đồng bộ – synchronous. Trước khi gửi dữ liệu, thì “A” tự tạo ra và gửi tín hiệu
đồng bộ cho “B”. Các tín hiệu này có khuôn dạng nhất định và được gửi đi gửi lại
cho tới khi nào B nhận được mới thôi (như vậy nếu có mất thì không phải là mất
dữ liệu cần gửi mà chỉ là các tín hiệu đồng bộ). Tín hiệu đồng bộ hóa báo cho B
biết các thông tin cần thiết như dung lượng dữ liệu sẽ gửi cho nó. Khi “A” nhận
được tín hiệu hồi âm của B báo cho biết là B đang chờ để nhận dữ liệu do nó gửi,
“A” chuyển ngay khối dữ liệu ấy cho “B” – đủ dung lượng như đã thông báo. Về
nguyên tắc “A” được giải phóng ngay sau khi bắt đầu gửi (để đi thực hiện lệnh
khác,) nhưng vì việc gửi là việc của nó nên thời gian ấy cũng là thời gian mà nó

phải chờ. (Nếu “A” chờ cho tới khi “B” thông báo cho “A” biết là mình đã nhận
xong dữ liệu thì chúng ta gọi là gửi đồng bộ có bảo đảm.)
Đối với các tiến trình trên một máy tính (đơn xử lý hay đa xử lý) hay ở các máy tính
khác nhau trong một mạng thì việc gửi nhận dữ liệu cũng diễn ra tương tự như vậy, ngoại
trừ một điểm khác là toàn bộ quá trình gửi nhận do hệ điều hành MPI đảm nhận. MPI
phục vụ công việc gửi nhận cho nhiều tiến trình cùng một lúc.
Quá trình gửi-nhận của MPI được cải tiến theo cách cắt nhỏ dữ liệu cần chuyển ra
thành các khối nhỏ. Các khối này được chuyển, lần lượt lần lượt cho từng tiến trình
một (bằng cách làm này MPI tạo ra cảm giác là việc gửi-nhận giữa các tiến được thực
hiện song song). Để làm được việc này MPI cấp cho mỗi tiến trình một vùng đệm
(buffer). Vùng đệm này được gọi là vùng đệm hệ-thống, để phân biệt với vùng đệm tạm
do bản thân tiến trình tạo ra. Các khối dữ liệu cần chuyển được đưa vào vùng đệm.
Việc gửi nhận được chia làm hai công đoạn. Công đoạn từ các tiến trình ra tới vùng đệm,
và công việc luân chuyển dữ liệu giữa các vùng đệm.
Đối với công đoạn từ tiến trình ra đến vùng đệm, một tiến trình muốn gửi dữ liệu thì
nó phải thực hiện việc:
- Đóng gói dữ liệu thành các khối, mỗi khối có thông tin hệ thống – overhead, và
dữ liệu. Thông tin hệ thống gồm có địa chỉ và các chỉ thị cho MPI về qui trình gửi-
nhận.
- Chuyển các khối dữ liệu vừa đóng gói ấy ra vùng đệm. Nếu là gửi ra vùng đệm
tạm thì toàn bộ dữ liệu chỉ cần đóng thành 1 khối.
Một tiến trình muốn nhận dữ liệu về nó phải thực hiện việc:
- Copy khối dữ liệu từ vùng đệm hệ thống về.
- Tách dữ liệu từ các khối nhỏ này và kết hợp chúng lại với nhau.
Các tiến-trình không cần biết chi tiết về công đoạn luân chuyển dữ liệu giữa các vùng
đệm với nhau, chúng trao cho MPI quyền điều hành toàn bộ quá trình này thông qua các
thông tin overhead có ở trong các khối dữ liệu. Các thông tin này báo cho MPI biết là
phải làm gì với các khối dữ liệu ấy.
2. Một số hàm chính trong thư viện MPI
2.1. Lệnh MPI_Send.

Lệnh này dùng để gửi dữ liệu từ một máy này đến một máy khác. Lệnh MPI_Send chỉ
có thể kết thúc nếu khối dữ liệu được chuyển xong. Từ điều này suy ra rằng: máy “A” gửi
dữ liệu cho “B” thì “B” phải nhận vào đã nhận xong rồi, “B” mới có thể gửi cái gì đấy
lại cho “A”, nếu nó thật sự muốn gửi ngược lại cho “A”!
Điều này được minh họa trong sơ đồ sau.
Nếu máy “A” và “B” mỗi máy đều có dữ liệu để ở sendbuf của mình, và muốn truyền
chúng cho nhau. Qui trình chuyển diễn ra tuần tự như sau: “A” gửi dữ liệu cho “B”, “B”
nhận vào và để ở recvbuf trong máy của mình. Sau đó “B” chuyển dữ liệu của mình (để ở
sendbuf trong máy của “B”) cho “A”, và “A” lại nhận và để ở recvbuf trong máy của nó.
2.2 Lệnh MPI_Recv
Lệnh này dùng để nhận dữ liệu từ một tiến trình khác, ví dụ như tiến trình “A” nào đó,
gửi cho. Một khi chưa có dữ liệu, tức là “A” chưa thực hiên lệnh gửi dữ liệu MPI_Send
để gửi dữ liệu cho nó, thì nó sẽ phải chờ.
2.3. Lệnh MPI_Ssend
Lệnh MPI_Ssend gửi dữ liệu từ một tiến trình này đến một tiến trình khác.
Để thực hiện được công việc gửi bằng lệnh MPI_Ssend, trước hết tiến trình gửi – “A”
phát tín hiệu cho “B” thông báo là có một lượng dữ liệu cần gửi cho nó và xin phép gửi.
Tiến trình “A” sẽ phải chờ cho tới khi nào “B” gửi lại tín hiệu cho phép. Khi “A” nhận
được tính hiệu cho phép báo là “B” đang sẵn sàng nhận dữ liệu thì dòng dữ liệu được
truyền từ “A” sang “B”. Chỉ khi nào tiến trình “B” nhận xong dữ liệu thì lệnh gửi
MPI_Ssend của tiến trình “A” nới được coi là kết thúc. Và chỉ khi ấy các lệnh tiếp theo
sau lệnh gửi của “A” và lệnh nhận của “B” mới được xử lý.
So với lệnh gửi MPI_Send thì gửi bằng lệnh MPI_Ssend sẽ tiêu tốn thời gian hơn. Điều
này xảy ra là do quá trình đồng bộ hóa, tức là tiến trình gửi “A” chẳng những phải chờ để
được tiến trình nhận “B” cho phép, mà còn phải chờ tới thời điểm MPI chuyển được khối
dữ liệu vào vùng đệm hệ thống của “B”.
3. Chiến lược phân việc cho máy tính

Receiv β from
“1”

Send α to “1”

Receiv α from
“0”
Send β to “0”
Bản chất của việc tính toán song song là làm cho thời gian tính toán giảm đi. Việc này
được thực hiện thông qua việc sử dụng nhiều máy tính cùng thực hiện. Tuy nhiên, việc có
được nhiều máy tính mới chỉ là điều kiện cần, vấn đề là chúng ta phải biết cách phân phối
công việc cho chúng một cách hợp lý nhất. Có 2 phương án phân chia việc cho các máy,
theo “kế hoạch” và “đợi việc”. Cả hai phương án trên đều cần thiết và được áp dụng cho
các trường hợp khác nhau.
Phương án thứ nhất là phân phối theo kế hoạch. Theo phương án này công việc được
giao từ đầu theo năng lực tính toán. Phương án thứ hai thì các máy tính tranh nhau nhận
việc, làm xong lại đến nhận tiếp.
Phương án phân việc theo “kế hoạch” được sử dụng khi mà số lượng công việc ít,
nhưng mỗi việc đòi hỏi nhiều thời gian chạy máy; và hơn thế những việc ấy tương đối
khác nhau (chẳng hạn như cộng và nhân ma-trận là các việc rất khác nhau). Phương án
“xếp hàng” được sử dụng khi mà số lượng công việc rất nhiều, nhưng mỗi việc chỉ tốn ít
thời gian chạy máy; và hơn thế chúng nó đều là các việc tương tự như nhau.

×