Bài tập Chương 3 – Xử lýsongsongvàphântán Câu 3.1: Xác định sự phụ thuộc dữ liệu của các lệnh trong chu trình sau : Do i = 1 to N S1: e[i] = x[i] – z[i]; S2: a[i+1] = e[i] + 2*d[i]; S3: a[i] = e[i]; End DEF(S1) = {e[i]}; USE(S1) = {x[i], z[i]} DEF(S2) = {a[i+1]}; USE(S2) = {e[i], d[i]} DEF(S3) = {a[i]}; USE(S3) = {e[i]} Phụ thuộc dòng dữ liệu: DEF(S1) ∩ USE(S2) ≠ Ø DEF(S1) ∩ USE(S3) ≠ Ø Phụ thuộc dữ liệu ra: DEF(S2) ∩ DEF(S3) ≠ Ø Phụ thuộc dữ liệu vào: USE(S2) ∩ USE(S3) ≠ Ø Câu 3.2: Hai chu trình sau có tương đương về nội dụng tính toán hay không ? Hãy bình luận về khả năng thực hiện songsong của các chu trình đó. 1. Do i = 1 to N a[i] = a[i+1] + i; end 2. Do i = N downto 1 a[i] = a[i+1] + i; end Hai chu trình trên không tương đương về nội dung tính toán. Vì ở chu trình 1 khi tính a[i] ở bước thứ i không phụ thuộc vào giá trị a[i-1] của bước thứ i-1 trước đó. Trong khi ở chu trình 2 khi tính a[i] ở bước thứ i lại phụ thuộc vào giá trị a[i-1] của bước thứ i-1 trước đó. Cả hai chu trình trên dều có khả năng thực hiện song song, nhưng từ nhận xét trên ta nhận thấy khả năng thực hiện songsong cho chu trình 1 dễ dàng hơn so với chu trình 2. Hoàng Trần Thy Ngọc Trang 1 Đồ thị phụ thuộc dữ liệu S1 S3 S2 O |---| Bài tập Chương 3 – Xử lýsongsongvàphântán Câu 3.3: Xác định tất cả các sự phụ thuộc dữ liệu trong đoạn chương trình sau: int a[Max]; read(a); for(i = 0; i < N; i++) for(j = 0; j < i; j++){ S1: a[i] = max(a[i], a[j]); S2: a[j] = min(a[i], a[j]); } DEF(S1) = {a[i]}; USE(S1) = {a[i], a[j]} DEF(S1) = {a[j]}; USE(S1) = {a[i], a[j]} Phụ thuộc dòng dữ liệu: DEF(S1) ∩ USE(S2) ≠ Ø Phản phụ thuộc dữ liệu: DEF(S1) ∩ USE(S1) ≠ Ø DEF(S2) ∩ USE(S2) ≠ Ø DEF(S2) ∩ USE(S1) ≠ Ø Phụ thuộc dữ liệu ra: DEF(S2) ∩ DEF (S1) ≠ Ø Phụ thuộc dữ liệu vào: USE(S2) ∩ USE(S1) ≠ Ø Câu 3.4: Loại bỏ các phụ thuộc dữ liệu ra vàphản phụ thuộc dữ liệu của các chu trình sau. for(i = 0; i < N; i++){ x = a[i] + b[i]; y[i] = 2 * x; } Chu trình trên có thể được viết lại như sau để có thể loại bỏ phụ thuộc dữ liệuvàphản phụ thuộc dữ liệu for(i = 0; i < N; i++){ y[i] = 2 * (a[i] + b[i]); } Hoàng Trần Thy Ngọc Trang 2 S1 S2 O T / \ | Đồ thị phụ thuộc dữ liệu Bài tập Chương 3 – Xử lýsongsongvàphântán Câu 3.5: Phân tích đoạn chương trình sau, xác định các phụ thuộc dữ liệuvà vẽ đồ thị phụ thuộc dữ liệu của đoạn chương trình đó. S1: A = B + C; for(i = 0; i < N; i++){ S2: D[i] = A + b[i]); S3: S = b[i] * 5; S4: T = T + S; } DEF(S1) = {A}; USE(S1) = {B, C} DEF(S2) = {D[i]}; USE(S2) = {A, b[i]} DEF(S3) = {S}; USE(S3) = {b[i]} DEF(S4) = {T}; USE(S4) = {T, S} Phụ thuộc dòng dữ liệu: DEF(S1) ∩ USE(S2) ≠ Ø DEF(S3) ∩ USE(S4) ≠ Ø Phản phụ thuộc dữ liệu: DEF(S4) ∩ USE(S4) ≠ Ø Phụ thuộc dữ liệu vào: USE(S3) ∩ USE(S2) ≠ Ø Câu 3.5: Viết chương trình giải phương trình bậc 2 và vẽ đồ thị phụ thuộc dữ liệu của nó. S1: Read(a,b,c); If (a == 0){ S2: Write(‘Day khong phai phuong trinh bac 2’); }else{ S3: Deta = b*b - 4*a*c; If (deta < 0){ S4: Write(‘Phuong trinh vo nghiem’); }else{ S5: Write(‘Nghiem:’, (-b – sqrt(deta))/(2*a), (-b + sqrt(deta))/(2*a)); } Hoàng Trần Thy Ngọc Trang 3 S1 S3S2 T S4 ----- Đồ thị phụ thuộc dữ liệu Bài tập Chương 3 – Xử lýsongsongvàphântán } DEF(S1) = {a, b, c}; USE(S1) = Ø DEF(S2) = Ø; USE(S2) = Ø DEF(S3) = {deta}; USE(S3) = {a, b, c} DEF(S4) = Ø; USE(S4) = Ø DEF(S5) = Ø; USE(S5) = {deta, a, b, c} Phụ thuộc dòng dữ liệu: DEF(S1) ∩ USE(S3) ≠ Ø DEF(S1) ∩ USE(S5) ≠ Ø DEF(S3) ∩ USE(S5) ≠ Ø Phụ thuộc dữ liệu vào: USE(S5) ∩ USE(S3) ≠ Ø Phụ thuộc điều khiển dữ liệu: S2, S3 phụ thuộc vào S1 S4, S5 phụ thuộc vào S3 Hoàng Trần Thy Ngọc Trang 4 Đồ thị phụ thuộc dữ liệu S1 S3S2 S4S5 |----| . tập Chương 3 – Xử lý song song và phân tán Câu 3.5: Phân tích đoạn chương trình sau, xác định các phụ thuộc dữ liệu và vẽ đồ thị phụ thuộc dữ liệu của đoạn. Đồ thị phụ thuộc dữ liệu S1 S3 S2 O |---| Bài tập Chương 3 – Xử lý song song và phân tán Câu 3.3: Xác định tất cả các sự phụ thuộc dữ liệu trong đoạn chương