.8 Tạo cận dưới địa phương tổng quỏt cho bộ xử lý s

Một phần của tài liệu thiết kế nhân ma trận thưa với véctơ trong tính toán song song và ứng dụng (Trang 68 - 102)

Định lý 2.8 (Cận dưới 5): Cho tập cỏc cột đó sở hữu C(s) với mỗi bộ xử lý s cận dưới

tổng quỏt cho giỏ trị max(Nsend, Nreceive)sẽ là:

 ,  max / , ,

max Nsend NreceiveV Pa localgen (2.19) Trong đú localgen max0splocalgen(s).

Tớnh chất (i) sẽ cho cận dưới địa phương tổng quỏt, ngoại trừ c1c2 khụng nờn là cỏc cột đó sở hữu. Tớnh chất (ii) thỡ khụng thay đổi. Chứng minh phần này tương tự như chứng minh của cận dưới 3.

Vớ dự 2.5: Xột ma trận A~ trong vớ dụ 1, và tớnh cỏc cận dưới. Trước tiờn tớnh tổng số nhận và gửi của vớ dụ 1 cho ta ( ) 3 ( ) 12.

0 3 0   sNs ssNr s V P = 4 nờn V P/ 3. Bởi Input: C(t), 0 t P đó được phõn

Output: C(s) với cận dưới địa phương tổng quỏt

( ) ( ) \ t s ( )

C sB s  C t ;

while not marked

chọn jC(s) với k(j) nhỏ nhất  s j C s C( )  ; if Ns(s)Nr(s)then ) ( ) (s C s C   ; else )) ( ), ( max( ) (s Ns s Nr s localgen  ; marked

vỡ tất cả cỏc bộ xử lý khụng cú tập B(s) nào rỗng nờn chỳng ta cú Pa = 4, do đú

V /Pa3.

Để tớnh cận dưới địa phương local chỳng ta phải tớnh bốn giỏ trị local(s) của bốn bộ

xử lý. Sử dụng thuật toỏn 2.6: Tớnh C(0), trước tiờn cú Nr(0) = |B(0)| = 4, C(0) = , C(0)3, 4,5,9, chọn j = 3, Ns = k(3) – 1 = 1, Nr = 4 - 1 = 3, Ns <Nr => C(0) = {3}. chọn j = 9, Ns = 2, Nr = 2 => Kết thỳc C(0) = {3, 9}. Tương tự cho cỏc bộ xử lý khỏc, ta cú: C(0) ={3,9}Ns(0) = 2, Nr(0) = 2 local(0) = 2 C(1) ={3,8}Ns(1) = 2, Nr(1) = 4 local(1) = 4 C(2) ={0}Ns(0) = 2, Nr(2) = 2 local(2) = 2 C(3) ={8,9}Ns(0) = 2, Nr(3) = 2 local(3) = 4

Bởi vậy local = 4. Giỏ trị này cho ta cận dưới 4: maxV/Pa,local4. Lưu ý cỏc tập

C(s) cú thể chứa cỏc cột khỏc nhau, nhưng Ns(s) và Nr(s) là xỏc định.

Sử dụng thuật toỏn 2.8 để tớnh cận dưới địa phương tổng quỏt localgen trong trường hợp C(0) = {3}, C(1) = {8}, C(2) = {4} và C(3) = {9}, chỳng ta cú thể cú được:

Tớnh cho C(1), khởi tạo C(1) = {8}, Ns(1) = k(1) – 1 = 0, Nr(1) = |B(1)| - |C(1)| = 5,

  (1) (1) (0, 2,3) 0,5, 6 CBC  ta cú: chọn j = 0, Ns(1) = 2, Nr(1) = 2 => dừng, C(1) = {8, 0}. Tương tự cho cỏc bộ xử lý khỏc, ta cú: C(0) ={3}Ns(0) = 1, Nr(0) = 3 local(0) = 3

C(1) ={8,0}Ns(1) = 3, Nr(1) = 4 local(1) = 4 C(2) ={4}Ns(0) = 3, Nr(2) = 2 local(2) = 3 C(3) ={9,5}Ns(0) = 3, Nr(3) = 4 local(3) = 4.

Vậy localgen = 4 và cận dưới 5 bằng 4.

2.2.3.2 Phõn phối cỏc vộc tơ độc lập

Trong phần này thực hiện phõn phối cỏc thành phần vộc tơ của v và u cho cỏc bộ xử lý, ở đõy cỏc thành phần vi ui cú thể được phõn cho cỏc bộ xử lý khỏc nhau. Bởi vậy cỏc phõn phối của u và v cú thể là khụng đồng thời. Cú nghĩa rằng chỳng ta cú thể phõn phối v và u một cỏch độc lập.

Thực tế cho thấy, bộ xử lý mà đạt số truyền thụng cực đại max(Nsend, Nreceive), bộ xử lý pmax, sở hữu nhiều cột hơn. Chẳng hạn số cỏc cột với k(c) = 2 là nhiều hơn và số cỏc cột với k(c) = 10 là ớt hơn. Sẽ là cú lợi nếu đảm bảo rằng cỏc bộ xử lý mà cú xu hướng trở thành pmax sở hữu cỏc cột rẻ hơn (ớt bộ xử lý trờn nú). Điều này cú thể được thực hiện bằng thuật toỏn sử dụng giỏ trị biờn địa phương, bởi vỡ giỏ trị biờn địa phương này xem xột trước tiờn cỏc cột rẻ nhất. Trực giỏc cho ta thấy rằng cỏc bộ xử lý với giỏ trị biờn địa phương cao thường dễ trở thành pmax hơn cỏc bộ xử lý cú giỏ trị thấp hơn. Nếu một thuật toỏn cú thể tớnh giỏ trị biờn địa phương trước, và rồi phõn từng cột rẻ nhất cho bộ xử lý với giỏ trị biờn địa phương local(s) cao nhất lỳc đú, như thế cú thể trỏnh được phõn phối xấu.

a) Thuật toỏn biờn địa phƣơng

Thuật toỏn biờn địa phương (LA), thuật toỏn 2.9, được chia làm hai pha. Pha thứ nhất được gọi là phần biờn địa phương thực tế và pha thứ hai kết thỳc phõn phối theo cỏch tham lam. Để thuật toỏn làm việc, chỳng ta cần giỏ trị cận dưới địa phương tổng quỏt thể hiện cận dưới địa phương thời điểm hiện tại. Giỏ trị này cú thể điều chỉnh trong quỏ trỡnh

chạy thuật toỏn. Cận dưới địa phương tổng quỏt của bộ xử lý s được gọi là L(s). Trong

thuật toỏn này chỳng ta sẽ cú thờm cỏc định nghĩa sau:

C(s) là tập cỏc cột đang sở hữu bởi s, C(s)B(s).

) (s

C là tập cỏc cột thuộc B(s) hiện tại khụng được sở hữu bởi s.

CL(s) là tập cỏc cột mà s sẽ đạt cận dưới địa phương tổng quỏt.

Ls(s) = cC  s     L c k 1 . Lr(s) = |B(s)| - |CL(s)|. L(s) = max(Ls(s), Lr(s)).

Trong quỏ trỡnh thực thi thuật toỏn khi CL(s) được điều chỉnh thỡ cỏc biến Ls(s), Lr(s)

L(s) cũng được điều chỉnh dựa trờn cỏc định nghĩa của chỳng. Và khi C(s) thay đổi,

) (s

C , Ns(s) và Nr(s) cũng thay đổi.

Trong thuật toỏn 2.9, pha 1:

Bước 1, tất cả cỏc giỏ trị được khởi tạo.

Bước 2, bộ xử lý được chọn là bộ xử lý mà chưa đạt đến cận dưới địa phương L(s) của nú và cú L(s) cao nhất, bởi vỡ bộ xử lý này được mong đợi ở thời điểm đú trở thành

pmax dựa vào thử sai biờn địa phương.

Bước 3, cột chưa được sở hữu mà rẻ nhất trong CL(p) được phõn cho bộ xử lý p, bởi

vậy C(p) vẫn thoả món (i).

Bước 4, cột c phải được gỡ bỏ khỏi CL(q), với qp, bởi vỡ cột này đó được sở hữu bởi bộ xử lý khỏc (gọi là p), vỡ vậy CL(q) phải được tớnh lại.

Từ bước 2 tới 4 được lặp lại cho tới khi Ls(s) = Ns(s) với mọi bộ xử lý. Một bộ xử lý

max(Ns(s),Nr(s)) và cú thể tăng max(Ns(q),Nr(q)) với một vài bộ xử lý q khỏc. Bởi vỡ q

cú thể cần cỏc cột này để đạt được cận dưới địa phương tổng quỏt.

Thuật toỏn 2.9 Thuật toỏn biờn địa phương (LA)

Trong pha 2, cỏc cột cũn lại sẽ được phõn:

Bước 1 của pha 2, cỏc cột mà làm tăng số truyền thụng sẽ được phõn bố tham lam thoả món max(Nsend, Nreceive)là nhỏ nhất.

Input: Ma trận thưa A cấp mn phõn phối trờn P bộ xử lý, vộc tơ v độ dài n. Output: Vộc tơ v được phõn cho P bộ xử lý.

Pha 1:

1. Khởi tạo CL(s) và C(s) = với mọi bộ xử lý s.

2. Chọn bộ xử lý cú giỏ trị biờn địa phương L(s) lớn nhất từ cỏc bộ xử lý cũn thoả món Ls(s) > Ns(s). Gọi bộ xử lý này là p.

3. Chọn một cột chưa được sở hữu cCL(p) cú số bộ xử lý trờn nú nhỏ nhất và thờm c vào C(p).

4. Cập nhật lại cỏc CL(s).

5. Lặp lại bước 2 đến 4 cho tới khi Ls(s) = Ns(s) (và CL(s) = C(s)) cho tất cả

cỏc bộ xử lý. Pha 2:

1. Với mỗi cột c chưa được sở hữu cú k(c)1, thờm c vào C(p), p xử lý trờn c cú max(Ns(p) + k(c) – 1, Nr(p) - 1) là nhỏ nhất.

2. Với mỗi cột c mà k(c) = 0, thờm c vào C(p), ở đõy p là bộ xử lý cú |C(p)| là nhỏ nhất.

Bước 2 cỏc cột mà khụng cú bộ xử lý trờn nú thỡ được phõn cho bộ xử lý mà cú số cột được phõn là ớt nhất.

b) Cài đặt

Phần này sẽ đưa ra một vài chi tiết cài đặt của thuật toỏn biờn địa phương, thuật toỏn này cú độ phức tạp thời gian là O(nz+P2

).

Trong mỗi lần lặp của bước 2 trong pha 1, thời gian cho tỡm kiếm bộ xử lý cú L(s) lớn nhất mất O(P) thời gian, với n vũng lặp mất O(n.P) thời gian nếu cài đặt trực tiếp.

Tuy nhiờn cú thể thực hiện chỉ với O(nz + P2) thời gian. Trong khi ở vũng lặp đầu tiờn,

việc tỡm kiếm cho bộ xử lý cú L(s) lớn nhất mất O(P) thời gian. Trong khi lặp cú nhiều nhất k(c) – 1 giỏ trị L(s) được tăng trong bước 4. Cỏc giỏ trị L(s) khỏc cũn lại là như nhau. Chỳng ta chỉ so sỏnh k(c) – 1 giỏ trị được tăng này xem cú lớn hơn L(p). Sau khi so sỏnh

bộ xử lý mà L(s) là lớn nhất sẽ là bộ xử lý p cú một cột trong vũng lặp tiếp theo. Tuy

nhiờn, nếu Ls(p) = Ns(p) thỡ p đó bị loại từ pha 1 và chỳng ta lại phải tỡm từ cỏc bộ xử lý cũn lại mà cú L(s) lớn nhất, ở đõy mất O(P) thời gian. Vỡ vậy, với n vũng lặp chỳng ta

phải thực hiện 1    0 1 ( ) n c k c nz n nz       

 phộp so sỏnh và tỡm kiếm P lần mất O(P2) thời

gian.

Trong bước 4 của pha 1, việc khởi tạo CL s hoàn toàn từ đầu sẽ mất O(n) thời gian. Thay vỡ vậy, chỳng ta cú thể gỡ bỏ cột c khỏi CL s và thờm một cột chưa được sở hữu c0 từ C s( )vào CL s mà vẫn thoả món (i) và (ii). Điều này cú nghĩa rằng CL s chỉ điều chỉnh lại mà khụng phải là khởi tạo hoàn toàn, và vỡ vậy sẽ mất ớt thời gian hơn.

Nếu trong bước 3 của pha 1, cỏc cột của CL p được sắp xếp lại theo tăng dần số bộ xử lý, việc chọn cột c sẽ mất O(1) thời gian nhưng việc sắp xếp này phải duy trỡ tới khi cỏc cột mới được thờm vào CL p trong bước 4 cỏi này mất nhiều hơn O(1) thời gian.

Thay vỡ chọn một cột chưa được sở hữu từ CL p được sắp, chỳng ta chọn một cột chưa được sở hữu từ tập B(p) được sắp, bởi vỡ B(p) là khụng thay đổi. Việc sử dụng B(p) thay

vỡ CL p trong bước 3, tuy nhiờn sẽ gõy cho thuật toỏn một số trường hợp khi thờm một cột vào C(s) nhưng cột này lại khụng thuộc CL s . Đú là bởi vỡ cận dưới địa phương tổng quỏt khụng quan tõm xem cột cú k(c) bộ xử lý nào mà chỉ cần biết là cú k(c) bộ xử lý trờn nú. Vỡ vậy thay vỡ lưu giữ một danh sỏch CL s cỏc cột mà bộ xử lý cần để đạt đến cận dưới địa phương tổng quỏt của nú, chỳng ta lưu giữ cỏc giỏ trị needed(s,a), và để điều

chỉnh cỏc giỏ trị một cỏch thớch đỏng, cỏc giỏ trị avail(s,a) được lưu. Ta cú cỏc định nghĩa như sau:

C(s,a): là tập cỏc cột cC s với k(c) = a.

( , )

C s a : là số cỏc cột chưa sở hữu cC s( )với k(c) = a.

ee ( , )

n ded s a : lỏ số cỏc cột cC sL( )mà k(c) = a. ( , ) : ( , ) ( , ).

avail s a C s aC s a

Với lưu ý rằng, C s a( , )n ded s aee ( , )avail s a( , ),

2 ( ) ( 1) ee ( , ) P a Ls s a n ded s a    và 2 ( ) ( ) ee ( , ). P a Lr s B s n ded s a

  Và C s a( , )xỏc định theo nghĩa „chưa được sở hữu‟. Cú nghĩa là một cột c mà k(c) = a được sở hữu bởi một bộ xử lý khỏc s mà được xử lý trờn tập C s( ) nhưng khụng thuộc tập C s a( , )(bởi vỡ nú khụng phải là chưa được sở hữu).

Chỳng ta sử dụng cỏc biến needed và avail trong cỏc bước 3 và 4. Trong bước 3,

một cột chưa được sở hữu c sẽ được chọn từ B(p). Cột c cũng xử lý trong C s k c( , ( )) cho mọi bộ xử lý s mà xử lý trờn c. Bởi vỡ bộ xử lý p sẽ sở hữu cột c, cột c sẽ bị gỡ bỏ khỏi

( , ( ))

C p k c và thờm vào C(p,k(c)), bởi vậy avail(p,k(c)) là khụng thay đổi. Trong bước 4,

với tất cả cỏc bộ xử lý khỏc mà xử lý c và sẽ khụng xử lý c, c cũng sẽ gỡ bỏ khỏi

( , ( ))

C s k c nhưng khụng thờm vào C(s,k(c)), bởi vậy cỏc bộ xử lý này avail(s,k(c)) là nhỏ hơn 1 giỏ trị. Tức là gõy nờn needed(s,k(c)) > avail(s,k(c)). Điều này cú nghĩa là CL(s) của

cỏc bộ xử lý mà khụng nhận được cột c là dựa trờn sự mong đợi cú đủ cỏc cột cú k(c) bộ xử lý trong khi thực sự là khụng đủ. Để giải quyết sự khụng thống nhất này chỳng ta phải trừ needed(s,k(c)) đi 1, cỏi này tương ứng với việc di chuyển cột c khỏi CL(s). Khi cỏc cột

di chuyển khỏi CL(s), cỏc cột khỏc cú thể phải thờm lại vào CL(s) để thoả món (ii). Chỉ cỏc

cột mà ở trong C s a( , )cú thể thờm vào CL(s), với 2 a P. Bởi vỡ tớnh chất (i) sẽ phải được thoả món, chỳng ta phải tỡm giỏ trị nhỏ nhất a mà needed(s,a) < avail(s,k(c)). Như vậy cũng cú nghĩa rằng khụng phải tất cả cỏc cột từ C s a( , ) cú thể thờm vào CL(s). Nếu

chỳng ta tỡm thấy một C s a( , )chỳng ta tăng needed(s,a) thờm một, tương ứng với thờm

một cột vào CL(s) mà cú bộ xử lý trờn nú. Bõy giờ CL(s) thoả món (i) và (ii) và cũng là

cận dưới địa phương tổng quỏt.

Giỏ trị nhỏ nhất mà thoả món needed(s,a) < avail(s,a) cú thể chỉ tăng trong quỏ trỡnh chạy thuật toỏn, bởi vỡ khi needed(s,a) bị giảm thỡ avail(s,a) cũng bị giảm, và avail(s,a)

khụng tăng trong khi chạy thuật toỏn, với mọi s và a. Bởi vậy khi chỳng ta tỡm được một giỏ trị thấp nhất thoả needed(s,a) < avail(s,a) cho bộ xử lý s, chỳng ta sử dụng giỏ trị

trước của a, gọi là aprev, mà thoả món needed(s,aprev) < avail(s,aprev), và tăng aprev

thờm 1 nếu needed(s,aprev) = avail(s,aprev) cho tới khi needed(s,aprev) < avail(s,aprev)

hoặc aprev = P. Bởi vậy aprev tăng nhiều nhất P lần. Bởi vỡ chỳng ta tỡm kiếm trong cỏc tập C s aprev( , ) với 0aprevP, C s( , 0)0 và C s( ,1)0, aprev được thiết lặp bằng 2

trong quỏ trỡnh khởi tạo. Lưu ý rằng, khi needed(q, k(c)) tăng hoặc giảm, thỡ Ls(q), Lr(q) và L(q) sẽ được điều chỉnh dựa theo định nghĩa của chỳng.

Trong bước 2 của pha 2, nhiều nhất là n lần, mỗi lần |C(s)| là nhỏ nhất, nờn sẽ mất O(n.P) thời gian. Thay vỡ, chỳng ta sắp xếp cỏc bộ xử lý tăng dần theo |C(s)|:

 0  1 ...  p 1 .

C pC p   C p  Thỡ, chỳng ta sẽ phõn cỏc cột c mà k(c) = 0 cho bộ xử lý

p0 cho tới khi C p 0  C p 1 . Rồi, chỳng ta lại phõn cỏc cột cho p0p1 cho tới khi

 0  1  2 ,...

C pC pC p cho tới khi tất cả cỏc cột c với k(c) = 0 được phõn. Bởi vỡ cú nhiều nhất n lần phõn, bước 3 của pha 2 mất O(n + P.log P) thời gian.

Cấu trỳc dữ liệu cho thuật toỏn biờn địa phương như sau: Cấu trỳc của cột c: owner(c) procindex(c)[] k(c) Cấu trỳc bộ xử lý s: Ns(s), Nr(s), Nvecto(s) B(s)[], nB(s), Bcount(s) Ls(s), Lr(s), L(s)

needed(s), avail(s)[], aprev(s)

Ở đõy, owner(c) là chỉ số của bộ xử lý mà sở hữu cột c, procindex(c)[] là mảng lưu

tất cả cỏc chỉ số của bộ xử lý mà xử lý cột c, và k(c) là số bộ xử lý trờn cột c, bởi vậy procindex(c)[] độ dài k(c). Nvecto(s) lưu số thành phần vộc tơ sở hữu bởi bộ xử lý s

(Nvecto(s) = |C(s)|). Mảng B(s)[] độ dài nB(s) và lưu tất cả cỏc chỉ số của cột c với

2 ) (c

k mà bộ xử lý s xử lý trờn đú, nB(s) = |B(s)| và Bcount(s) = i cú nghĩa B(s)[i] là cột sau khi phõn cho bộ xử lý s. Cỏc mảng avail(s)[] và needed(s)[] cú độ dài P + 1.

c) Đỏnh giỏ thuật toỏn

Thời gian

Pha 1:

Bước 1, chỳng ta phải khởi tạo procindex(c)[], B(s)[], avail(s)[] và needed(s)[] cho mọi bộ xử lý s, ở đõy sẽ mất O(nz) thời gian.

Bước 2, như trỡnh bày ở phần trước, mất O(nz+P2) thời gian.

Bước 3, chỳng ta phải kiểm tra mỗi phần tử B(s)[] của mỗi bộ xử lý một lần, ở đõy

đó sắp thứ tự. Việc phõn cột và tăng số gửi và số nhận cũng chỉ mất O(nz) thời gian cho n vũng lặp.

Bước 4, vũng lặp for chạy nhiều nhất là nz lần trong n lần lặp. Vỡ vậy, vũng lặp while mất nhiều nhất O(nz + P2) khi cỏc giỏ trị aprev(q) chỉ tăng. Túm lại bước 4 mất O(nz+P2).

Pha 2:

Bước 1 mất O(nz) thời gian bởi vỡ nhiều nhất n cột cú thể được phõn, tức là tất cả nz phần tử khỏc khụng sẽ phải được kiểm tra.

Bước 2, như trỡnh bày ở phần trờn, sẽ mất O(n+P.log P) thời gian. Như vậy toàn bộ thuật toỏn mất O(nz+P2) thời gian nếu n < nz.

Bộ nhớ

Tất cả n mảng procindex(c)[] sử dụng O(nz) bộ nhớ, P mảng B(s)[] cũng vậy. Cỏc mảng needed(s)[] và avail(s)[] mất O(P2) bộ nhớ. Như vậy bộ nhớ cho thuật này

cũng là O(nz + P2).

2.2.3.3 Phõn phối cỏc vộc tơ đồng thời

Ở đõy xột cho trường hợp ma trận vuụng, cỏc thành phần của hai vộc tơ ui và vi được phõn cho cựng bộ xử lý. Ta núi phõn phối của hai vộc tơ u và v là đồng thời.

a) Thuật toỏn biờn địa phƣơng

Mục tiờu ở đõy là cực tiểu hoỏ max(Nsendr,Nreceiver)+max(Nsendc,Nreceivec), ở

đõy „r‟ và „c‟ cú nghĩa chỉ hàng và cột tương ứng. Và trong thuật toỏn này cũng cú một số thay đổi. Thay vỡ phõn một cột cho một bộ xử lý thỡ chỳng ta sẽ phõn một cặp gồm hàng i và cột i cho một bộ xử lý và ta gọi là cặp rowcol. Thay vỡ giỏ trị L(s) thỡ sẽ cần cỏc giỏ trị

1. Chỳng ta muốn tỡm bộ xử lý cú biờn địa phương cao nhất, nhưng bộ xử lý cú Lr(s)

cao nhất và bộ xử lý cú Lc(s) cao nhất cú thể khụng cựng một bộ xử lý.

2. Chỳng ta muốn tỡm cặp rowcol cú số bộ xử lý trờn nú là ớt nhất. Nhưng số bộ xử lý trong một cặp rowcol là khụng xỏc định.

3. Với hai tiờu chớ Lsendr = Nsr(s) hay Lsendc = Nsc(s).

Cho vấn đề 1, cú thể sử dụng giỏ trị địa phương trung bỡnh của cỏc giỏ trị địa phương hàng và cột. Tuy nhiờn cú thể sử dụng giỏ trị cao nhất trong Lr(s) và Lc(s). Vấn đề

thứ hai, xỏc định số bộ xử lý trong cặp rowcol là kr(c) + kc(c). Và vẫn đề thứ ba cú thể bỏ

qua vỡ giải phỏp giảm nhẹ tiờu chớ, chỉ ỏp dụng cả hai tiờu chớ với một bộ xử lý thỡ như vậy cú thể cho kết quả khụng tốt. Một số định nghĩa như sau:

cs

a

~ = 1 nếu bộ xử lý s sở hữu ớt nhất một phần tử khỏc khụng trong hàng c, và a~cs=

Một phần của tài liệu thiết kế nhân ma trận thưa với véctơ trong tính toán song song và ứng dụng (Trang 68 - 102)