Luận văn nghiên cứu các kiến trúc của máy tính song song, các mô hình và các thuật toán trong xử lý song song,

95 3.1K 14
Luận văn nghiên cứu các kiến trúc của máy tính song song, các mô hình và các thuật toán trong xử lý song song,

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ột bộ xử lý và thời điểm kết thúc của các bộ xử lý đối với bộ dữ liệu vào bất kỳ. Có hai loại thao tác khác nhau trong các thuật toán song song: Các phép toán cơ sở như +, -, *, /, AND, OR, v.v. Các phép toán truyền dữ liệu trên các kênh truyền. Độ phức tạp thời gian của thuật toán song song được xác định bởi số các phép toán cơ sở và số các bước truyền tải dữ liệu giữa các bộ xử lý với nhau. Từ đó suy ra, độ phức tạp thời gian của thuật toán song song không chỉ phụ thuộc vào mô hình tính toán mà còn phụ thuộc vào số bộ xử lý được sử dụng. Nói chung, chương trình tính toán song song thường bắt đầu bằng việc nhập dữ liệu vào bộ nhớ và kích hoạt một phần tử xử lý. Mỗi bước tính toán, phần tử xử lý này có thể đọc một số dữ liệu từ bộ nhớ, thực hiện một số phép toán cơ sở và ghi kết quả vào bộ nhớ riêng hoặc bộ nhớ chung. Đồng thời mỗi bước tính toán, một phần tử xử lý có thể kích hoạt một hay một số phần tử xử lý khác. Thực tế thì các máy tính đều có số bộ xử lý là hữu hạn, nên những thuật toán song song không bị giới hạn chỉ có nghĩa sử dụng khi chúng có thể chuyển đổi về thuật toán song song bị giới hạn. Có ba cách định nghĩa khái niệm [20] liên quan đến độ phức tạp của thuật toán song song: Định nghĩa 1: Một thuật toán song song có độ phức tạp tính toán O(T) với P bộ xử lý khi nó thực hiện nhiều nhất là O(T* P) phép toán cơ sở (định lý Brent). Định nghĩa 2: Một thuật toán song song có độ phức tạp tính toán O(T) sử dụng rất nhiều bộ xử lý để thực hiện O(e) phép toán cơ sở khi cài đặt với P bộ xử lý thì sẽ có độ phức tạp thời gian là O(ée/Pù + T). Định nghĩa 3: Một thuật toán song song có độ phức tạp tính toán O(T) với P bộ xử lý có thể cài đặt với éP/pù , 1≤ p ≤ P bộ xử lý thì sẽ có độ phức tạp thời gian là O(p*T). Định nghĩa 2 chỉ ra rằng khi số bộ xử lý được sử dụng giảm xuống trong một phạm vi nhất định thì thuật toán tiếp tục làm việc nhưng thời gian thực hiện sẽ tăng lên. Định nghĩa 3 khẳng định rằng có cách để cài đặt thuật toán song song khi số các bộ xử lý được sử dụng bị giảm xuống. Mức độ hiệu quả của thuật toán được thể hiện ở mức độ song song của thuật toán. Mức độ song song của thuật toán là số lượng cực đại các phép toán độc lập có thể thực hiện đồng thời ở mỗi thời điểm thực hiện của thuật toán. Ký hiệu P(W) là độ song song của thuật toán, thì thuật toán hiệu quả để giải bài toán có cỡ W là những thuật toán chỉ cần sử dụng nhiều nhất P(W) bộ xử lý. Ngoài ra, để đánh giá được thuật toán song song chúng ta còn phải xét tới hệ số gia tốc của nó. Hệ số gia tốc của thuật toán song song sử dụng p bộ xử lý được xác định như sau: Sp = TS / Tp Trong đó, + TS là thời gian thực hiện tính toán trên một bộ xử lý + Tp là thời gian thực hiện tính toán trên p bộ xử lý. Với giả thiết là bộ xử lý tuần tự và bộ xử lý song song là như nhau. II.2 Các mô hình lập trình song song II.2.1 Lập trình chia sẻ bộ nhớ Giả thiết rằng chúng ta có một hệ thống đa bộ xử lý đối xứng SMP. Đó là hệ thống trong đó tất cả các bộ xử lý là như nhau, không có những bộ xử lý đặc biệt để xử lý vào/ra, cũng không có bộ xử lý được gán cho nhiệm vụ đặc biệt nào khác. Đây là mô hình chung cho các hệ thống đa xử lý. Để nghiên cứu về song song, chúng ta không nhất thiết phải có hệ đa bộ xử lý vật lý. Trong môi trường UNIX, chúng ta có thể tạo ra nhiều tiến trình khác nhau trong hệ thống và chúng được sử dụng để mô phỏng lập trình đa bộ xử lý. Hệ thống UNIX cung cấp những đặc tính như tín hiệu điều khiển Semaphore và bộ nhớ chia sẻ (bộ nhớ có thể chia sẻ cho các tiến trình khác nhau) [14] để các tiến trình có thể xử lý song song như chúng ta cần. Song, tốc độ xử lý bài toán khi chạy chương trình thì không tăng tốc được như mong muốn. Một vấn đề quan trọng cần xem xét khi xử lý song song là cần bao nhiểu nút (bộ xử lý, tiến trình) để chương trình song song thực hiện hiệu quả nhất? Nhiều chương trình được xây dựng phụ thuộc vào một cấu hình xác định. Nói chung, loại chương trình phụ thuộc như vậy là không tốt, vì khi một bộ xử lý bận thì có thể thay đổi chương trình hoặc chờ để bộ xử lý đó quay lại. Trong những hệ thống đa nhiệm như UNIX, số bộ xử lý và số các tiến trình không nhất thiết phải bằng nhau. Hầu hết các hệ UNIX đều cho phép tạo ra một số các tiến trình bất kỳ và chúng được lập lịch cho những bộ xử lý thích hợp (sẵn sàng thực hiện chúng). Như vậy, về nguyên tắc, chương trình là tập các tiến trình và việc viết chương trình là độc lập với các bộ xử lý, việc phân chia các tiến trình cho các bộ xử lý là công việc của hệ điều hành. Tất nhiên vấn đề lập lịch trong hệ thống đa nhiệm là bài toán khó và chúng ta không thảo luận ở đây. Trong lập trình thủ tục tuần tự (như với C, Pascal, Fortran), ta có thể mô hình lời giải một cách độc lập với các ngôn ngữ lập trình. Hầu hết các thuật toán đều dễ dàng cài đặt trên nhiều ngôn ngữ lập trình khác nhau. Điều này thực hiện được bởi hầu hết các ngôn ngữ lập trình thủ tục đều sử dụng những lệnh, cấu trúc điều khiển chuẩn như lệnh gán, rẽ nhánh if-then, các cấu trúc lặp (for, while, repeat), v.v. Tương tự như thế có thể nghĩ về các thành phần tổng quát của lập trình song song trong hệ thống bộ nhớ chia sẻ. Trong môi trường lập trình chia sẻ bộ nhớ có hai ràng buộc quan trọng như sau: Một tiến trình có thể chờ một khoảng thời gian bất kỳ giữa hai lệnh cần thực hiện. Giả sử bộ xử lý P thực hiện một chương trình có một 100 lệnh, bộ xử lý Q thực hiện chương trình có 10 lệnh và cùng bắt đầu thực hiện đồng thời. Thậm chí, tất các lệnh có tốc độ thực hiện như nhau cũng không thể nói rằng Q sẽ kết thúc trước P. (ii) Không thể xem các lệnh thực hiện là nguyên tố ở mức các ngôn ngữ lập trình. Ví dụ, một lệnh đơn giản như: a = a + 1 sẽ là một dãy từ một đến bốn lệnh trong ngôn ngữ máy. Mà ta cũng biết rằng, các tiến trình và hệ điều hành chỉ nhận biết được các câu lệnh của ngôn ngữ máy. II.2.1.1 Lập trình chia sẻ bộ nhớ dựa vào tiến trình Tạo lập và huỷ bỏ tiến trình Yêu cầu đầu tiên của xử lý song song là khả năng tạo ra một số các tiến trình cần thiết cho bài toán. Tương tự là khả năng huỷ bỏ chúng khi phần việc xử lý song song kết thúc để giải phóng các tài nguyên mà các tiến trình đã chiếm giữ và không cản trở hoạt động của những tiến trình khác. Để thêm N tiến trình, chúng ta viết: id = create_process(N); Lệnh này tạo thêm N tiến trình và một tiến trình cha nữa để thực hiện câu lệnh đó, kết quả là có N+1 tiến trình như nhau được tạo ra và mỗi giá trị của id được gán tương ứng cho một tiến trình. Sử dụng những tiến trình đã được tạo ra chúng ta có thể viết chương trình song song dạng: id = create_process(N); switch(id){ case 0: … do NhiemVu0 …; break; case 1: … do NhiemVu1 …; break; case 2: … do NhiemVu2 …; break; . . . case N: … do NhiemVuN …; break; } Sau khi những công việc trên thực hiện xong, chúng ta muốn một tiến trình (như một tiến trình chủ) tiếp tục thực hiện những phần việc tuần tự còn lại, còn những tiến trình khác kết thúc. Khi đó chúng ta viết join_process(N, id); Chỉ tiến trình tương ứng với giá trị id còn tiếp tục hoạt động, những tiến trình là kết thúc sau lời gọi hàm trên. Nếu ta đặt sau nó một câu lệnh thì: Lệnh này sẽ không được thực hiện cho đến khi tất cả các tiến trình đều thực hiện join_process(). Sau đó chỉ còn lại một tiến trình hoạt động, do vậy vấn đề xử lý song song không xuất hiện mà là xử lý tuần tự. Vấn đề là khả năng các tiến trình được tạo lập nhìn thấy dữ liệu của nhau như thế nào? Một mặt một tiến trình có thể muốn giữ một phần dữ liệu cục bộ cho riêng mình, không cho những tiến trình khác nhìn thấy/truy cập tới những dữ liệu đó. Mặt khác, nó cũng muốn trao đổi thông tin với các tiến trình khác. Xử lý vấn đề che giấu hay chia sẻ thông tin như thế nào còn tuỳ thuộc vào mô hình mà chúng ta áp dụng, dựa vào tiến trình hay luồng. Các tiến trình trong UNIX được sử dụng như các đơn vị tính toán độc lập, theo mặc định, việc tính toán và cập nhật bộ nhớ của một tiến trình không là không nhìn thấy được bởi các tiến trình khác. Đối với các luồng, tất cả các thông tin, theo mặc định, là nhìn thấy được. Do vậy, trong mô hình này cần phải cố gắng rất nhiều để che giấu thông tin. Bây giờ chúng ta xét một số hàm điều phối vấn đề chia sẻ bộ nhớ. Khi muốn sử dụng bộ nhớ chung, ta cần phải xin cấp phát bộ nhớ và sau khi sử dụng xong phải giải phóng chúng. Người lập trình phải có trách nhiệm giải phóng bộ nhớ chia sẻ một cách tường minh khi chúng không còn cần thiết sử dụng. Có hai hàm cơ sở: shared(m, &id): giống như malloc(), nhưng cấp phát m byte bộ nhớ chia sẻ cho tiến trình id. free_shm(): giải phóng bộ nhớ đã được cấp. Ví dụ: Bài toán loại trừ nhau. Trước tiên chúng ta xét đoạn chương trình sau: main(){ int id, sid, *i, j; i = (int*)shared(sizeof(int), &sid); *i = 100; j = 100; printf(“Before fork: %d, %d”, *i, j); id = create_process(2); *i = id; j = id * 2; // (1) printf(“After fork: &d, %d”, *i, j);// (2) join_process(3, id); printf(“After join: &d, %d”, *i, j); free_shm(sid); } Chúng ta hãy dự đoán xem các kết quả của hai lệnh printf(“After …”) cho kết quả như thế nào? Lưu ý rằng, i là biến chia sẻ, id là duy nhất (số hiệu) đối với mỗi tiến trình. Giả sử câu lệnh (1) thực hiện với id = 2, liệu dòng (2) có in ra là “After fork: 2, 4” hay không? Câu trả lời là không nhất thiết. Các giá trị của *i, j in ra có thể là 2, 4; 4, 4; 6, 4; bởi vì khi tiến trình thứ i thực hiện xong câu lệnh (1), trước khi nó thực hiện (2) thì có thể các tiến trình khác đã cập nhật lại giá trị của i. Đây là bài học quan trọng của lập trình chia sẻ bộ nhớ. Vấn đề truy cập vào bộ nhớ chia sẻ là phải có sự hợp tác chặt chẽ giữa các tiến trình. Nếu có một tiến trình truy cập vào một vùng nhớ với ý định cập nhật thì nó phải được đảm bảo rằng không một tiến trình nào khác đọc dữ liệu ở vùng đó cho đến khi việc cập nhật đó kết thúc. Muốn giải quyết được vấn đề trên thì phải có cơ chế đảm bảo rằng, các khối lệnh của chương trình được thực thi chỉ bởi một tiến trình tại mỗi thời điểm. Nếu có một tiến trình bắt đầu vào thực hiện một khối lệnh thì những tiến trình khác không được vào khối lệnh đó. Những cơ chế như thế gọi là gài khoá (lock). Khi vào một vùng lệnh thì dùng chìa để khoá nó lại, sau đó mở khoá (unlock) khi ra khỏi vùng đó và trao chìa cho tiến trình khác có nhu cầu. Để thực hiện các yêu cầu đó chúng ta sử dụng: init_lock(Id): Khởi động bộ khoá vùng nhớ chia sẻ, trong đó Id là tên của vùng nhớ sử dụng chung. lock(Id): khoá lại vùng nhớ Id. Nếu một tiến trình đã dùng chìa để khoá lại một vùng nhớ chung thì những tiến trình khác muốn truy cập vào đó sẽ phải chờ. Giả thiết rằng chỉ có một chìa khoá, do vậy chỉ khi chiếc khoá đã được một tiến trình nào đó mở ra thì chìa của nó mới được giao cho tiến trình khác sử dụng. unlock(Id): mở khoá vùng đã bị khoá và trả lại chìa cho tiến trình khác. Sử dụng cơ chế gài khoá để viết lại chương trình trên cho đúng là như sau: main(){ int *lock1,id, sid1, sid2, *i, j; lock1 = (int*)shared(sizeof(int), &sid1); init_lock(lock1); i = (int*)shared(sizeof(int), &sid2); *i = 100; j = 100; printf(“Before fork: %d, %d”, *i, j); id = create_process(2); lock(lock1); *i = id; j = id * 2; // (1) printf(“After fork: &d, %d”, *i, j);// (2) unlock(lock1); join_process(3, id); printf(“After join: &d, %d”, *i, j); free_shm(sid1); free_shm(sid2); } Chúng ta nhận thấy cơ chế gài khoá giải quyết được bài toán loại trừ lẫn nhau, nghĩa là nó chỉ cho phép một tiến trình được vào thực hiện một vùng mã lệnh tại mỗi thời điểm. Ví dụ: Cho trước một đoạn chương trình tính tổng của hai vector: for(i = 0; i < N; i++){// (1) C[i] = A[i] + B[i]; } Thực hiện song song hoá đoạn chương trình này như thế nào? Tương tự như ví dụ nêu trên, giả sử ta có M tiến trình. Chúng ta có thể chia N phần tử thành M phần (thường ta giả thiết N chia hết cho M, nghĩa là N/M là số nguyên) và gán từng phần đó cho mỗi tiến trình. Chu trình trên có thể viết thành: for(j = id * N/M; j < (id+1)*N/M; j++){ C[j] = A[j] + B[j]; } Trong đó, id là số hiệu của tiến trình, chạy từ 0 đến M-1. Tiến trình thứ i xử lý N/M phần tử liên tiếp kể từ i*N/M+1, ví dụ hình 2-4 (a). Hoặc ta có thể cho phép các tiến trình truy cập xen kẽ vào các phần tử của mảng như sau: Tiến trình Pi bắt đầu từ phần tử thứ i, sau đó bỏ qua M phần tử để xử lý phần từ tiếp theo, nghĩa là nó truy cập đến i, i+M, i+2M, v.v., ví dụ hình 2-4 (b). Chu trình (1) khi đó được viết như sau: for(j = id; j < N; j+=M){ C[j] = A[j] + B[j]; } Ví dụ: Khi N = 15 và M = 5 thì việc gán các phần tử của vector cho các tiến trình sẽ được thực hiện theo cách trên như sau: P1 P2 P3 P4 P5 1 4 7 10 13 2 5 8 11 14 3 6 9 12 15 P1 P2 P3 P4 P5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 (a) (b) Hình 2-4 Các cách phân chia chu trình của một mảng tuần tự II.2.1.2 Lập trình chia sẻ bộ nhớ dựa vào luồng Nhiều hệ điều hành hiện nay đều hỗ trợ đa luồng, ví dụ Window, OS/2, và UNIX. Trong hệ thống SMP, những luồng khác nhau có thể được hệ điều hành lập lịch tự động cho những CPU khác nhau. Một số ngôn ngữ lập trình, ví dụ Java cũng hỗ trợ lập trình đa luồng. Một tiến trình là bức tranh về sự hoạt động của một chương trình. Mỗi tiến trình được kết hợp với một hoặc nhiều luồng. Các luồng có thể xem như các tập con của một tiến trình [14]. Các luồng của một tiến trình có thể chia sẻ với nhau về không gian địa chỉ chương trình, các đoạn dữ liệu và môi trường xử lý, đồng thời cũng có vùng dữ liệu riêng để thao tác. Để dễ hiểu hơn về mô hình này, chúng ta có thể hình dung tiến trình như một xí nghiệp và các luồng như là các công nhân làm việc trong xí nghiệp đó. Các công nhân của xí nghiệp cùng chia sẻ nhau diện tích mặt bằng và các tài nguyên của cả xí nghiệp. Song, mỗi công nhân lại có chỗ làm việc được xem như là chỗ riêng của họ và những người khác không truy cập được. Việc tạo ra một công nhân (tuyển dụng lao động) dễ hơn nhiều việc tạo lập ra một xí nghiệp, vì một muốn có một xí nghiệp thì phải có ít nhất một công nhân nào đó theo qui định. Tương tự chúng ta có thể quan sát mối quan hệ giữa tiến trình và luồng về phương diện thông tin. Các công nhân trong xí nghiệp, theo mặc định, được quyền biết về mọi sự thay đổi, mọi việc xảy ra trong xí nghiệp. Nhưng nói chung, những biến động của xí nghiệp thì bình thường những xí nghiệp khác không biết được, trừ khi nó được thông báo trực tiếp cho những xí nghiệp đó. Các tiến trình và các luồng trong hệ thống song song cần phải được đồng bộ, song việc đồng bộ các luồng được thực hiện hiệu quả hơn đổi với các tiến trình. Đồng bộ các tiến trình đòi hỏi tốn thời gian hoạt động của hệ thống, trong khi đối với các luồng thì việc đồng bộ chủ yếu tập trung vào sự truy cập các biến chung của chương trình. Nhiều hệ điều hành hiện nay hỗ trợ đa luồng như: SUN Solaris, Window NT, OS/2, v.v. Bên trong những hệ điều hành này, những đặc tính hỗ trợ cho NSD khai thác được các luồng trong chương trình của mình thường khác nhau. Rất may hiện nay đã có một chuẩn, đó là Pthread của IEEE Portable Operating System Interface, POSIX. Thực hiện các luồng của Pthread Trong Pthread, chương trình chính cũng chính là một luồng. Một luồng có thể được tạo lập và kết thúc bằng những chương trình con sau: Pthread_t aThread;// Khai báo một luồng pthread_create(&aThread,&status,(void*)proc1,(void*)arg); pthread_join(athread, void *status); Hoạt động của các chương trình con trên được mô tả như trong hình 2-5. Một luồng mới được tạo ra và hoạt động ở proc1 và được truyền danh sách các đối số là &arg. Luồng sẽ bị huỷ bỏ sau khi kết thúc hoạt động và giải phóng các tài nguyên. Trang thái kết thúc công việc được trả lại trong pthrread_join(). Chương trình chính . . athread . proc1(&arg) pthread_create(&aThread,&status,(void*)proc1,(void*)arg); { .. .. pthread_join(athread, void *status);. .return(*status); . . } Hình 2-5 Hoạt động của luồng trong Pthread Có thể tạo lập và kết thúc một dãy các luồng. for(int i=0; i n { 1~ ˆ ˆ ~ ~ ˆ *26.2 Tính tốn cực tiểu F2 + J d + A2 S T d 2 } 2 song song sử dụng thuật toán SLVMN ˆ {Chú thích: Giải d số dư tensres tensor kết thúc xử lý} { ~~ ~ ˆ ~ ~ ˆT ˆ *27 Thực giải lùi J d1 = − J d − F1 − A1 S d 2 } song song để có ~ d1 sử dụng DSOLV *28 Tính tốn bước chuẩn giống kết phụ bước tensor song song sử dụng thuật toán SSPROD 29 If mynode = then ~ ˆ ˆ 29.1 Tính tốn d1 = Pd1 d t = Qd 29.2 Quyết định chọn bước chuẩn tensor sử dụng thuật toán DECIDE *29.3 Truyền bước chọn Else *29.4 Nhận bước chọn từ nút EndIf 30 If global = then *30.1 Tìm phép lại xp song song sử dụng thuật tốn LSEARCH 90 ELSE *30.2 Tìm phép lại xp song song sử dụng thuật toán TREGION EndIf 31 Tính tốn sai phân hữu hạn Jacơbi J xp song song sử dụng thuật toán JEVAL *32 Tính tốn gradient g xp song song sử dụng thuật tốn GRAD *33 Tính tốn F ( x p ) 34 If mynode = ∞ song song sử dụng thuật toán INFN then Kiểm tra tiêu chuẩn kết thúc sử dụng thuật toán NLSTP gởi kết đến host termcode ≠ 35 If method = then 35.1 FV = Fc 35.2 S = xc – xp 35.3 xc = xp Fc =Fp EndIf Go to bước 20 End III.3 Cài đặt thử nghiệm đánh giá kết Trong phần tập trung vào cài đặt thuật toán: giải hệ phương trình tuyến tính Thuật tốn cài đặt thử nghiệm mạng LAN sử dụng mơ hình truyền thông điệp dựa Ethernet III.3.1 Xây dựng chương trình cài đặt thuật tốn Mỗi chương trình thực bao gồm ba khối (như hình 3-2): Khối tạo lập liệu cho phép người sử dụng đọc liệu đầu vào từ thuật toán KMeans xác định tham số đầu vào (Mandelbrot) Khối thực thuật toán tiến hành phân cụm (thuật toán K-Means) phát sinh (Mandelbrot) 91 Khối hiển thị kết hiển thị cụm sau phân (K-means ) hiển thị sau phát sinh (Mandelbrot) Khối tạo lập Khối thực liệu thuật Khối hiển thị kết Hình 3-2 Sơ đồ thực chương trình Ngơn ngữ lập toán sử dụng để cài đặt Java Đây ngơn ngữ lập trình hổ trình trợ nhiều kỹ thuật để kết nối triệu gọi đối tượng từ xa a Tạo lập liệu Tạo lập liệu có tác dụng chuẩn bị đầu vào cho thuật toán Để cài thuật toán Gaussian ta cần tạo mảng 2-chiều a để lưu hệ số mảng 1-chiều b để lưu vector tự b Cài đặt thuật toán Cấu trúc liệu Cấu trúc liệu biễu diễn thuật toán mảng động Ta sử dụng mảng động hai chiều để lưu trữ mảng a mảng động chiều b Mơ hình cài đặt chung cho thuật tốn song song Bước 1: Kết nối máy (workstation) tham gia giải tốn Bước 2: Có workstation tham gia tính tốn tạo nhiêu luồng (thread) thực Bước Trên luồng ta triệu gọi phương thức từ xa tương ứng Trên workstation cài sẵn hàm để tính tốn Máy chủ cần gọi hàm từ xa workstation tham gia tính tốn Bước 4: Tập hợp kết gởi từ workstation Nếu thuật tốn chưa kết thúc máy chủ tiếp tục phân chia cơng việc để u cầu workstation tiếp tục tính toán Java hỗ trợ kỹ thuật để ta thực bước từ bước đến bước sau: Bước 1: Ta sử dụng gói thư viện Java.net để kết nối đến máy, bao gồm lớp: - Socket ServerSocket: Tạo đường kết nối máy 92 - InetAddress : Quản lý địa Ip tên máy kết nối - DatagramPackage URL: để gởi nhận gói tin truyền máy kết nối Bước 2: Tạo luồng Từ bước ta xác định có workstation tham gia tính tốn Sử dụng lớp java.lang.Thread the java.lang.Runnable để tạo quản lý luồng Bước 3: Triệu gọi phương thức từ xa Thơng thường chương trình viết dạng hàm Mã lệnh hàm nạp vào cho thi hành máy cục Điều mà quan tâm hàm hay đối tượng nạp vào từ máy gọi chúng từ máy khác RMI (Remote Method Invoke) Java hỗ trợ cho ta cách thức để giao tiếp đối tượng Java có mã lệnh cài đặt (bao gồm phương thức thuộc tính) nằm máy khác triệu gọi lẫn Về thực tế đối tượng Java hai máy khơng triệu gọi lẫn cách trực tiếp mà phải thông qua máy trung gian Lớp trung gian tồn hai phía: máy khách (nơi gọi phương thức đối tượng xa) máy chủ (nơi đối tượng thực cài đặt để thực thi mã lênh phương thức) Phía máy khách lớp trung gian gọi stub (lớp móc), phía máy chủ lớp trung gian gọi skeletion (lớp nối) Ta hình dung lớp stub skeletion hai người môi giới giúp đối tượng từ xa giao dịch với Trình biên dịch Java (rmic) giúp ta tạo hai lớp stub skeletion Khi cài đặt hai thuật tốn ta sử dụng gói java.rmi, sử dụng phương thức: Naming.bind(): Sử dụng máy chủ để đăng ký đối tượng với chương trình rmiregistry chạy Naming.lookup(): Sử dụng máy khách để yêu cầu quản lý rmiregistry máy chủ trả tham chiếu đến đối tượng Trên máy chủ (thực chất các workstation) ta cài đặt lớp HelloImpl để 93 giải phần thuật toán bao gồm phương thức: Đối với thuật toán Gaussian ta xây dựng hai phương thức: public double [][] tinh(double aa[][],int sd,int c,int i,int vtbd,int vtkt); aa: mảng 2-chiều chứa hệ số, cột cuối mảng aa chứa vector b sd: Số dịng cần thực c: kích cỡ mảng i: cột cần tính vtbd: Dịng bắt đầu cần tính ma trận aa vtkt: Dịng cuối cần tính ma trận aa Hàm trả mảng 2-chiều sau khử cột i, từ dòng vtbd đến dòng vtkt public double [][] tinh1(double a[][],int dong,int cot,int i) a: mảng 2-chiều chứa hệ số, cột cuối mảng aa chứa vector b dong,cot: kích cỡ mảng i: cột cần tính Hàm tính tốn máy trả mảng 2-chiều sau khử cột i Bước Tập hợp kết gởi từ workstation Sau workstation hồn thành cơng việc tức workstation khử xong phần cột thứ i Kết phần gởi Server, Server tập hợp kết thành mảng 2-chiều mới, sau tiếp tục gởi mảng đến workstation để khử cột i+1 Quá trình tiếp tục đến khử hết mảng a, Server tách cột cuối mảng 2-chiều a cho mảng mảng b đưa nghiệm III.4.2 Kết thực nghiệm Thuật toán cài đặt thử nghiệm mạng LAN sử dụng mơ hình truyền thơng điệp dựa Ethernet Cấu hình Workstation sau: CPU Pentium Memory 512MB Card mạng 100Mbps 94 Kết thực nghiệm đo thuật toán Guass sau: Đầu vào: Mảng 2-chiều a mảng 1-chiều b Kết : Đo thời gian thực (tính giây) máy tham gia Bậc 4x4 6x6 10x10 15x15 20x20 25x25 30x30 35x35 40x40 45x45 50x50 55x55 Một máy 0.1 0.79 1.87 3.71 16.53 28.15 46.51 72.42 101.54 137 172.9 Hai máy 1.29 1.62 3.54 5.73 10.06 17.03 28.17 48.64 67.82 95.5 130.46 164.46 Từ bảng kết ta có biểu đồ so sánh bậc với thời gian thực sau: 95 Biểu đồ so sánh thời gian số chiều ma trận Từ liệu hai bảng ta có nhận xét sau: - Nếu số chiều ma trận nhỏ thời gian tính tốn thời gian truyền thơng nhiều Do đó, máy thời gian thực nhanh - Nếu số chiều ma trận lớn thời gian tính tốn lớn Do đó, hai máy thời gian thực nhanh máy - Thuật toán cài đặt theo cách phân chia tác vụ động, máy khách tính tốn xong gởi kết máy chủ, máy chủ tập hợp kết quả, sau tiếp tục phân chi công việc gởi yêu cầu Do vậy, thời gian truyền thơng nhiều.Ví dụ số chiều ma trận 51 có hai máy tham gia tính tốn, số lần truyền thơng cho máy là: 25*2=50 lần truyền thông, hai máy : 2*25*2=100 lần truyền thơng Vì thuật tốn cài đặt mạng LAN khơng tối ưu thời gian truyền thông máy lớn, cài máy tính song song hiệu cao ... Hình 1-5 Các mẫu hình kiến trúc xử lý song song Những kiến trúc khác tạo khả khác cho việc xử lý song song Ngay kiến trúc tận dụng tốc độ cực nhanh xử lý để thực xử lý song song theo nguyên lý. .. trình xử lý song song Một mục đích xử lý song song nghiên cứu, xây dựng thuật tốn thích hợp để cài đặt máy tính song song, nghĩa phát triển thuật tốn song song Câu hỏi tự nhiên đánh giá thuật toán. .. nguyên Tất nhiên kiến trúc máy tính song song mục đích khai thác triệt để khả kiến trúc song song để viết chương trình song song I.3.1 Song song hóa máy tính Mục tiêu xử lý song song khai thác

Ngày đăng: 27/03/2014, 12:05

Từ khóa liên quan

Mục lục

  • MỞ ĐẦU

    • I.1 Giới thiệu chung

    • I.2 Phân loại các kiến trúc máy tính

    • Hình 1-1 Mô hình của kiến trúc SISD

      • I.2.2 Mô hình SIMD: Đơn luồng lệnh, đa luồng dữ liệu

      • Hình 1-3 Mô hình của kiến trúc MISD

        • Hình 1-4 Mô hình của kiến trúc MIMD

          • I.3 Kiến trúc máy tính song song

          • Hình 1-5 Các mẫu hình kiến trúc xử lý song song

            • Những kiến trúc khác nhau có thể tạo ra những khả năng khác nhau cho việc xử lý song song. Ngay trong kiến trúc tuần tự chúng ta cũng có thể tận dụng tốc độ cực nhanh của các bộ xử lý để thực hiện xử lý song song theo nguyên lý chia sẻ thời gian và chia sẻ tài nguyên. Tất nhiên đối với những kiến trúc máy tính song song thì mục đích chính là khai thác triệt để khả năng của kiến trúc song song để viết các chương trình song song.

            • I.3.1 Song song hóa trong máy tính tuần tự

              • Xử lý theo nguyên lý hình ống trong CPU

              • Hình 1-7 Hệ thống bộ nhớ phân cấp

                • Đa chương trình và chia sẻ thời gian

                • I.3.3 Kiến trúc SIMD

                • I.3.4 Kiến trúc MISD

                • Hình 1-10 Thực hiện tuần tự và hình ống của hai tiến trình gồm 4 giai đoạn

                  • Hình 1-11 (a) Xử lý hình ống theo ALU, (b) Xử lý hình ống theo CU

                  • Hình 1-12 Ví dụ về một hình ống vòng tròn

                    • I.3.5 Các bộ xử lý mảng tâm thu SAP

                    • Hình 1-13 Kiến trúc bộ xử lý mảng tâm thu

                    • Hình 1-15 Kiến trúc SA để thực hiện nhân hai ma trận

                      • I.3.6 Kiến trúc máy tính kiểu MIMD

                      • I.4 Bộ nhớ

                      • I.4.1 Bộ nhớ kết hợp

                      • Hình 1-16 Cấu trúc của ô nhớ AM

                      • Hình 1-17 Cấu trúc của bộ nhớ kết hợp

                        • I.4.2 Mô hình bộ nhớ truy cập ngẫu nhiên song song

                        • CHƯƠNG II

                          • THUẬT TOÁN SONG SONG & LẬP TRÌNH SONG SONG

                            • II.1 Thuật toán song song

                            • II.1.2 Các cách tiếp cận trong thiết kế

                            • II.1.3.3 Phụ thuộc theo chu trình và theo mảng

Tài liệu cùng người dùng

Tài liệu liên quan