Nhƣ chúng ta đã thấy, rất nhiều cộng đồng LSDC khác nhau có thể sử dụng Simgrid nhƣ một chuẩn chung. Các cộng đồng có hƣớng phát triển, khai thác khác nhau và Simgrid có thể đáp ứng đƣợc nhu cầu đa dạng đó nhờ tính linh hoạt và modun hóa của nó. Khả năng này đƣợc phản ánh bởi kiến trúc các tầng bên trong của Simgrid, nó đƣợc tổ chức thành hai mức trừu tƣợng [13].
58
Hình 17: Kiến trúc Simgrid
SURF: Là modun lõi giả lập bên trong của tất cả các giả lập trong Simgrid và các mô hình đƣợc liên kết. Surf cung cấp các chức năng căn bản để tạo lập một nền tảng ảo, nó hoạt động ở tầng rất thấp và không dành cho ngƣời dùng ở tầng ứng dụng sử dụng.
API: cung cấp một số giao diện lập trình cho ngƣời dùng cuối. Nó đƣợc sử dụng ở tầng cao để xây dựng các mô hình ứng dụng, phục vụ cho hoạt động truyền thông gửi/nhận, tƣơng tự nhƣ các ứng dụng phân tán ngoài đời thực. Simgrid cung cấp 3 giao diện lập trình là MSG, SMPI và SimDag.
Ngoài hai tầng chính trên còn có bộ công cụ mở rộng XBT, Trace. XBT cung cấp những mã lập trình phổ biến và các kiểu dữ liệu mà nguyên bản không đƣợc thực thi trong C nhƣ bảng hăm, mảng động, danh sách liên kết. Hơn nữa, XBT cũng cung cấp các chức năng quản lý bộ nhớ, ghi log, và xử lý exception. Công cụ Trace cung cấp chức năng lƣu vết các hoạt động tính toán, truyền thông, file dữ liệu có thể đƣợc hiển thị dƣới dạng đồ thị bằng cách sử dụng các công cụ tiện ích nhƣ Vite hay Viva.
3.3.3.1 Lõi giả lập (SURF)
Trong Simgrid, bộ phận chịu trách nhiệm cho việc giả lập các hoạt động truyền thông và thực thi đƣợc gọi là SURF [13].
59
Surf làm việc với tài nguyên đƣợc chia sẻ giữa các hoạt động. Các tài nguyên vật lý có ràng buộc, giới hạn thông lƣợng tối đa mà các hoạt động có thể thực hiện trên nó. Về cơ bản Surf bao gồm hai loại tài nguyên: tài nguyên CPU và tài nguyên mạng. CPU đƣợc giới hạn bởi năng lực tính toán tối đa, tài nguyên mạng đƣợc giới hạn bởi băng thông và độ trễ trên đƣờng truyền.
Dựa trên một vài hoạt động, lõi mô phỏng có khả năng dự đoán sự kết thúc của hoạt động tiếp theo. Các hoạt động cũng có thể chia sẻ cùng một nguồn tài nguyên, mô hình của surf cũng đƣợc thiết kế để đáp ứng yêu cầu này. Lõi giả lập Surf là module quan trọng nhất trong mô phỏng, bởi nó liên quan trực tiếp đến sự chính xác của mô phỏng.
3.3.3.2 Các giao diện lập trình ứng dụng
Simgrid có một giao diện lập trình mở rộng, ngƣời dùng có thể đóng góp phần thực thi của mình vào nhƣ một API nếu cần. Tuy nhiên Simgrid đã có sẵn ba giao diện lập trình cho ngƣời dùng, trong đó SimDag, SMPI sử dụng cho trƣờng hợp ứng dụng đặc thù, các trƣờng hợp còn lại có thể sử dụng MSG [13].
a) SimDag
Một cách điểu mô hình một ứng dụng song song là thiết kế một đồ thị diễn tả sự phụ thuộc giữa các tác vụ, mỗi đỉnh là một tác vụ và mỗi cạnh thể hiện sự phụ thuộc giữa các tác vụ. Một phƣơng pháp đồ thị có thể sử dụng là DAG (Direct Acyclic Graph)
60
Hình 16 là một ví dụ minh họa của Dag, bao gồm 5 tác vụ ứng với 5 node đƣợc đánh số từ 1 đến 5. Các cạnh đồ thị cho biết, các tác vụ 2, 3, 4 phụ thuộc vào kết quả của tác vụ 1, tác vụ 5 phụ thuộc kết quả của tác vụ 2, 3.
Giao diện lập trình của Dag bao gồm một số chức năng chính cho phép mô tả một đồ thị nhƣ sau:
SD_task_create(name, data) : tạo một tác vụ (đỉnh đồ thị), thêm nó tới Dag
SD_task_dependency_add(src,dst) : tạo một cạnh đồ thị thể hiện sự phụ thuộc giữa tác vụ nguồn và đích, trong đó dst phụ thuộc vào src
SD_task_dependency_remove(src,dst) : xóa bỏ một sự phụ thuộc giữa hai tác vụ (xóa bỏ cạnh đồ thị)
SD_task_schedule : lên lịch hoạt động cho một task, khi task đã thỏa mãn các điều kiện phụ thuộc, task sẽ đƣợc đƣa vào mô phỏng
Giao diện lập trình DAG giới hạn phạm vi đối với những ứng dụng có cấu trúc DAG. Cấu trúc này dựa trên điều kiện biết đƣợc sự phụ thuộc giữa các tác vụ. Tuy nhiên, sự phụ thuộc giữa các tác vụ thƣờng không biết trƣớc đƣợc trong các ứng dụng thực và đôi khi một giao diện lập trình chi tiết hơn mới đáp ứng đƣợc.
b) MSG
Một phƣơng pháp trực quan cho môi trƣờng LSDC là tạo ra các tác vụ và sử dụng chúng để chuyển giao công việc. Do đó, khi một tác vụ đƣợc nhận, một process có thể quyết định hành động thế nào dựa trên nội dung tác vụ truyền tải. MSG (Meta Simgrid) là một giao diện lập trình phân tán đầu tiên đƣợc cung cấp bởi Simgrid và nó vẫn đƣợc sử dụng phổ biến ngày nay. Nếu bạn không biết nên sử dụng giao diện lập trình nào của Simgrid cho ứng dụng của mình, bạn có thể sử dụng MSG, nó cung cấp cho các chuyên gia khả năng kiểm soát hoàn toàn với hoạt động mô phỏng. Giao diện này cung cấp một số phƣơng thức cho phép thực thi, gửi, nhận các tác vụ đồng bộ hoặc không đồng bộ [18].
61
Agent (nhân tố): hoạt động trên các host
Task (tác vụ): một lƣợng công việc nhất định cần thực hiện, trao đổi qua lại giữa các nhân tố chạy trên các host khác nhau
Host: Tài nguyên, nơi các agent hoạt động
Mailbox: Nhƣ một điểm hẹn của các agent, các thông tin qua lại giữa các agent đƣợc gửi qua đây.
Một số phương thức chính của MSG:
MSG_task_create(name, comp, comm, data): Tạo một tác vụ với khối tƣợng
tính toán cần dùng cho nó (tính theo đơn vị Flop) (comp) và kích cỡ dữ liệu cần truyền (đơn vị byte) (comm), trong trƣờng hợp cần đính kèm dữ liệu, đƣa vào thông qua tham số (data), dữ liệu đính kèm về sau có thể nhận lại qua phƣơng thức MSG_task_get_data.
MSG_task_execute (m_task_t task): Thực hiện giả lập thời gian để tính toán tác vụ chỉ ra, phụ thuộc vào năng lực xử lý của máy và khối lƣợng tính toán chỉ định dùng cho tác vụ (quy định trong phƣơng thức tạo tác vụ).
MSG_task_send (m_task_t task, const char *alias): Giả lập gửi một tác vụ theo cơ chế đồng bộ thông qua một kênh xác định bởi tham số alias
MSG_task_recv (m_task_t task, const char *alias): Giả lập nhận một tác vụ theo cơ chế đồng bộ thông qua một kênh xác định bởi tham số alias
MSG là phù hợp cho hầu hết các ứng dụng cho phép chi tiết hóa các hoạt động truyền thông và tính toán bên trong lõi mô phỏng.
* Một ví dụ ứng dụng minh họa sử dụng MSG:
Một ứng dụng Simgrid bất kỳ bao gồm 3 thành phần: file platform, ứng dụng và file triển khai. Trong phần xây dựng ứng dụng cho ví dụ, agent bao gồm 2 loại master (đóng vai trò là chủ) và worker (đóng vai trò là khách), một master sẽ gửi các tác vụ tới các worker.
62
File my_platform.xml cho biết tài nguyên gồm 2 host đƣợc nối với nhau bởi một kênh truyền.
File triển khai my_deployment.xml quy định các agent (process) hoạt động trên các host. Trên host1 có một agent đóng vai trò là master với các tham số cho biết: có 6 tác vụ, năng lực tính toán dành cho mỗi tác vụ, kích cỡ dữ liệu truyền, và số worker phụ thuộc vào master. Trên host2 có 3 agent đóng vai trò là worker, có thể hiểu là có 3 tiến trình chạy trên host2, giao tiếp với tiến trình master trên host1.
63
Hàm master() định nghĩa các hoạt động tại agent master chạy trên host1, nó lấy các tham số từ file triển khai (các tham số của tiến trình), để tạo ra các tác vụ, gửi tới các tiến trình worker tƣơng ứng. Sau đó, nó gửi tiếp một loạt các tác vụ “kết thúc”, tiến trình worker nếu nhận đƣợc loại tác vụ này thì thực hiện hủy tác vụ và ngừng hoạt động.
64
Các tiến trình worker lắng nghe từ mailbox để nhận về các tác vụ từ master, nếu không phải tác vụ “kết thúc”, nó sẽ tiến hành thực thi tác vụ trƣớc khi hủy tác vụ.
Sau khi đã viết xong hàm master(), worker() định nghĩa hoạt động tƣơng ứng, hàm main() có chức năng gắn kết tất cả các hàm, file cấu hình và đăng ký hoạt động mô phỏng với MSG.
* Trong các giao diện lập trình ứng dụng của Simgrid, ngoài C, MSG có hỗ trợ lập trình trên các ngôn ngữ khác nhƣ Java, Lua, Ruby. Việc chạy ứng dụng mô phỏng MSG trên máy ảo Java, khi số lƣợng tiến trình mô phỏng lớn, hiệu năng là khó chấp nhận đƣợc, tuy nhiên, thật may mắn, nếu chạy với bản path-máy ảo Java (Máy ảo hỗ trợ cơ chế Java coroutines) lại cho một kết quả rất khả quan, chỉ đứng sau C, điều đó tạo điều kiện rất thuận lợi cho ngƣời lập trình, bởi việc lập trình trên Java không đòi hỏi phức tạp nhƣ trên C.
65
Hình 19: Kết quả so sánh khi chạy ứng dụng mô phỏng bằng MSG sử dụng các ngôn ngữ C, Java (nguồn [18])
c) SMPI
SMPI là một giao diện mô phỏng phù hợp với các chuẩn MPI (Message Passing Interface) (Chuẩn cho mô hình tính toán song song truyền thông điệp). SMPI cho phép rút ngắn thời gian để phát triển các ứng dụng phân tán bởi cùng một mã nguồn chƣơng trình MPI có thể đƣợc sử dụng ở cả môi trƣờng thực cũng nhƣ môi trƣờng giả lập do SMPI tạo ra và việc lƣu vết các hoạt động truyền thông, tính toán có thể đƣợc cung cấp từ chức năng Trace của Simgrid một cách dễ dàng hơn nhiều so với hệ thống vật lý [17].
66
Hình 20: Chạy SMPI ở chế độ lưu vết và xem hình ảnh kết quả sử dụng ứng dụng tiện ích Vite hoặc Viva
Gần đây, SMPI đã mở rộng chức năng cho phép thực thi chính xác hơn, ứng với các hoạt động cấp thấp của MPI, OpenMPI và MPICH. SMPI và Simgrid cũng cung cấp một số đặc tính hữu ích cho giả lập các ứng dụng yêu cầu thời gian cũng nhƣ lƣợng tài nguyên lớn để chạy.
Hình 21: Sự khác nhau giữa MPI và SMPI ở môi trường giả lập
Sự khác nhau chính trong các mã giả lập đƣợc cung cấp bởi SMPI là các hoạt động truyền thông đƣợc quy đổi về các hoạt động giả lập. Với các thông tin truyền đƣợc cung cấp lõi giả lập Surf có thể ƣớc lƣợng thời gian cần thiết để kết thúc việc truyền thông điệp.
3.3.3.3 Quy trình mô phỏng
Sau khi đã hiểu tổng quan về các thành phần chính trong một ứng dụng Simgrid, chúng ta có thể chuyển sang tìm hiểu về quy trình mô phỏng diễn ra trong lõi Simgrid [13].
67
Một ứng dụng mô phỏng Simgrid bắt đầu bằng việc phân tích file platform để chuyển các thông tin mô tả tài nguyên của hệ thống vào lõi mô phỏng Surf. Các mô hình giả lập tƣơng ứng với các tài nguyên (CPU, network), topology, kênh truyền dữ liệu đƣợc tạo ra bởi Surf để đƣa vào hoạt động. Tiếp theo, các tiền trình, luồng đƣợc tạo ra và điều phối bởi SIMIX. Các hoạt động mô phỏng nhân lõi, cấp thấp nhất, các thông số đầu ra sau khi mô phỏng đƣợc thực hiện bởi Surf, SIMIX đóng vai trò trung gian, điều phối giữa tầng ứng dụng của ngƣời dùng và lõi mô phỏng Surf.
Hình 22: Hoạt động diễn ra bên trong Simgrid sau khi được khởi tạo. Một luồng được tạo ra bởi SIMIX ứng với mỗi tiến trình của người dùng. Một mô hình giả lập
các tài nguyên, nền tảng được tạo ra bởi lõi giả lập Surf
Hình 23: Luồng công việc giả lập bên trong Simgrid. Surf thực hiện ước đoán thời gian cho các hoạt động và trả lại thông tin đầu ra.
68
CHƢƠNG 4: ỨNG DỤNG MINH HỌA
Để minh họa cho các kiến thức tìm hiểu đƣợc, đồng thời cũng là để hiểu rõ hơn, tôi xây dựng một ứng dụng minh họa nhỏ: “Xây dựng ứng dụng giả lập một server room sử dụng cho tính toán song song và tính giá thành để xây dựng topology”. Ứng dụng cho phép chạy thử ứng dụng trên môi trƣờng song song phân tán, thay đổi kích cỡ ứng dụng đầu vào và đánh giá thời gian thực hiện.
Hình 24: Minh họa một Server room