Phân công cơng việc cho các đối tượng thi hành có thể được thực hiện bằng cách viết một chương trình riêng biệt cho mỗi đối tượng thi hành hoặc viết một chương trình duy nhất cho tất cả đối tượng thi hành. Nếu các đối tượng thi hành cùng thực hiện các tính tốn giống nhau trên các tập hợp dữ liệu khác nhau, việc sử dụng một chương trình duy nhất cho tất cả các đối tượng thi hành là thích hợp. Mặt khác, nếu các đối tượng thi hành thực hiện các hàm khác nhau thì có thể thực hiện một trong hai cách. Trong phần này, chúng ta chỉ ra cách phân công công việc đối với các tác vụ song song.
5.7.1 Sử dụng các chương trình khác nhau
Nếu các cơng nhân (đối tượng thi hành) hình thành nên ứng dụng song song thực hiện các hoạt động (phép tốn) hồn tồn khác nhau, chúng có thể được viết dưới dạng các chương trình khác nhau. Các cơng nhân khác nhau này có thể được kích hoạt (khởi động) bằng các tác vụ khởi tạo (Supervisor) sử dụng hàm pvm_spawn (). Supervisor có thể giao tiếp với các cơng nhân vì họ biết ký hiệu nhận dạng tác vụ của công nhân, các giá trị này được trả về khi hàm pvm_spawn () được gọi. Để giao tiếp với Supervisor, các công nhân cần biết TID của Supervisor. Hàm pvm_parent () trả về TID của Supervisor khi được gọi bởi các cơng nhân.
Ví dụ 7 Giả sử chúng ta muốn kích hoạt bốn tác vụ khác nhau: "công nhân l", " công
nhân 2", "công nhân 3", và "công nhân 4" lần lượt trên các máy chủ cselabOl, cselab02, cselab03, và cselab04. Giả sử rằng các tập tin thực thi nằm trong thư mục "/ user / rewini" trong tất cả các máy. Các phát biểu sau trong tác vụ khởi tạo sẽ tạo ra các tác vụ cần thiết.
info1 = pvm_spawn(“/user/rewini/worker1”, 0, 1,“cselab01”, 1, &tid1) info2 = pvm_spawn(“/user/rewini/worker2”, 0, 1,“cselab02”, 1, &tid2) info3 = pvm_spawn(“/user/rewini/worker3”, 0, 1,“cselab03”, 1, &tid3) info4 = pvm_spawn(“/user/rewini/worker4”, 0, 1,“cselab04”, 1, &tid4)
5.7.2 Sử dụng cùng một chương trình
Có thể dễ dàng phân cơng công việc cho các tác vụ song song chạy cùng một chương trình nếu chúng ta biết trước các mã định danh (các số nhận dạng) được chỉ định bởi hệ thống. Ví dụ, nếu chúng ta biết các mã định danh của n - 1 workerđang chạy cùng một chương trình lần lượt là 1, 2,.., n -1, thì chúng ta có thể phân cơng cơng việc cho các tác vụ này như sau:
switch (my_id){ case 1:
/ * Work assigned to the worker whose id number is 1* / break;
case 2:
/ * Work assigned to the worker whose id number is 2 */ break;
... ... case n -1:
/* Work assigned to the worker whose id number is n – 1*/ break;
default:;}/ * end switch */
Tuy nhiên, một tác vụ trong PVM được gán một số nguyên bất kỳ làm mã định danh của nó. Các tác vụ khơng nhất thiết phải được nhận dạng bởi các số nguyên 1, 2, 3 v.v., như được thể hiện trong ví dụ nêu trên. Trong phần tiếp theo, chúng ta sẽ chỉ ra cách để khắc phục vấn đề này.
Sử dụng các nhóm tác vụ: Trong phương pháp này, tất cả các tác vụ tham gia vào
một nhóm và các số trường hợp (số phiên bản) được sử dụng như là bộ nhận dạng tác vụ mới. Supervisor là phần tử đầu tiên tham gia vào nhóm và nhận số 0 làm số trường hợp (số phiên bản) của nó. Các workersẽ được nhận được các số trường hợp (số phiên bản) trong phạm vi từ 1 đến n-1.
Dùng mảng Task ID: (mảng nhận dạng tác vụ) trong phương pháp này, Supervisor
gửi một mảng chứa các TID của tất cả các tác vụ cho tất cả các worker. TID của Supervisor được lưu vào các phần tử 0 của mảng, và các TID của các workerđược lưu vào các phần tử từ 1 đến n - 1. Mỗi workertìm kiếm TID cho mình trong mảng nhận được từ Supervisor và có thể sử dụng chỉ số để nhận dạng workertương ứng như được chỉ ra trên hình 8.9.