mở đầu tập trung vào việc giới thiệu tình hình nghiên cứu thuộc lĩnh vực đề tài. Bên cạnh đó, lý do, mục tiêu, đối tượng và phạm vi nghiên cứu cũng như phương pháp nghiên cứu và hướng tiếp cận cũng được nêu rõ. Phần cuối trình bày cấu trúc luận văn để người đọc có thể bao quát được nội dung của đề tài thực hiện.1 GIỚI THIỆU ĐỀ TÀI 1.1 CƠ SỞ HÌNH THÀNH ĐỀ TÀI Ngày nay với sự phát triển nhanh chóng của các lĩnh vực khoa học, kỹ thuật và kinh tế thì nhu cầu tính toán cũng ngày càng trở nên đa dạng và phong phú, đòi hỏi tốc độ tính toán nhanh với lượng dữ liệu xử lý lớn. Các máy tính cá nhân không còn có thể đáp ứng nổi nhu cầu tính toán cho các bài toán dữ liệu lớn nữa, do đó để đáp ứng được nhu cầu tính toán ngày càng cao này thì hàng loạt các siêu máy tính ra đời và đưa đến việc hình thành của một lĩnh vực khoa học, đó chính là lĩnh vực tính toán hiệu năng cao.
Qua hơn 50 năm phát triển, lĩnh vực tính toán hiệu năng cao đã có được những bước tiến vượt bậc, tốc độ của các siêu máy tính ngày càng được nâng cao. Tính đến thời điểm tháng 11/2017, siêu máy tính có tốc độ tính toán nhanh nhất thế giới là siêu máy tính Sunway TaihuLight với tốc độ xấp xỉ 93 petaFLOPS [1]. Với tốc độ phát triển không ngừng của lĩnh vực tính toán hiệu năng cao thì trong tương lai gần sẽ xuất hiện các siêu máy tính có thể đạt đến tốc độ exaFLOPS. Khi các siêu máy tính đạt đến tốc độ này xuất hiện thì đồng nghĩa với việc các phần mềm, các ứng dụng tính toán khoa học… trước đây (trên các hệ thống petaFLOPS) thường không thể đạt được hiệu suất tốt nhất như khi chạy trên các hệ thống máy tính exaFLOPS nữa.
Do đó, để đón đầu xu thế tính toán exascale (exascale computing) [2, 3], các nhóm nghiên cứu trên thế giới đã bắt đầu tiến hành nhiều nghiên cứu về các giải thuật, phần mềm, mô hình lập trình,. mới để có thể hoạt động hiệu quả trên các siêu máy tính exaFLOPS. Hiện nay, MPI (mô hình giao tiếp truyền thông điệp) [4] là một đặc tả giao diện thư viện truyền thông điệp được dùng phổ biến trong các ứng dụng tính toán khoa học chạy trên các siêu máy tính hoặc các hệ thống máy tính hiệu năng cao. Các chương trình hoạt động dựa trên mô hình truyền thông điệp trước đây chủ yếu sử dụng hai cơ chế lập trình giao tiếp truyền thông điệp là giao tiếp điểm với điểm (point-to-point) và giao tiếp nhóm (collective).
Cả hai cơ chế lập trình này đều có đặc điểm chung là cả bên gửi và bên nhận đều phải tham gia vào quá trình giao tiếp trực tiếp và yêu cầu cần phải có sự đồng bộ từ hai bên cho nên chúng được gọi là giao tiếp song phương 1 (two-sided communication). Trong hai cơ chế trên, bộ nhớ là dành riêng cho mỗi quá trình (process). Mỗi khi bên gửi gọi hàm 𝑀𝑃𝐼_𝑆𝑒𝑛𝑑 và bên nhận gọi hàm 𝑀𝑃𝐼_𝑅𝑒𝑐𝑣 thì dữ liệu trong bộ nhớ (memory) của bên gửi sẽ được sao chép đến bộ đệm (buffer) rồi sau đó gửi ra mạng rồi đến bộ nhớ của bên nhận. Hạn chế của chúng là bên gửi phải chờ bên nhận sẵn sàng nhận dữ liệu trước khi nó có thể gửi dữ liệu đi.
Điều này dẫn đến việc dữ liệu được truyền có thể phải bị trì hoãn gây ra việc giảm hiệu suất chương trình. Hình 1 minh họa cho tình huống này. Để giải quyết hạn chế này, mô hình giao tiếp truyền thông điệp đã cung cấp một cơ chế giao tiếp khác là RMA [5, 6], hay còn được gọi là giao tiếp đơn phương hay một phía (one-sided communication) bởi vì yêu cầu chỉ một quá trình duy nhất truyền dữ liệu. Bên cạnh đó, cơ chế giao tiếp này ngày càng được sử dụng phổ biến trong nhiều ứng dụng hơn [7-10] bởi vì nó cho phép người lập trình tận dụng được khả năng của hạ tầng RDMA.
Không giống như cơ chế giao tiếp truyền thông điệp song phương, cơ chế giao tiếp đơn phương phân tách giữa việc truyền dữ liệu với đồng bộ nhằm tăng khả năng truyền dữ liệu đồng thời cũng như khả năng mở rộng (scalability) cho ứng dụng. Hơn thế nữa, giao tiếp đơn phương còn làm cho hiệu suất chương trình cao hơn bằng cách xóa bỏ việc so trùng thông điệp và điều phối bộ nhớ đệm ở bên nhận mà những cái này chỉ xảy ra trong cơ chế giao tiếp song phương. Do đó, giao tiếp đơn phương được kì vọng là cơ chế giao tiếp truyền thông điệp hiệu quả phù hợp với các hệ thống siêu máy tính exaFLOPs xuất hiện trong tương lai gần. Hình 1: Bên gửi gọi 𝑀𝑃𝐼_𝑆𝑒𝑛𝑑 nhưng phải đợi bên nhận gọi 𝑀𝑃𝐼_𝑅𝑒𝑐𝑣 trước khi dữ liệu có thể được gửi đi Khả năng phân tách giữa truyền và đồng bộ dữ liệu là một điểm mạnh của cơ chế giao tiếp truyền thông điệp đơn phương song nó cũng đem lại nhiều thách thức cho 2 người lập trình.
Người lập trình vừa phải điều phối một mô hình bộ nhớ phức tạp vừa phải sắp xếp các tác vụ đồng bộ (synchronization call) thích hợp để duy trì tính nhất quán dữ liệu của chương trình trong khi các tác vụ truy xuất dữ liệu (communication call) có tính bất đồng bộ và non-blocking. Chính sự phức tạp này đã gây ra nhiều lỗi đồng bộ trong các ứng dụng tính toán khoa học. Lỗi nhất quán bộ nhớ (memory consistency error) [11] hay còn gọi là lỗi tương tranh (race condition) [12] hoặc còn gọi là lỗi đồng bộ (synchronization error) [13, 14] là một trong các lỗi phổ biến được gây ra trong cơ chế giao tiếp đơn phương. Để thuận tiện cho người đọc, trong tài liệu này sẽ thống nhất gọi là lỗi nhất quán bộ nhớ.
Lỗi này đã được tìm thấy trong một số ứng dụng thật: (1) emulate [11] – một chương trình mô phỏng bộ nhớ chia sẻ phân bố, (2) BT-broadcast [15] – một giải thuật phát tán cây nhị phân sử dụng cơ chế giao tiếp một phía, (3) lockopts [16] – một trường hợp kiểm thử RMA trong gói thư viện MPICH. Hình 2 đưa ra một số ví dụ phổ biến về lỗi nhất quán bộ nhớ. Hình 2a cho thấy lỗi nhất quán bộ nhớ xảy ra trên cùng một giai đoạn (epoch). 𝑀𝑃𝐼_𝑃𝑢𝑡 truyền dữ liệu trong 𝑏𝑢𝑓 từ quá trình 𝑃0 đến 𝑃1.
Sau khi thực thi hàm 𝑀𝑃𝐼_𝑃𝑢𝑡, dữ liệu trong 𝑏𝑢𝑓 có thể đã được gửi đi hoàn toàn hoặc cũng có thể là chưa do hàm 𝑀𝑃𝐼_𝑃𝑢𝑡 có tính chất non-blocking. Do đó, rất có thể dữ liệu trong 𝑏𝑢𝑓 sẽ bị xung đột bởi tác vụ cục bộ store (lệnh gán) ngay sau đó. Các lỗi như thế này là rất phổ biến trong các ứng dụng sử dụng cơ chế giao tiếp đơn phương. Chẳng hạn như trong một phiên bản thư viện ADLB [17] được sử dụng trong ứng dụng vật lý nguyên tử GFMC [18], người lập trình đã dùng tác vụ 𝑀𝑃𝐼_𝑃𝑢𝑡 để truyền dữ liệu từ một biến cục bộ trong một hàm và hàm này trả kết quả về là giá trị của biến cục bộ đó mà không đợi 𝑀𝑃𝐼_𝑃𝑢𝑡 hoàn thành.
Điều này cũng gây ra lỗi nhất quán bộ nhớ tương tự như trong hình 2a. Hình 2b chỉ ra một ví dụ khác về lỗi nhất quán bộ nhớ giữa các quá trình khi dùng các hàm đồng bộ chủ động. Các hàm 𝑀𝑃𝐼_𝑃𝑢𝑡 trong các quá trình 𝑃0 và 𝑃2 xung đột với nhau bởi vì chúng rất có thể truy xuất đồng thời vùng nhớ chia sẻ 𝑋 trong 𝑃1 và điều này có thể sẽ gây ra kết quả không mong đợi cho chương trình. Hình 2c chỉ ra một ví dụ về lỗi nhất quán bộ nhớ tương tự như trong hình 2b khi dùng các hàm đồng bộ thụ động.
Hình 2d phác họa một ví dụ khác về lỗi nhất quán bộ nhớ trong tình huống mà hàm 𝑀𝑃𝐼_𝑃𝑢𝑡 xảy ra ở bên gửi xung đột với tác vụ store ở bên nhận bởi vì chúng sẽ ghi dữ liệu lên cùng một vùng nhớ. 3 Hình 2: Lỗi nhất quán bộ nhớ [11] Để chạy một ứng dụng tính toán khoa học, các nhà khoa học có thể chạy xong ứng dụng mất vài ngày, thậm chí lên đến hàng tháng. Tuy nhiên, thời gian chạy ứng dụng còn có thể kéo dài hơn gấp nhiều lần nếu nó có chứa các lỗi nhất quán bộ nhớ do phải chạy đi chạy lại chương trình nhiều lần để tìm lỗi. Hơn thế nữa, lỗi nhất quán bộ nhớ 4 là một lỗi ngữ nghĩa rất khó có thể phát hiện ra bằng kiến thức thông thường nên khi gặp lỗi này trong chương trình, người lập trình rất khó có khả năng mường tượng điều gì đang diễn ra.
Do đó, việc phát hiện các lỗi nhất quán bộ nhớ là một nhu cầu thiết yếu xuất phát từ thực tiễn nhằm cải thiện độ tin cậy cũng như nâng cao hiệu suất của chương trình. Đồng thời, còn giúp người lập trình có thể tiết kiệm được thời gian chạy chương trình.2 Ý NGHĨA CỦA ĐỀ TÀI Tóm lại, vấn đề được nêu ra có ý nghĩa về mặt khoa học và thực tiễn như sau: • Ý nghĩa thực tiễn: Việc phát hiện các lỗi nhất quán bộ nhớ có thể được triển khai trên các chương trình song song sử dụng cơ chế truyền thông điệp đơn phương thực thi trên hệ thống máy tính cụm hiện có tại trường Đại Học Bách Khoa Thành Phố Hồ Chí Minh nhằm cải thiện độ tin cậy cũng như nâng cao hiệu suất của chương trình. • Ý nghĩa khoa học: vấn đề nghiên cứu của đề tài có một số ý nghĩa quan trọng sau đây: o Giải quyết lỗi nhất quán bộ nhớ – một lỗi trong cơ chế giao tiếp đơn phương mà hầu như chưa có một giải thuật nào thực sự giải quyết vấn đề này một cách triệt để. o Cải thiện độ tin cậy cũng như nâng cao hiệu suất chương trình.
o Giúp người lập trình phát hiện lỗi dễ dàng hơn.3 CÁC CÔNG TRÌNH NGHIÊN CỨU LIÊN QUAN Hiện nay trên thế giới có một số công bố khoa học liên quan trực tiếp đến việc giải quyết các lỗi nhất quán bộ nhớ, tiêu biểu trong số đó là: 1. Giải thuật “bộ nhớ phụ” (mirror window) Trong công trình này [12], Mi-Young Park và Sang-Hwa Chung đã xem xét các lỗi nhất quán bộ nhớ giữa các tác vụ truyền dữ liệu trong cơ chế giao tiếp đơn phương bên trong một nhóm hàm đồng bộ và cả giữa các nhóm hàm đồng bộ với nhau. Tuy nhiên, nhóm tác giả vẫn chưa xem xét mối quan hệ sự kiện giữa các tác vụ cục bộ (load/store) với các tác vụ truyền dữ liệu.