Khóa luận Nghiên cứu hệ thống cụm máy tính xử lý song song rocks và ứng dụng

Tài liệu Khóa luận Nghiên cứu hệ thống cụm máy tính xử lý song song rocks và ứng dụng: ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ Bùi Ngọc Linh NGHIÊN CỨU HỆ THỐNG CỤM MÁY TÍNH XỬ LÝ SONG SONG ROCKS VÀ ỨNG DỤNG KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ thông tin HÀ NỘI - 2010 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ Bùi Ngọc Linh NGHIÊN CỨU HỆ THỐNG CỤM MÁY TÍNH XỬ LÝ SONG SONG ROCKS VÀ ỨNG DỤNG KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ thông tin Cán bộ hƣớng dẫn: TS. Nguyễn Trí Thành HÀ NỘI - 2010 i LỜI CẢM ƠN Trƣớc hết, tôi xin bày tỏ lòng kính trọng và biết ơn sâu sắc tới Tiến sỹ Nguyễn Trí Thành, ngƣời đã trực tiếp giảng dạy và tận tình giúp đỡ tôi trong quá trình làm khóa luận. Tôi xin chân thành cảm ơn toàn thể các thầy cô giáo trƣờng Đại học Công nghệ - Đại học Quốc gia Hà Nội đã tận tình chỉ bảo, dạy dỗ tôi trong suốt 4 năm học vừa qua. Tôi xin chân thành cảm ơn thƣ viện Đại học Quốc gia Hà Nội, thƣ viện Hội sinh viên trƣờng Đại học Công nghệ - Đại học Quốc ...

pdf186 trang | Chia sẻ: haohao | Lượt xem: 1322 | Lượt tải: 1download
Bạn đang xem trước 20 trang mẫu tài liệu Khóa luận Nghiên cứu hệ thống cụm máy tính xử lý song song rocks và ứng dụng, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ Bùi Ngọc Linh NGHIÊN CỨU HỆ THỐNG CỤM MÁY TÍNH XỬ LÝ SONG SONG ROCKS VÀ ỨNG DỤNG KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ thông tin HÀ NỘI - 2010 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ Bùi Ngọc Linh NGHIÊN CỨU HỆ THỐNG CỤM MÁY TÍNH XỬ LÝ SONG SONG ROCKS VÀ ỨNG DỤNG KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ thông tin Cán bộ hƣớng dẫn: TS. Nguyễn Trí Thành HÀ NỘI - 2010 i LỜI CẢM ƠN Trƣớc hết, tôi xin bày tỏ lòng kính trọng và biết ơn sâu sắc tới Tiến sỹ Nguyễn Trí Thành, ngƣời đã trực tiếp giảng dạy và tận tình giúp đỡ tôi trong quá trình làm khóa luận. Tôi xin chân thành cảm ơn toàn thể các thầy cô giáo trƣờng Đại học Công nghệ - Đại học Quốc gia Hà Nội đã tận tình chỉ bảo, dạy dỗ tôi trong suốt 4 năm học vừa qua. Tôi xin chân thành cảm ơn thƣ viện Đại học Quốc gia Hà Nội, thƣ viện Hội sinh viên trƣờng Đại học Công nghệ - Đại học Quốc gia Hà Nội đã giúp đỡ tôi rất nhiều tài liệu quý báu trong quá trình học tập và nghiên cứu. Cuối cùng, tôi xin chân thành cảm ơn gia đình và bạn bè, những ngƣời đã luôn động viên, giúp đỡ tôi trong học tập cũng nhƣ trong cuộc sống. ii TÓM TẮT NỘI DUNG Tài liệu này giới thiệu sơ lƣợc về công nghệ xử lý song song nói chung và công nghệ xử lý song song phân cụm nói riêng, sau đó tập trung nghiên cứu một hệ thống cụm máy tính xử lý song song tiêu biểu: Rocks. Các nội dung chính đƣợc trình bày là: Các kiến trúc xử lý song song SISD, SIMD, MISD, MIMD (theo phân loại của Flynn), cùng các hệ thống tính toán đa nhân, các hệ thống đa xử lý đối xứng, các hệ thống tính toán lƣới, tính toán cụm và các hệ thống xử lý song song cực lớn (Chƣơng 2); giới thiệu tổng quan về kiến trúc và thành phần của hệ thống Rocks, hƣớng dẫn cài đặt, nghiên cứu kiến trúc hệ thống và cách quản trị (Chƣơng 3); hƣớng dẫn lập trình MPI căn bản, phƣơng pháp xây dựng ứng dụng MPI để đạt hiệu quả cao, tận dụng đƣợc tài nguyên hệ thống (Chƣơng 4); Chƣơng 5 của khóa luận trình bày chi tiết một ứng dụng xử lý song song tiêu biểu, cùng cách thức thiết lập môi trƣờng và hƣớng dẫn biên dịch. Phần cuối của tài liệu có trình bày 4 phụ lục, xem nhƣ là các nội dung mở rộng cho những phần đã trình bày trong các chƣơng. iii MỤC LỤC LỜI CẢM ƠN ........................................................................................................................................ i TÓM TẮT NỘI DUNG ........................................................................................................................ii MỤC LỤC ........................................................................................................................................... iii DANH MỤC BẢNG BIỂU ...............................................................................................................vii DANH MỤC HÌNH VẼ ................................................................................................................... viii CHƢƠNG 1. GIỚI THIỆU .................................................................................................................. 1 CHƢƠNG 2. CÁC KIẾN TRÚC VÀ CÁC HỆ THỐNG XỬ LÝ SONG SONG ........................... 4 2. 1. Các kiến trúc xử lý song song ........................................................................................... 4 2. 1. 1. SISD ............................................................................................................................ 6 2. 1. 2. SIMD .......................................................................................................................... 7 2. 1. 3. MISD .......................................................................................................................... 7 2. 1. 4. MIMD ......................................................................................................................... 8 2. 2. Các hệ thống xử lý song song ........................................................................................... 8 2. 2. 1. Các hệ thống tính toán đa nhân ................................................................................. 8 2. 2. 2. Các hệ thống đa xử lý đối xứng ................................................................................ 9 2. 2. 3. Các hệ thống tính toán phân tán .............................................................................. 10 2. 2. 3. 1. Các hệ thống tính toán lƣới ............................................................................... 10 2. 2. 3. 2. Các hệ thống xử lý song song cực lớn ............................................................. 12 2. 2. 3. 3. Các hệ thống tính toán cụm .............................................................................. 12 iv CHƢƠNG 3. HỆ THỐNG ROCKS .................................................................................................. 16 3. 1. Giới thiệu.......................................................................................................................... 16 3. 1. 1. Tổng quan ................................................................................................................. 16 3. 1. 2. Kiến trúc của HPC Cluster sử dụng Rocks ............................................................ 17 3. 1. 3. Rocks và Rolls.......................................................................................................... 18 3. 2. Cài đặt............................................................................................................................... 20 3. 2. 1. Cấu hình .................................................................................................................... 20 3. 2. 2. Cài đặt frontend ........................................................................................................ 20 3. 2. 3. Cài đặt hàng loạt các compute node ....................................................................... 24 3. 3. Kiến trúc hệ thống ........................................................................................................... 25 3. 3. 1. Quy tắc đặt tên của Rocks ....................................................................................... 25 3. 3. 2. Về cơ sở dữ liệu cluster ........................................................................................... 28 3. 3. 3. Về sơ đồ cơ sở, file cơ sở và quá trình cài đặt một compute node ....................... 34 3. 4. Quản trị ............................................................................................................................. 39 3. 4. 1. Tổng quan ................................................................................................................. 39 3. 4. 2. Frontend quản trị cluster nhƣ thế nào? ................................................................... 40 3. 4. 3. Các tác vụ quản trị cơ bản ....................................................................................... 43 3. 4. 3. 1. Cài đặt lại một compute node trong lần boot PXE tiếp theo .......................... 43 3. 4. 3. 2. Xem và thay đổi các cấu hình mạng ................................................................ 48 CHƢƠNG 4. LẬP TRÌNH SONG SONG VỚI MPI ....................................................................... 50 4. 1. Các mô hình lập trình song song .................................................................................... 50 4. 1. 1. Mô hình bộ nhớ chia sẻ ........................................................................................... 50 4. 1. 2. Mô hình đa luồng ..................................................................................................... 51 v 4. 1. 3. Mô hình truyền thông điệp ...................................................................................... 52 4. 1. 4. Mô hình song song dữ liệu ...................................................................................... 53 4. 2. Các ƣu điểm của mô hình truyền thông điệp ................................................................. 54 4. 2. 1. Phổ biến .................................................................................................................... 54 4. 2. 2. Khả năng mô tả ........................................................................................................ 54 4. 2. 3. Dễ gỡ lỗi hơn ............................................................................................................ 55 4. 2. 4. Hiệu năng.................................................................................................................. 55 4. 3. Giới thiệu về MPI ............................................................................................................ 55 4. 4. Mục tiêu của MPI ............................................................................................................ 56 4. 5. Các đặc điểm của MPI .................................................................................................... 56 4. 6. Khác biệt giữa các bản cài đặt bằng C và C++ của MPI............................................... 58 4. 7. MPI trên Rocks ................................................................................................................ 58 4. 8. Viết chƣơng trình Hello World ....................................................................................... 59 4. 9. Các hàm MPI cơ bản ....................................................................................................... 64 4. 8. 1. Hàm MPI_Init ...................................................................................................... 64 4. 8. 2. Hàm MPI_Finalize ............................................................................................ 65 4. 8. 3. Hàm MPI_Comm_size ......................................................................................... 65 4. 8. 4. Hàm MPI_Comm_rank ......................................................................................... 65 4. 10. Giá trị trả về của các hàm MPI ....................................................................................... 66 4. 11. Về các khái niệm Nhóm, Ngữ cảnh và Bộ liên lạc........................................................ 66 4. 12. Liên lạc giữa các tiến trình .............................................................................................. 67 4. 13. Xây dựng một ứng dụng tự trị ........................................................................................ 70 vi 4. 14. Về mối quan hệ giữa kích thƣớc bài toán và chi phí tính toán ..................................... 75 4. 15. Phƣơng hƣớng xây dựng một ứng dụng MPI ................................................................ 77 CHƢƠNG 5. CÀI ĐẶT THỬ NGHIỆM ỨNG DỤNG TRÊN HỆ THỐNG ROCKS.................. 78 5. 1. Thiết lập môi trƣờng ........................................................................................................ 78 5. 2. Mã nguồn ứng dụng......................................................................................................... 79 5. 3. Biên dịch và chạy ứng dụng ............................................................................................ 86 5. 4. Kết quả thử nghiệm ......................................................................................................... 86 CHƢƠNG 6. KẾT LUẬN.................................................................................................................. 89 PHỤ LỤC 1. SƠ LƢỢC VỀ CÁCH PHÁT TRIỂN ROLL MỚI ................................................... 90 PHỤ LỤC 2. LIÊN LẠC GIỮA CÁC TIẾN TRÌNH MPI .............................................................. 99 PHỤ LỤC 3. SỬ DỤNG MPI ĐỂ TÍNH TÍCH PHÂN ................................................................. 102 PHỤ LỤC 4. SỬ DỤNG MPI ĐỂ TÍNH TOÁN SỐ PI ................................................................ 104 TÀI LIỆU THAM KHẢO ................................................................................................................ 109 vii DANH MỤC BẢNG BIỂU Bảng 1 – Tƣơng ứng các hàm MPI trong C và C++ ........................................................................ 58 Bảng 2 – Các hằng số toán tử .......................................................................................................... 106 viii DANH MỤC HÌNH VẼ Hình 1 – Các lĩnh vực ứng dụng của xử lý song song........................................................................ 2 Hình 2 - SISD........................................................................................................................................ 4 Hình 3 - SIMD ...................................................................................................................................... 5 Hình 4 - MISD ...................................................................................................................................... 5 Hình 5 - MIMD ..................................................................................................................................... 6 Hình 6 – Xử lý đƣờng ống 5 giai đoạn ................................................................................................ 6 Hình 7 – Mô hình bộ xử lý 2 nhân....................................................................................................... 9 Hình 8 - SMP ........................................................................................................................................ 9 Hình 9 – Mô hình lƣới tính toán ........................................................................................................ 11 Hình 10 - MPP .................................................................................................................................... 12 Hình 11 – Thống kê về kiến trúc của 500 siêu máy tính .................................................................. 13 Hình 12 – Mô hình của HPC Cluster................................................................................................. 14 Hình 13 – Rockstar cluster ................................................................................................................. 15 Hình 14 – Kiến trúc của Rocks .......................................................................................................... 17 Hình 15 – Một báo cáo sinh bởi Ganglia .......................................................................................... 19 Hình 16 – Màn hình khởi động .......................................................................................................... 21 Hình 17 – Lựa chọn Roll (1) .............................................................................................................. 22 Hình 18 – Lựa chọn Roll (2) .............................................................................................................. 23 Hình 19 - Phân chia ổ ......................................................................................................................... 24 Hình 20 – Lựa chọn appliance type ................................................................................................... 25 Hình 21 – Vai trò trung tâm của cơ sở dữ liệu SQL ......................................................................... 29 ix Hình 22 – Thao tác trực tiếp với cơ sở dữ liệu cluster ..................................................................... 32 Hình 23 – Minh họa trực quan một phần của sơ đồ cơ sở ............................................................... 35 Hình 24 – Quá trình sinh file cơ sở ................................................................................................... 36 Hình 25 – Nhận diện appliance mới .................................................................................................. 37 Hình 26 – Đã thêm appliance vào cơ sở dữ liệu ............................................................................... 37 Hình 27 – Đã yêu cầu thành công file cơ sở ..................................................................................... 38 Hình 28 – File cơ sở ........................................................................................................................... 39 Hình 29 – Các node trong cluster ...................................................................................................... 40 Hình 30 – Tạo cặp khóa private, public trong lần đầu khởi động terminal .................................... 41 Hình 31 – SSH tới compute-0-0 ........................................................................................................ 42 Hình 32 – Giá trị tham số action với các node trong cluster............................................................ 43 Hình 33 – Các bootaction hiện có...................................................................................................... 44 Hình 34 – Thêm bootaction................................................................................................................ 45 Hình 35 – Các thuộc tính của node compute-0-0 ............................................................................. 46 Hình 36 – Thay đổi giá trị tham số installaction............................................................................... 46 Hình 37 – Giá trị tham số installaction thay đổi ............................................................................... 47 Hình 38 – Loại bỏ một bootaction ..................................................................................................... 48 Hình 39 – Xem các cổng ethernet...................................................................................................... 49 Hình 40 – Mô hình bộ nhớ chia sẻ..................................................................................................... 51 Hình 41 – Mô hình đa luồng .............................................................................................................. 52 Hình 42 – Mô hình truyền thông điệp ............................................................................................... 53 Hình 43 – Mô hình song song dữ liệu ............................................................................................... 54 Hình 44 – MPI trên Rocks ................................................................................................................. 59 x Hình 45 – Output của chƣơng trình Hello World (1) ....................................................................... 61 Hình 46 – Output của chƣơng trình Hello World (2) ....................................................................... 62 Hình 47 – Output của chƣơng trình Hello World (3) ....................................................................... 63 Hình 48 – Output của chƣơng trình Hello World (4) ....................................................................... 64 Hình 49 – Trƣớc khi chạy ứng dụng.................................................................................................. 87 Hình 50 – Sau khi chạy ứng dụng ..................................................................................................... 88 Hình 51 – Output của hg clone .......................................................................................................... 90 Hình 52 – Repository cục bộ.............................................................................................................. 91 Hình 53 – Thƣ mục scratch của các Roll .......................................................................................... 92 Hình 54 – Thƣ mục scratch của Roll java ......................................................................................... 93 Hình 55 – Một phần sơ đồ cơ sở ........................................................................................................ 95 Hình 56 – Minh họa việc liên lạc giữa các tiến trình ..................................................................... 101 Hình 57 – Tính tích phân.................................................................................................................. 103 Hình 58 – Tính toán số PI ................................................................................................................ 104 1 CHƢƠNG 1. GIỚI THIỆU “Đạt tới tốc độ tính toán 1 teraflop là bài toán lớn nhất trong khoa học máy tính trong 2 thập kỷ qua. Chỉ mới 10 năm trước đây, những nhà lãnh đạo đáng tin cậy nhất trong ngành công nghiệp tính toán còn nói rằng điều đó là không thể.” (Gil Weigand) [45] Nếu chúng ta đã từng dùng Google để tìm kiếm thông tin trên Internet, thì hẳn sẽ có lúc chúng ta phải ngạc nhiên trƣớc tốc độ xử lý của cỗ máy tìm kiếm này. Mỗi một giây qua đi, Google tiếp nhận tới hàng nghìn yêu cầu tìm kiếm, và mỗi yêu cầu tìm kiếm đó cần phải đƣợc xử lý qua hàng chục tỷ phép tính với lƣợng dữ liệu truy cập lên đến hàng trăm Megabytes. Ngoài một hệ thống cơ sở dữ liệu đƣợc thiết kế đặc biệt, cùng với những thuật toán khai phá dữ liệu đƣợc tối ƣu hóa, thì bí mật đằng sau tốc độ xử lý của Google chính là hệ thống các cluster với tổng cộng khoảng 15000 máy tính trên toàn thế giới. Google tối thiểu hóa thời gian xử lý đối với mỗi yêu cầu tìm kiếm bằng cách tiến hành xử lý song song mỗi yêu cầu đó. Điều này cũng có nghĩa là Google sẽ xử lý đƣợc nhiều yêu cầu tìm kiếm hơn trong cùng một khoảng thời gian [6]. Google chính là một ví dụ điển hình về vai trò và sự thành công của xử lý song song trong ngành công nghiệp tính toán nói riêng và trong cuộc sống nói chung. Trong thời đại thông tin bùng nổ, con ngƣời càng ngày càng trở nên bận rộn thì nhu cầu của xử lý song song ngày càng đƣợc nâng cao nhằm xử lý đƣợc một lƣợng dữ liệu lớn nhất trong thời gian nhanh nhất có thể. Xử lý song song ngày càng đƣợc quan tâm trên thế giới vì 2 lý do chính sau đây:  Đạt đƣợc hiệu năng cao hơn trong khi tiết kiệm đƣợc thời gian và tiền bạc. Về lý thuyết, càng đầu tƣ nhiều tài nguyên cho một nhiệm vụ nào đó thì càng rút ngắn đƣợc thời gian thực hiện nhiệm vụ đó, đồng thời tiết kiệm đƣợc càng nhiều chi phí. Hơn nữa, nhiều hệ thống xử lý song song có thể đƣợc xây dựng từ những thành phần rẻ tiền và phổ biến.  Khả năng xử lý các bài toán lớn. Nhiều bài toán trong thực tế đòi hỏi tài nguyên tính toán lớn đến mức không một máy tính đơn lẻ nào có thể đáp ứng nổi. Chẳng 2 hạn, các bài toán dạng "Grand Challenge" (Thách Thức Lớn) [16] nhƣ dự báo thời tiết, giải mã bộ gene ngƣời, ... yêu cầu những tài nguyên tính toán đƣợc tính bằng PetaFlops và PetaBytes [23]. Hình 1 – Các lĩnh vực ứng dụng của xử lý song song Nguồn: [4] Những nhu cầu này đã dẫn tới những cơ hội lớn cho xử lý song song, song những thách thức đi kèm cũng không hề nhỏ. Cụ thể, sẽ khó khăn hơn trong việc phát triển các phần mềm phục vụ cho xử lý song song do thiếu các môi trƣờng phát triển và các mô hình lập trình thống nhất và hiệu quả. Việc phát triển thuật toán cũng khó khăn hơn do sự phức tạp của việc xử lý các tác vụ đồng thời. Đó là chƣa kể đến sự phát triển nhanh chóng của công nghệ phần cứng dẫn tới sự lạc hậu nhanh chóng của các kiến trúc xử lý song song. Hệ quả gián tiếp của điều này chính là khả năng mở rộng của hệ thống bị giới hạn, do các thuật toán xử lý song song hiện hành có thể không còn phù hợp với các kiến trúc phần cứng của tƣơng lai. Tại Việt Nam, đã có một vài hệ thống xử lý song song đƣợc nghiên cứu thành công và đƣa vào ứng dụng, đem lại hiệu quả bƣớc đầu, nhƣ hệ thống máy tính bó song song do CADPRO thiết kế cho Trung tâm Quốc gia dự báo khí tƣợng thủy văn [2], hoặc các trung 3 tâm dữ liệu của FPT Telecom, CMC Telecom, Ngân hàng Sài Gòn Thƣơng tín – Sacombank, Ngân hàng Đông Nam Á [3], … Tuy nhiên, số lƣợng không nhiều các hệ thống xử lý song song kiểu này đã chứng tỏ xử lý song song chƣa thực sự phát triển mạnh mẽ ở Việt Nam. Xét về mặt công nghệ, việc xây dựng, quản trị và ứng dụng một hệ thống xử lý song song cũng không phải dễ dàng. Thông thƣờng, chi phí phải trả cho việc quản trị một hệ thống xử lý song song trong 1 năm còn cao hơn nhiều so với chi phí bỏ ra để mua cả hệ thống. Ví dụ, một cluster có tốc độ tính toán 1 TeraFlops có chi phí vào khoảng 100 nghìn US$, gần bằng chi phí phải trả cho một ngƣời quản trị hệ thống trong một năm [39]. Nghiên cứu về xử lý song song vì vậy không chỉ mang ý nghĩa khoa học, mà còn có ý nghĩa thực tiễn rất lớn. Việc nghiên cứu về xử lý song song, từ lý thuyết cho đến ứng dụng, không chỉ giúp chúng ta nắm đƣợc nền tảng công nghệ, mà còn giúp chúng ta nhìn thấy tiềm năng to lớn của xử lý song song trong công nghệ nói riêng và các lĩnh vực kinh tế quốc dân nói chung. Khóa luận này tập trung nghiên cứu tổng quan về xử lý song song nói chung và nghiên cứu cách thức cài đặt, quản trị, kiến trúc hệ thống và ứng dụng của hệ thống cụm máy tính xử lý song song Rocks nói riêng. Ngoài ra, tài liệu còn đƣợc đi kèm với một số ứng dụng MPI tiêu biểu, trong đó có ứng dụng chuyển đổi video mà nội dung chƣơng 5 chính là mô tả chi tiết. 4 CHƢƠNG 2. CÁC KIẾN TRÚC VÀ CÁC HỆ THỐNG XỬ LÝ SONG SONG 2. 1. Các kiến trúc xử lý song song Vào năm 1966, Michael Flynn đã đƣa ra cách phân loại các kiến trúc xử lý song song dựa trên sự khác nhau về các dòng trong tiến trình tính toán. Một dòng là một chuỗi các đối tƣợng (nhƣ dữ liệu), hoặc hành động (nhƣ các chỉ dẫn). Các dòng là độc lập với nhau. Mỗi một phần tử trong dòng có thể chứa một hoặc nhiều đối tƣợng hoặc hành động. Trên cơ sở 2 dòng chính là dữ liệu và chỉ dẫn, Flynn đã đƣa ra 4 tổ hợp, đại diện cho 4 kiểu kiến trúc xử lý song song khác nhau [8]:  SISD (Single Instruction, Single Data Stream - Đơn dòng chỉ dẫn, đơn dòng dữ liệu). Đây thực chất chính là kiến trúc Von Neumann [1, 43]. Hình 2 - SISD Nguồn: [22]  SIMD (Single Instruction, Multiple Data Stream - Đơn dòng chỉ dẫn, đa dòng dữ liệu). Kiến trúc này bao gồm các bộ xử lý vectơ cũng nhƣ các bộ xử lý song song cực lớn (MPP). 5 Hình 3 - SIMD Nguồn: [22]  MISD (Multiple Instruction, Single Data Stream - Đa dòng chỉ dẫn, đơn dòng dữ liệu). Hình 4 - MISD Nguồn: [22]  MIMD (Multiple Instruction, Multiple Data Stream - Đa dòng chỉ dẫn, đa dòng dữ liệu). Kiến trúc này bao gồm các hệ đa vi xử lý truyền thống cũng nhƣ các mạng máy trạm. 6 Hình 5 - MIMD Nguồn: [37] Mỗi một tổ hợp trên đây đặc trƣng cho một lớp kiến trúc máy tính, đồng thời tƣơng ứng với một hình thức xử lý song song. 2. 1. 1. SISD Kiến trúc SISD là kiến trúc quen thuộc nhất, cũng là kiến trúc ít song song nhất. Các hệ thống kiểu này chủ yếu xử lý theo kiểu đƣờng ống, trong đó các giai đoạn khác nhau của tiến trình xử lý một chỉ dẫn đƣợc thực thi song song (kiến trúc này không song song hóa các tiến trình mà song song hóa các giai đoạn của việc thực thi tiến trình). Hình 6 – Xử lý đường ống 5 giai đoạn Nguồn: [37] Công nghệ cài đặt song song hóa các tiến trình xử lý chỉ dẫn đƣợc gọi là song song hóa mức chỉ dẫn (ILP – Instruction Level Parallelism). Hai trong số các kiến trúc bộ xử lý sử dụng phƣơng pháp này là superscalar (siêu thang bậc) và VLIW (Very Long Instruction Word - Kích thƣớc word lớn). Các kiến trúc này lập lịch cho các tác vụ khác nhau để thực thi một cách song song bằng cách phân tích sự phụ thuộc lẫn nhau giữa các tác vụ trong cùng một dòng chỉ dẫn. Với kiến trúc superscalar, việc phân tích đƣợc thực 7 hiện động vào thời điểm chạy, còn với VLIW, việc phân tích là tĩnh vào thời điểm biên dịch. Cả hai kiến trúc này đều có sự cân bằng giữa độ linh động (adaptability) và độ phức tạp (complexity) – các bộ xử lý superscalar linh động nhƣng phức tạp, còn các bộ xử lý VLIW không linh động nhƣng cũng không phức tạp. Cả 2 kiến trúc đều sử dụng các phƣơng pháp biên dịch nhƣ nhau nhằm đạt đƣợc hiệu năng cao. Xu hƣớng hiện tại đối với các bộ xử lý SISD là hƣớng tới kiến trúc superscalar nhằm tận dụng các công nghệ ILP sẵn có. 2. 1. 2. SIMD Lớp kiến trúc SIMD của các bộ xử lý bao gồm các bộ xử lý mảng (Array Processors) và bộ xử lý vectơ (Vector Processors). Các bộ xử lý này là câu trả lời tự nhiên cho việc sử dụng các cấu trúc dữ liệu thƣờng gặp nhƣ vectơ và ma trận. Một bộ xử lý mảng bao gồm nhiều khối xử lý (PU - Processor Unit) hoạt động song song trên nhiều thành phần dữ liệu. Một bộ xử lý vectơ bao gồm một khối xử lý hoạt động tuyến tính trên nhiều thành phần dữ liệu. Cả 2 loại bộ xử lý đều sử dụng một phép toán (operation) để thực thi nhiều hành động (action). Một bộ xử lý mảng phụ thuộc vào kích thƣớc lớn của tập dữ liệu đầu vào để đạt đƣợc hiệu năng cao (vì vậy thƣờng các bộ xử lý này thƣờng đƣợc gọi là các bộ xử lý song song cực lớn (Massively Parallel Processors)). Một bộ xử lý mảng đặc trƣng bao gồm từ hàng trăm đến hàng chục nghìn khối xử lý hoạt động cùng nhau. Một bộ xử lý vectơ cũng phụ thuộc vào sự đơn điệu của các hành động tƣơng tự nhƣ bộ xử lý mảng, nhƣng trên một tập dữ liệu nhỏ hơn, đồng thời dựa vào phƣơng pháp đƣờng ống (pipelining) và nhịp đồng hồ cao nhằm giảm độ trễ của các phép toán. Trên thị trƣờng hiện nay chƣa có nhiều bộ xử lý đƣợc phát triển theo kiến trúc mảng do nhu cầu không cao và hạn chế về số lƣợng ứng dụng. Trong khi đó rất nhiều bộ xử lý theo kiến trúc vectơ đã đƣợc phát triển, đồng thời các bộ xử lý vectơ hiện đại là các bộ xử lý có hiệu năng cao, có thể tuân theo các kiến trúc SIMD hoặc MIMD. 2. 1. 3. MISD Theo Flynn thì không tồn tại máy tính theo kiến trúc này [1]. 8 2. 1. 4. MIMD Kiến trúc MIMD là kiến trúc song song quen thuộc nhất, cũng là hình thức cơ bản nhất của các bộ xử lý song song. Các bộ xử lý MIMD bao gồm nhiều khối xử lý đƣợc kết nối với nhau. Không giống nhƣ các bộ xử lý SIMD, mỗi khối xử lý trong bộ xử lý MIMD thực thi hoàn toàn độc lập (mặc dù cùng một chƣơng trình).Mặc dù về lý thuyết các khối xử lý không cần phải giống nhau, nhƣng thực tế hầu hết các hệ thống MIMD bao gồm các khối xử lý giống nhau. Việc liên lạc giữa các khối xử lý đƣợc thực hiện thông qua một không gian địa chỉ dùng chung (không gian địa chỉ này có thể là toàn cục, cũng có thể đƣợc phân chia giữa các khối xử lý, khi đó nó có tên gọi là bộ nhớ chia sẻ phân tán (Distributed Shared Memory) để phân biệt với bộ nhớ phân tán (Distributed Memory)). Cách xử lý này dẫn đến 2 vấn đề: Một là tính ổn định (consistency) và hai là tính thống nhất (coherence) của dữ liệu. Tính ổn định nói đến việc tham chiếu bộ nhớ – trên cả 2 phạm trù là trong một khối xử lý và giữa các khối xử lý. Tính thống nhất yêu cầu tất cả các khối xử lý đều phải “nhìn thấy” cùng 1 giá trị đối với cùng 1 địa chỉ vùng nhớ. Tính ổn định là hiện, trong khi tính thống nhất là ẩn đối với ngƣời lập trình. Thƣờng thì tính ổn định có thể giải quyết bằng một sự phối hợp giữa các kỹ thuật về phần cứng và phần mềm, trong khi tính thống nhất lại đƣợc giải quyết bằng các kỹ thuật về phần cứng. Các hệ thống tuân theo kiến trúc MIMD bao gồm từ các bộ xử lý truyền thống đến các bộ xử lý độc lập hoạt động thông qua một mạng máy tính. Sự khác nhau giữa các hệ thống này chủ yếu là giữa cách kết nối giữa các khối xử lý trên một bộ xử lý và cách kết nối giữa các bộ xử lý trên một mạng WAN. Tuy nhiên, cả 2 kiểu hệ thống đều có sự cân bằng giữa độ trễ trong liên lạc và giới hạn kích thƣớc của hệ thống. 2. 2. Các hệ thống xử lý song song 2. 2. 1. Các hệ thống tính toán đa nhân Vi xử lý đa nhân (Multicore Processor) là vi xử lý bao gồm nhiều khối chức năng (Functional Unit, Execution Unit, hay “nhân”). Các vi xử lý đa nhân khác các vi xử lý siêu thang bậc (Superscalar Processor) ở chỗ, các vi xử lý đa nhân có thể thực thi nhiều chỉ dẫn từ nhiều nguồn trong một chu kỳ tính toán, còn các vi xử lý siêu thang bậc có thể 9 thực thi nhiều chỉ dẫn từ một nguồn trong một chu kỳ tính toán. Mỗi nhân trong vi xử lý đa nhân có thể là một vi xử lý siêu thang bậc con, theo nghĩa mỗi nhân này có thể thực thi nhiều chỉ dẫn từ một nguồn trong một chu kỳ tính toán. Hình 7 – Mô hình bộ xử lý 2 nhân Nguồn: [36] 2. 2. 2. Các hệ thống đa xử lý đối xứng Hình 8 - SMP Nguồn: [1] Các hệ thống đa xử lý đối xứng (SMP - Symmetric Multiprocessing) thuộc mô hình song song kiểu bộ nhớ dùng chung (Shared Memory). Một hệ thống SMP có từ 2 bộ xử 10 lý giống nhau trở lên, các bộ xử lý này dùng chung bộ nhớ và hệ thống vào – ra, đồng thời đƣợc điều khiển bởi một hệ điều hành duy nhất. Tính đối xứng của các hệ thống SMP thể hiện ở chỗ, thời gian truy cập bộ nhớ là bằng nhau với các bộ xử lý, quyền truy cập (read / write) tới bộ nhớ của các bộ xử lý cũng là nhƣ nhau. Các hệ thống SMP có nhiều ứng dụng trong khoa học, công nghiệp và kinh doanh. Tuy nhiên, những ứng dụng phổ biến nhất nhƣ các hệ xử lý văn bản hoặc các trò chơi trên máy tính thì lại đƣợc viết theo cách không tận dụng đƣợc lợi thế từ các hệ thống xử lý đồng thời. Chẳng hạn, với các trò chơi trên máy tính, nếu nhƣ đƣợc viết để có thể chạy tốt trên các hệ thống SMP, thì lại khiến hiệu năng giảm sút trên các hệ thống đơn vi xử lý (uniprocessor). Các hệ thống đơn vi xử lý và các hệ thống SMP yêu cầu hai phƣơng pháp lập trình khác nhau để đạt đƣợc hiệu năng cao nhất. Vì thế nhà phát triển có thể sẽ phải phát triển và bảo trì cả 2 phiên bản của cùng 1 ứng dụng. Các ứng dụng chạy trên các hệ thống SMP có thể đạt đƣợc hiệu năng cao hơn so với khi chạy trên các hệ thống đơn vi xử lý, ngay cả khi chúng đƣợc viết ra dành cho các hệ thống đơn vi xử lý. Nguyên nhân là vì các ngắt phần cứng thƣờng tạm dừng việc thực thi ứng dụng, trong khi ứng dụng có thể tiếp tục đƣợc thực thi trên một bộ xử lý rỗi. Đối với một số ứng dụng, đặc biệt là các trình biên dịch và các dự án tính toán phân tán, hiệu năng của ứng dụng đƣợc tăng lên khi thêm mới một bộ xử lý. Trong trƣờng hợp có nhiều ứng dụng cùng chạy một lúc, một hệ thống SMP có thể cho hiệu năng tốt hơn một hệ thống đơn vi xử lý, do các ứng dụng có thể đƣợc đồng thời thực thi trên các bộ xử lý một cách đồng thời. 2. 2. 3. Các hệ thống tính toán phân tán Các hệ thống tính toán phân tán (Distributed Computing) là các hệ thống trong đó các đơn vị xử lý đƣợc kết nối với nhau qua một mạng. Các hệ thống kiểu này có khả năng mở rộng rất cao. 2. 2. 3. 1. Các hệ thống tính toán lƣới 11 Các hệ thống tính toán lƣới (Grid Computing) là hình thức “phân tán” nhất của tính toán song song. Các hệ thống này bao gồm các máy tính hoàn chỉnh (có đầy đủ CPU, bộ nhớ, nguồn nuôi, card mạng) kết nối với một mạng (có thể là mạng riêng, mạng chung hoặc thậm chí là mạng internet), sử dụng các giao diện mạng truyền thống nhƣ Ethernet. Đây là điểm khác biệt so với các siêu máy tính: Một siêu máy tính bao gồm nhiều bộ xử lý đƣợc kết nối với nhau bởi một mạng cục bộ bao gồm các bus máy tính tốc độ cao. Hình 9 – Mô hình lưới tính toán Nguồn: [44] Ƣu điểm lớn nhất của tính toán lƣới đó là các điểm lƣới (các máy tính tham gia tính toán) có thể là các máy tính phổ biến, cấu hình trung bình, giá thành rẻ. Sau khi đƣợc nối với nhau thành một lƣới tính toán thì hệ thống lƣới này có thể cung cấp một hệ thống tài nguyên tính toán tƣơng đƣơng với một siêu máy tính nhƣng giá rẻ hơn nhiều. Trong khi đó, nhƣợc điểm lớn nhất của tính toán lƣới lại nằm ở kết nối giữa các điểm lƣới. Tuy nhiên, các ứng dụng đƣợc xử lý song song trên nhiều điểm lƣới một cách độc lập có thể đạt hiệu năng cao trên lƣới, do mỗi điểm lƣới không yêu cầu các kết quả trung gian từ các điểm lƣới khác. 12 2. 2. 3. 2. Các hệ thống xử lý song song cực lớn Các hệ thống xử lý song song cực lớn (MPP – Massive Parallel Processing) là các hệ thống lai giữa 2 mô hình bộ nhớ chia sẻ (Shared Memory) và bộ nhớ phân tán (Distributed Memory). Các hệ thống MPP khắc phục nhƣợc điểm của mô hình bộ nhớ chia sẻ: Các CPU có bộ đệm (Cache) và bộ nhớ (Memory) riêng nên tránh đƣợc xung đột bộ nhớ. Đồng thời, MPP cũng khắc phục nhƣợc điểm của mô hình bộ nhớ phân tán: Đƣờng mạng kết nối có tốc độ cao hơn, độ trễ thấp, các bộ đệm cũng đƣợc kết nối với nhau và sử dụng phần cứng hỗ trợ. Hình 10 - MPP Nguồn: [1] Cách đây một vài năm, các siêu máy tính mạnh nhất đều là các hệ thống MPP [30], nhƣ Earth Simulator, Blue Gene, ASCI,… với số bộ xử lý lên tới hàng nghìn [1]. 2. 2. 3. 3. Các hệ thống tính toán cụm Cụm (Cluster) là khái niệm dùng để chỉ các máy tính độc lập đƣợc kết nối với nhau thành một hệ thống thống nhất thông qua việc sử dụng các phần mềm và các công nghệ 13 kết nối mạng thích hợp. Ở mức độ đơn giản nhất, khi hai hoặc nhiều hơn máy tính đƣợc sử dụng cùng với nhau để giải quyết một vấn đề nào đó, hệ thống hai hoặc nhiều máy tính này đƣợc xem nhƣ một cluster. Ở mức độ tổng quát, ta có thể định nghĩa cluster nhƣ là một nhóm các máy tính độc lập có khả năng làm việc cùng nhau nhƣ một máy tính duy nhất, nhằm mục tiêu tăng cƣờng sức mạnh tính toán, khả năng đáp ứng và giảm rủi ro khi xảy ra lỗi cục bộ cho các ứng dụng hoặc các dịch vụ. Trong số 500 siêu máy tính (danh sách cập nhật mới nhất là vào tháng 11 / 2009) thì hầu hết đều là các hệ thống cluster. Hình 11 – Thống kê về kiến trúc của 500 siêu máy tính Nguồn: [45] HPC Cluster, viết tắt của High Performance Computing Cluster, là loại cluster đƣợc sử dụng để tăng cƣờng hiệu năng cho các ứng dụng tính toán phức tạp bằng cách "chia nhỏ" các tác vụ tính toán này ra các máy con trong cluster. Các cluster kiểu này thƣờng chạy các chƣơng trình đƣợc thiết kế đặc biệt để tận dụng khả năng tính toán song song của hệ thống. Chúng đƣợc tối ƣu hóa cho các tiến trình đƣợc thực thi đồng thời trên các máy con trong cluster, nhƣng có "liên lạc" trong quá trình thực thi; các tiến trình này bao gồm cả những tác vụ tính toán phụ thuộc lẫn nhau (kết quả tính toán từ máy con này có tác động đến kết quả tính toán tiếp theo của máy con khác). 14 HPC Cluster thƣờng đƣợc dùng cho các bài toán khoa học nên còn có tên khác là Scientific Cluster. Ngoài ra, có một loại HPC Cluster đặc thù sử dụng Linux làm hệ điều hành và các phần mềm miễn phí để cung cấp khả năng tính toán song song. Loại HPC Cluster này đƣợc gọi là Beowulf Cluster. "Các phần mềm miễn phí" nói đến ở đây bao gồm cả các API messaging phổ biến nhƣ Message Passing Interface (MPI) hoặc Parallel Virtual Machine (PVM) [29]. Hình 12 – Mô hình của HPC Cluster Nguồn: [5] Các hệ thống HPC Cluster đạt đƣợc hiệu năng cao là nhờ tăng cƣờng đƣợc băng thông và giảm đƣợc độ trễ trên đƣờng truyền. Sở dĩ nhƣ vậy là vì chúng thƣờng không sử dụng những giao thức mạng nhƣ TCP/IP. Mặc dù TCP/IP rất lý tƣởng cho mạng Internet, nhƣng nó không thực sự phù hợp khi áp dụng cho một hệ thống các máy tính rất gần nhau, đặc biệt là khi các máy tính trong cluster đƣợc biết về sự hiện diện của nhau. Thay vì đó, nhiều hệ thống HPC tiến hành truy cập bộ nhớ trực tiếp (DMA - Direct Memory Access) giữa các máy con trong cluster. Các máy con trong cluster có thể sử dụng chung 15 một hệ thống bộ nhớ phân tán, đồng thời sử dụng một hệ thống truyền thông điệp đƣợc tối ƣu hóa nhằm liên lạc giữa các máy trong cluster. MPI (Message Passing Interface) là một trong những hệ thống truyền thông điệp phổ biến nhất trong các cluster, đƣợc dùng nhƣ tầng liên lạc giữa các hệ thống cluster song song. MPI có nhiều biến thể nhƣng sử dụng chung một API nhằm giúp các developer dễ dàng phát triển các ứng dụng tính toán song song mà không cần phải quan tâm đến chi tiết cài đặt của hệ thống. Các hệ thống Beowulf đƣợc nói bên trên là một trong nhiều hệ thống HPC sử dụng MPI làm tầng liên lạc trong cluster. Một trong số các hệ thống cluster tiêu biểu chính là Rocks. Rocks ra đời tại Đại học California với mục tiêu đơn giản hóa quá trình xây dựng một cluster [18]. Rocks là một hệ thống tính toán cụm hết sức mạnh mẽ đã có lịch sử 10 năm phát triển [18] và 1632 cluster đã đăng ký [41]. Sử dụng Rocks, các nhà phát triển có thể xây dựng một HPC Cluster hết sức nhanh chóng (cluster Rockstar (đứng thứ 201 trong danh sách 500 siêu máy tính, số liệu tháng 11/2003) đƣợc xây dựng trong vòng dƣới 2 giờ [39]). Đây cũng là lý do khóa luận nàyxem Rocks nhƣ một hệ thống xử lý song song tiêu biểu. Hình 13 – Rockstar cluster Nguồn: [39] 16 CHƢƠNG 3. HỆ THỐNG ROCKS 3. 1. Giới thiệu 3. 1. 1. Tổng quan Rocks là một trong những giải pháp mã nguồn mở tốt nhất hiện nay để xây dựng một HPC cluster. Rocks do Đại học California phát triển dựa trên CentOS với một mục tiêu đơn giản: "Make Clusters Easy" [18]. Một cluster đƣợc xây dựng bởi Rocks sẽ bao gồm 2 thành phần: Thành phần frontend (frontend node), đƣợc dùng để quản lý các gói phần mềm và các tác vụ tính toán trên cluster, và thành phần compute (compute node), cung cấp sức mạnh tính toán cho cluster. Quá trình xây dựng một cluster bằng Rocks có rất nhiều thuận lợi nhƣ dƣới đây:  Tất cả các máy con (frontend node hoặc các compute node) đều yêu cầu tài nguyên ở mức trung bình, có thể dễ dàng đáp ứng đƣợc bởi một máy tính có cấu hình phổ biến hiện nay. Rocks yêu cầu tối thiểu 30GB ổ cứng và 1GB bộ nhớ cho mỗi máy con. Ngoài ra, đối với máy frontend, Rocks yêu cầu 2 cổng ethernet.  Việc cài đặt máy frontend có thể thực hiện gần tƣơng tự nhƣ cài đặt một máy Linux thông thƣờng, toàn bộ các package cần cho quá trình cài đặt đƣợc chứa gọn trong một DVD không quá lớn về kích thƣớc nếu nhƣ so với các DVD phân phối của các distro nổi tiếng nhƣ Fedora hay CentOS.  Việc cài đặt các máy compute đƣợc thực hiện gần nhƣ tự động, do đó cho phép cài đặt hàng loạt các compute node, rút ngắn quá trình xây dựng cluster. Ngoài những thuận lợi về quá trình cài đặt, Rocks đem lại nhiều lợi thế trong việc xây dựng một cluster HPC, bao gồm:  Rocks có thể tùy biến. Rocks không lệ thuộc vào các giải pháp của một nhà cung cấp cụ thể nào. Trong quá trình cài đặt, có thể sửa lại cấu trúc ổ đĩa cho phù hợp với nhu cầu. Thậm chí, ngƣời dùng còn có thể tùy biến kernel của Rocks để sử 17 dụng. Nếu ngƣời dùng muốn thay đổi nhiều hơn nữa, chỉ cần chỉnh sửa một file XML, build lại và sau đó cài đặt lại các máy con.  Rocks sử dụng các Roll với mỗi Roll nhƣ là một tập các package cần thiết để thi hành một loại hình tính toán hay tiện ích cụ thể.  Rocks làm giảm tải sự khó khăn trong việc quản lý cluster bằng cách cung cấp sẵn nhiều công cụ khác nhau để trợ giúp cho ngƣời quản trị hệ thống, chẳng hạn, mỗi cluster sẽ có một trang web cho biết trạng thái hiện tại của cluster. 3. 1. 2. Kiến trúc của HPC Cluster sử dụng Rocks Xem xét sơ đồ dƣới đây, chúng ta có thể thấy frontend node đóng vai trò nhƣ là giao diện giữa cluster và ngƣời sử dụng. Hình 14 – Kiến trúc của Rocks Nguồn: [5] 18 Frontend node yêu cầu 2 kết nối: Một kết nối private, nối với mạng các compute node (qua switch chẳng hạn), một kết nối public, cho phép các máy tính từ ngoài cluster có thể truy cập đến. 3. 1. 3. Rocks và Rolls Một Roll thực chất là một hoặc một tập các gói phần mềm nhằm thực thi một loại tác vụ nhất định nào đó, bao gồm các tác vụ truyền thống của một HPC Cluster (các tác vụ tính toán), và các tác vụ chung cho tất cả các cluster (các tác vụ quản lý cluster). Một hệ thống cluster Rocks cơ bản bao gồm 4 roll: Kernel, OS, Web Server và Base. Các roll khác cung cấp các tác vụ nâng cao về tính toán, quản trị các tác vụ tính toán và quản trị cluster, nhƣ:  Roll SGE (SUN Grid Engine): Đây là một trong những Roll quan trọng nhất đƣợc phân phối kèm theo Rocks [7]. Roll này chịu trách nhiệm lập lịch, điều hƣớng và quản lý các tác vụ của ngƣời dùng trên toàn cluster. SGE đƣợc sử dụng rất rộng rãi trong các cluster hoặc các hệ thống tính toán lƣới. SGE giúp tận dụng tối đa sức mạnh xử lý song song trong hệ thống. Việc quản lý SGE đƣợc thực hiện hoàn toàn bằng command line, nhƣng cũng có thể đƣợc hiển thị dƣới dạng hình ảnh, chẳng hạn thông qua Roll Ganglia.  Roll Ganglia cho phép ngƣời quản trị và ngƣời dùng hệ thống có thể quản trị hiệu năng của cluster thông qua giao diện web trên máy frontend. Các báo cáo sinh bởi Ganglia bao gồm số lƣợng node đang hoạt động và tỉ lệ CPU và bộ nhớ đƣợc sử dụng. Ngoài ra Ganglia cũng cho phép ngƣời dùng xem các tác vụ đang nằm trong hàng đợi của cluster. 19 Hình 15 – Một báo cáo sinh bởi Ganglia 20 3. 2. Cài đặt 3. 2. 1. Cấu hình Phiên bản Rocks đƣợc khóa luận sử dụng là 5.2 (phiên bản mới nhất là 5.3). Để thuận tiện cho quá trình cài đặt, ta nên download file ISO DVD (2.27GB) từ website chính thức của Rocks ( File này chỉ cần thiết cho quá trình cài đặt frontend. Cấu hình yêu cầu tối thiểu để cài đặt frontend node là:  Ổ cứng: 30GB  RAM: 1GB  Ethernet: 2 cổng Cấu hình yêu cầu tối thiểu để cài đặt compute node là:  Ổ cứng: 30GB  RAM: 1GB  Ethernet: 1 cổng Lƣu ý rằng trong 2 cổng ethernet của frontend node thì một cổng là private, một cổng là public. Cổng private đƣợc dùng để liên lạc với các máy compute node, do đó cần thiết lập sao cho các máy compute node và máy frontend node cùng nằm trong một mạng LAN. Do hạn chế về độ dài tài liệu nên ở đây chỉ lƣu ý những bƣớc cài đặt cơ bản. 3. 2. 2. Cài đặt frontend Khởi động frontend. Mặc định frontend sẽ boot từ ổ DVD. Màn hình tùy chọn cài đặt hiện ra. Gõ build rồi nhấn Enter. Lƣu ý màn hình này chỉ hiện ra trong một thời gian ngắn, vì thế cần thao tác nhanh. 21 Hình 16 – Màn hình khởi động Sau khi nạp các dữ liệu cần thiết cho quá trình cài đặt, Rocks sẽ yêu cầu ngƣời dùng chọn các Roll cần thiết. 22 Hình 17 – Lựa chọn Roll (1) Lƣu ý chọn CD/DVD-based Roll, và ở màn hình tiếp theo, chọn 4 Roll: Base, OS, Kernel và Web Server. Có thể chọn thêm các Roll khác nếu muốn. 23 Hình 18 – Lựa chọn Roll (2) Sau khi nhấn Submit, tất cả các thông tin để mặc định. Ở bƣớc Disk Partitioning, chọn Auto. 24 Hình 19 - Phân chia ổ Rocks sẽ tiến hành cài đặt trong một thời gian tƣơng đối lâu. Sau khi cài đặt xong Rocks sẽ tự khởi động lại, sau đó ta có thể đăng nhập với tài khoản root để bắt đầu sử dụng. 3. 2. 3. Cài đặt hàng loạt các compute node Khởi động Root Terminal trên frontend và gõ insert-ethers. Chọn Compute và nhấn OK. 25 Hình 20 – Lựa chọn appliance type Thiết lập chế độ PXE Boot đối với tất cả các compute node và khởi động các máy này. Rocks sẽ tự động cài đặt hàng loạt trên các máy compute node. Sau khi tất cả các compute node đều đã bắt đầu quá trình cài đặt (để an toàn, có thể chờ cho đến khi tất cả các máy cài đặt xong), ta có thể thoát insert-ethers bằng cách nhấn F8. Nhƣ vậy chúng ta đã có một cluster Rocks sẵn sàng sử dụng. 3. 3. Kiến trúc hệ thống 3. 3. 1. Quy tắc đặt tên của Rocks Một cluster thƣờng đƣợc tổ chức thành các Rack, trong mỗi Rack lại có một hoặc nhiều máy con (Rank). Các Rack này thƣờng đƣợc đặt thành một hàng trên sàn. Nếu nhƣ cluster là rất lớn, thì số lƣợng Rack trở nên khá nhiều, khi đó các Rack có thể đƣợc sắp thành nhiều hàng, tuy nhiên, bằng cách áp dụng quy tắc đếm từ trên xuống dƣới, từ trái sang phải, ta luôn luôn có thể quan niệm các Rack trong trƣờng hợp này đƣợc sắp thẳng hàng. Còn các Rank trong mỗi Rack thì thƣờng đƣợc xếp thành hàng dọc từ dƣới lên. Do đặc điểm này, chúng ta có thể quan niệm mỗi compute node trong cluster nhƣ một điểm trên hệ tọa độ Oxy mà Oy là trục ứng với các Rack, còn Ox là trục ứng với các Rank. Đi 26 từ trái sang phải (theo quy tắc đếm bên trên) chỉ số Rack tăng dần từ 0. Đi từ dƣới lên trên, chỉ số Rank tăng dần từ 0. Áp dụng quan niệm này, Rocks mặc định đặt tên các compute node theo định dạng -- với đƣợc định nghĩa là compute (do đó định dạng sẽ là compute--, ví dụ compute-0-0 là máy ở Rack đầu tiên tính từ bên trái và Rank đầu tiên (của Rack đó) tính từ bên dƣới). Do Rocks lƣu thông tin của các compute node vào cơ sở dữ liệu, nên số lƣợng các Rack và Rank của một cluster là có giới hạn. Tuy nhiên, con số này là rất lớn, vì Rocks dùng đến 11 chữ số để đánh chỉ số cho các node, vì thế về lý thuyết có thể coi nhƣ số lƣợng compute node là vô hạn. Có thể khẳng định điều này bằng cách xem xét mô tả bảng nodes nhƣ dƣới đây: +---------------+-----------------------+------+-----+---------+ | Field | Type | Null | Key | Default | +---------------+-----------------------+------+-----+---------+ | ID | int(11) | NO | PRI | NULL | | Name | varchar(128) | YES | | NULL | | Membership | int(11) | YES | | 2 | | CPUs | int(11) | NO | | 1 | | Rack | int(11) | YES | | NULL | | Rank | int(11) | YES | | NULL | | Arch | varchar(32) | YES | | NULL | | OS | enum('linux','sunos') | NO | | linux | | RunAction | varchar(64) | YES | | os | | InstallAction | varchar(64) | YES | | install | +---------------+-----------------------+------+-----+---------+ Các giá trị lƣu trong bảng nodes: mysql> select Name, Membership, Rack, Rank, RunAction, InstallAction from nodes; +-------------+------------+------+------+-----------+---------------+ | Name | Membership | Rack | Rank | RunAction | InstallAction | +-------------+------------+------+------+-----------+---------------+ | cluster | 1 | 0 | 0 | os | install | 27 | compute-0-0 | 2 | 0 | 0 | os | install | | compute-0-1 | 2 | 0 | 1 | os | install | +-------------+------------+------+------+-----------+---------------+ 3 rows in set (0.00 sec) Thông thƣờng khi cài đặt một cluster, ngƣời quản trị sẽ cài đặt hàng loạt các compute node theo từng Rack, nghĩa là, đầu tiên cài đặt hàng loạt các compute node trong Rack số 1 (index là 0) bằng cách bật các máy trong Rack theo thứ tự từ dƣới lên, sau khi cài xong tiếp tục cài đặt các compute node trong rack số 2, ... Mặc dù về lý thuyết Rocks hỗ trợ việc cài đặt hàng loạt, nên ta có thể cài đặt một cluster hàng nghìn máy tính chỉ trong một thời gian không quá dài so với thời gian cài đặt một compute node thông thƣờng, nhƣng việc cài đặt theo từng rack giúp công việc quản trị và bảo trì các máy tính trong cluster dễ dàng hơn, vì nó cho phép ánh xạ một cách chính xác chỉ số Rack và Rank của từng compute node trong cơ sở dữ liệu với vị trí vật lý của compute node đó trong khu vực đặt cluster. Để làm nhƣ vậy, ngƣời quản trị thực thi command sau để cài đặt các compute node cho Rack thứ n + 1: insert-ethers -rack n Ví dụ, để cài đặt hàng loạt các compute node cho rack thứ nhất, thực thi: insert-ethers -rack 0 Với command này thì các compute node trong rack số 1 sẽ đƣợc đặt tên lần lƣợt là compute-0-0, compute-0-1, ... Lƣu ý rằng, Rocks đánh số các compute node theo thứ tự request DHCP mà nó nhận đƣợc, nên nếu muốn ánh xạ một cách chính xác chỉ số rank trong cơ sở dữ liệu với vị trí vật lý của nó, thì ngƣời quản trị cần bật các compute node theo thứ tự từ dƣới lên. Nếu nhƣ không có tham số -rack thì Rocks sẽ hiểu các compute node đang gửi yêu cầu là các compute node trong Rack số 0, và do đó tên của các compute node sẽ là compute-0-0, compute-0-1, ... bất kể Rack đang cài đặt là Rack bao nhiêu. 28 Giá trị của trong định dạng bên trên đƣợc định nghĩa là compute, nên các compute node sẽ có tên bắt đầu bằng compute. Để thay đổi giá trị này ta thực thi command: insert-ethers --basename mybasename Tên đƣợc đặt của các compute node sẽ đƣợc dùng trong các tác vụ tính toán và quản trị về sau. Chúng ta có thể kể ra đây 2 ví dụ về việc sử dụng tên này: Ví dụ 1: Khi tính toán, để chỉ ra các compute node sẽ tham gia vào tác vụ tính toán, chúng ta sử dụng một file trong đó ghi tên của các compute node (có thể bao gồm cả frontend node mặc dù không khuyến khích điều này), mỗi tên một dòng: compute-0-0 compute-0-1 localhost (có thể dùng tham số -hosts để thay thế file danh sách cũng đƣợc) Ví dụ 2: Khi quản trị, ta dùng tên đã đặt của compute node để quản trị node đó. Ví dụ, muốn xóa một compute node là compute-0-0 khỏi cluster ta thực thi command: rocks remove host compute-0-0 Sau đó update các file cấu hình nhờ lệnh rocks sync config 3. 3. 2. Về cơ sở dữ liệu cluster Rocks sử dụng một cơ sở dữ liệu MySQL để lƣu giữ các thông tin về cluster. Các thông tin này bao gồm: Các máy con (node), thông tin về các phân vùng, các tham số khởi động và một số thông tin khác. Từ các thông tin này, một số file cấu hình liên quan sẽ đƣợc sinh và sử dụng khi cần thiết. Quá trình sinh file cấu hình diễn ra khi có bất kỳ máy con nào đƣợc thêm vào hay xóa khỏi cluster. 29 Hình 21 – Vai trò trung tâm của cơ sở dữ liệu SQL Nguồn: [40] Đối với bản 5.2, cơ sở dữ liệu đƣợc sử dụng có tên là cluster. Dƣới đây là danh sách các bảng đƣợc phiên bản 5.2 sử dụng: aliases app_globals appliance_attributes appliance_routes appliances boot bootaction bootflags distributions global_attributes 30 global_routes memberships networks node_attributes node_rolls node_routes nodes os_attributes os_routes partitions rolls subnets Nếu chúng ta query bảng nodes, ta sẽ nhận đƣợc danh sách các máy con hiện có trong cluster: mysql> select Name, Membership, Rack, Rank, RunAction, InstallAction from nodes; +-------------+------------+------+------+-----------+---------------+ | Name | Membership | Rack | Rank | RunAction | InstallAction | +-------------+------------+------+------+-----------+---------------+ | cluster | 1 | 0 | 0 | os | install | | compute-0-0 | 2 | 0 | 0 | os | install | | compute-0-1 | 2 | 0 | 1 | os | install | +-------------+------------+------+------+-----------+---------------+ 3 rows in set (0.00 sec) Cơ sở dữ liệu cluster đóng vai trò là xƣơng sống của cluster, tuy nó không trực tiếp tham gia vào quá trình vận hành của cluster, nhƣng lại đóng vai trò dữ liệu nguồn trong việc sinh ra các file cấu hình giúp cluster hoạt động nhƣ ý muốn. Trong các phiên bản trƣớc 5.2, Rocks cho phép ngƣời quản trị có thể thao tác với cơ sở dữ liệu này thông qua công cụ MySQL nhƣ thao tác với một cơ sở dữ liệu thông thƣờng. Sự cho phép này ẩn chứa những nguy hiểm tiềm tàng, vì những lý do sau:  Để thao tác đƣợc một cách an toàn với cơ sở dữ liệu này, ngƣời quản trị cần phải hiểu hoàn toàn kiến trúc của cơ sở dữ liệu, nội dung từng bảng, từng trƣờng trong 31 bảng, ...; đồng thời trong quá trình thao tác phải hết sức cẩn thận, nhất là khi thao tác có liên quan đến các ràng buộc giữa các bảng trong cơ sở dữ liệu hoặc các trƣờng có sự dƣ thừa dữ liệu. Chúng ta có thể đƣa ra một ví dụ chung chung nhƣ sau: Có một bảng với một trƣờng thống kê số lƣợng máy tính trong cụm, một bảng khác liệt kê mỗi máy tính một bản ghi, khi đó giá trị trƣờng thống kê trong bảng 1 phải bằng số lƣợng bản ghi trong bảng 2. Khi đó nếu muốn thêm 1 máy tính vào cơ sở dữ liệu, ngƣời dùng phải thao tác trên 2 bảng thay vì 1.  Khi cập nhật hệ thống (yum update chẳng hạn!), ngƣời quản trị có thể vô hình phá hủy cả cơ sở dữ liệu! Chúng ta có thể xem xét ảnh chụp màn hình của một slide chính thức giới thiệu về Rocks bên dƣới đây [40]. Hình ảnh này cho thấy Rocks 4.x vẫn xem việc sử dụng SQL trực tiếp để thao tác với cơ sở dữ liệu trung tâm là một phƣơng pháp hiệu quả! 32 Hình 22 – Thao tác trực tiếp với cơ sở dữ liệu cluster Bản 5.2 giải quyết vấn đề trên bằng cách cô lập cơ sở dữ liệu này, theo nghĩa không cho phép thao tác trực tiếp bằng công cụ MySQL. Tác dụng của nó là:  Giải quyết đƣợc trƣờng hợp ràng buộc giữa các bảng, hoặc dƣ thừa dữ liệu.  Tăng ngữ nghĩa của câu lệnh.  Không đòi hỏi ngƣời quản trị phải hiểu về cơ sở dữ liệu này, thậm chí, không đòi hỏi ngƣời quản trị phải biết đến sự tồn tại của cơ sở dữ liệu này!  Giới hạn những thay đổi mà ngƣời dùng (kể cả root!) có thể tác động đến cơ sở dữ liệu.  Bảo vệ cơ sở dữ liệu khỏi tác động của những thao tác hết sức thông thƣờng nhƣ update hệ thống. 33 Để thao tác với cơ sở dữ liệu, ngƣời dùng phải tiến hành thông qua một giao diện, đó là hệ thống các câu lệnh. Ví dụ, chúng ta xem xét bảng bootaction có cấu trúc nhƣ sau: mysql> describe bootaction; +---------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | Action | varchar(256) | YES | | NULL | | | Kernel | varchar(256) | YES | | NULL | | | Ramdisk | varchar(256) | YES | | NULL | | | Args | varchar(1024) | YES | | NULL | | +---------+---------------+------+-----+---------+----------------+ 5 rows in set (0.01 sec) Bảng này lƣu các giá trị bootaction trong hệ thống. mysql> describe bootaction; +---------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+---------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | Action | varchar(256) | YES | | NULL | | | Kernel | varchar(256) | YES | | NULL | | | Ramdisk | varchar(256) | YES | | NULL | | | Args | varchar(1024) | YES | | NULL | | +---------+---------------+------+-----+---------+----------------+ 5 rows in set (0.12 sec) mysql> select Action, Kernel, Ramdisk from bootaction; +------------------+-----------------------+---------------------+ | Action | Kernel | Ramdisk | +------------------+-----------------------+---------------------+ | install | vmlinuz-5.2-i386 | initrd.img-5.2-i386 | | os | localboot 0 | NULL | | memtest | kernel memtest | NULL | | install headless | vmlinuz-5.2-i386 | initrd.img-5.2-i386 | 34 | rescue | vmlinuz-5.2-i386 | initrd.img-5.2-i386 | | pxeflash | kernel memdisk bigraw | pxeflash.img | +------------------+-----------------------+---------------------+ 6 rows in set (0.00 sec) Để thêm một bootaction, ngƣời dùng có thể dùng câu lệnh: rocks add bootaction action="install headless noacpi" kernel="vmlinuz- 5.2-i386" ramdisk="initrd.img-5.2-i386 ks ramdisk_size=150000 lang= devfs=nomount pxe kssendmac selinux=0 noipv6 headless vnc acpi=off" Thay vì dùng công cụ MySQL: insert into bootaction (Action, Kernel, Ramdisk, Args) values ('install headless noacpi', 'vmlinuz-5.2-i386', 'initrd.img-5.2-i386', 'ks ramdisk_size=150000 lang= devfs=nomount pxe kssendmac selinux=0 noipv6 headless vnc acpi=off'); 3. 3. 3. Về sơ đồ cơ sở, file cơ sở và quá trình cài đặt một compute node Trái tim của Rocks là một "sơ đồ cơ sở" (Kickstart Graph). Sơ đồ cơ sở này là một cấu trúc cây dựa trên XML, biểu diễn kiến trúc bên trong và các thiết bị đang tồn tại trong cluster. Cạnh nối giữa các nút trong sơ đồ cơ sở cho biết package nào cần cài đặt trên thiết bị nào. Các cạnh nối này có thể đƣợc tạo bằng cách chỉnh sửa các file XML của Rocks, nhờ đó có thể thay đổi đƣợc các package cần cài đặt trên mỗi thiết bị. 35 Hình 23 – Minh họa trực quan một phần của sơ đồ cơ sở Sơ đồ cơ sở đóng vai trò nhƣ DNA của toàn cluster. Một cluster có thể bao gồm nhiều loại node khác nhau nhƣ compute node, fontend node, …. Mỗi một loại node này lại yêu cầu một tập hợp phần mềm đặc thù. Tập hợp các phần mềm đặc thù này đƣợc mô tả trong “file cơ sở” (Kickstart File), file này đƣợc sinh từ sơ đồ cơ sở và đƣợc yêu cầu bởi các node trong quá trình cài đặt. Việc sử dụng sơ đồ cơ sở để mô tả cluster giúp Rocks định nghĩa một cách hiệu quả từng loại node mà không cần khai báo lặp các thành phần giống nhau (tƣơng tự nhƣ cơ thể các động vật có vú giống nhau đến 80% bộ gene, các loại node khác nhau của Rocks cũng giống nhau ở phần lớn các phần mềm đƣợc dùng). Sơ đồ cơ sở có thể mô tả đƣợc sự khác nhau giữa các loại node mà không cần khai báo lặp những thành phần giống nhau. Sơ đồ cơ sở và file cơ sở giúp Rocks thay đổi hoàn toàn cách thức cài đặt hệ thống thông thƣờng, do nó giúp trừu tƣợng hóa sự khác nhau về phần cứng của các node, cho phép tự động nhận diện các module phần cứng cần phải dùng (nhƣ các loại hệ thống đĩa SCSI, IDE, RAID; các cổng ethernet và các cổng mạng tốc độ cao) [47]. Có thể nói đây là một nhân tố quan trọng giúp Rocks đạt mục tiêu ban đầu – Làm cho cluster trở nên dễ dàng. 36 Về quá trình sinh file cơ sở, ta có thể xem xét sequence diagram dƣới đây: Hình 24 – Quá trình sinh file cơ sở Nguồn: [12] Chúng ta sẽ xem lại quá trình cài đặt một compute node diễn ra nhƣ thế nào. Khi máy frontend nhận đƣợc request DHCP đầu tiên, thì một thông báo hiện ra cho biết Rocks đã phát hiện đƣợc một computer appliance mới. 37 Hình 25 – Nhận diện appliance mới Tiếp đó, thông báo hiện thị cho biết Rocks đã thêm các thông tin về computer appliance mới vào database và update tất cả các file cấu hình: Hình 26 – Đã thêm appliance vào cơ sở dữ liệu Một lát sau, ta sẽ thấy có một thay đổi nhỏ trong thông báo trên: 38 Hình 27 – Đã yêu cầu thành công file cơ sở Dấu (*) bên cạnh tên compute node cho biết compute node đã request thành công file cơ sở. Tới đây, nhiệm vụ của insert-ethers xem nhƣ kết thúc, mặc dù quá trình cài đặt trên compute node vẫn còn tiếp diễn [42]. File cơ sở là một file text ASCII thông thƣờng, chứa các thông tin về tên của các package cần cài đặt và các command cần thực thi. File này đƣợc mã hóa và gửi đến compute node đã yêu cầu. Hơn thế nữa, chỉ có các compute node đã đƣợc frontend nhận diện mới có thể gửi yêu cầu file này. File cơ sở không tồn tại trên frontend mà nó đƣợc sinh bởi frontend khi nhận đƣợc yêu cầu từ compute node. File này không tuân theo một định dạng có thể lập trình đƣợc [13], tuy nhiên vẫn có cấu trúc cụ thể, bao gồm 3 phần là pre-configuration, package list và post-configuration trong đó phần phức tạp nhất là post-configuration. 39 Dƣới đây là hình ảnh minh họa thành phần của file cơ sở. Hình 28 – File cơ sở Nguồn: [13] 3. 4. Quản trị 3. 4. 1. Tổng quan Nếu nhƣ không kể đến phƣơng pháp quản lý cluster trực quan bằng Ganglia, thì phƣơng pháp hiệu quả nhất và cũng là duy nhất để quản trị một cluster Rocks chính là thao tác bằng dòng lệnh. Thực chất, hệ thống các dòng lệnh mà Rocks cung cấp này chính là giao diện giữa ngƣời dùng và cơ sở dữ liệu cluster. Bằng cách này, Rocks giới hạn các thay đổi mà ngƣời quản trị có thể tác động đến cơ sở dữ liệu, nhờ đó bảo đảm an toàn cho các thông tin đƣợc xem là tối quan trọng đối với hoạt động của cluster. Trên thực tế quá trình update các thông tin cấu hình của cluster diễn ra qua 2 giai đoạn: 40  Sử dụng một lệnh trong hệ thống lệnh do Rocks cung cấp để thao tác với cơ sở dữ liệu (ví dụ rocks set host).  Sinh các file cấu hình dựa trên các thông tin vừa đƣợc cập nhật trong cơ sở dữ liệu (ví dụ rocks sync config). Các lệnh ứng với các giai đoạn (1) và (2) nêu trên không nhất thiết phải đi kèm với nhau. Ngƣời quản trị có thể dùng nhiều lệnh dạng (1) để cập nhật cơ sở dữ liệu và sau đó dùng lệnh dạng (2) để sinh các file cấu hình. Dƣới đây là output khi thực thi lệnh rocks list host. Thực chất đây là một phần nội dung của bảng nodes trong cơ sở dữ liệu cluster. Hình 29 – Các node trong cluster 3. 4. 2. Frontend quản trị cluster nhƣ thế nào? Để có thể mở kết nối SSH tới một máy mà không cần gõ password, khóa public của ngƣời dùng trên máy cục bộ cần đƣợc thêm vào file $HOME/.ssh/authorized_keys trên máy cần kết nối. Đối với Rocks, khi ngƣời dùng đăng nhập lần đầu tiên, nếu file $HOME/.ssh/id_rsa chƣa tồn tại thì ngƣời dùng sẽ đƣợc yêu cầu tạo mới cặp khóa SSH. Điều này đúng với tất cả ngƣời dùng trên hệ thống, kể cả root. Chính vì vậy, trong lần đầu tiên khởi động terminal, ngƣời dùng sẽ gặp một màn hình nhƣ sau: 41 Hình 30 – Tạo cặp khóa private, public trong lần đầu khởi động terminal Một điều chú ý quan trọng: khi hệ thống yêu cầu nhập passphrase, ngƣời dùng chỉ cần nhấn Enter để bỏ qua (không nhập bất kỳ ký tự nào khác). Sau khi cặp khóa SSH của ngƣời dùng đƣợc tạo, khóa public sẽ đƣợc copy vào file $HOME/.ssh/authorized_keys. Trên máy frontend, thƣ mục home của root không đƣợc mount bằng NFS trên tất cả các máy compute nên file $HOME/.ssh/authorized_keys sẽ đƣợc đưa vào file cơ sở và đƣợc phân phối tới các máy compute trong quá trình cài đặt. Đối với ngƣời dùng root trên frontend, việc thiết lập cặp khóa SSH là rất quan trọng do các tác vụ quản trị của root đều yêu cầu SSH đến các compute node. Chẳng hạn, lệnh cluster-fork poweroff phân phối lệnh poweroff tới tất cả các máy trong cluster thông qua SSH. 42 Hình 31 – SSH tới compute-0-0 Trong phần dƣới đây, chúng ta sẽ tìm hiểu 2 tác vụ quản trị cơ bản và quan trọng nhất đối với cluster Rocks. 43 3. 4. 3. Các tác vụ quản trị cơ bản 3. 4. 3. 1. Cài đặt lại một compute node trong lần boot PXE tiếp theo Kể từ phiên bản Rocks 4.3, thứ tự boot ƣu tiên set trong BIOS đƣợc khuyến cáo là:  CDROM  PXE boot  Hard disk Do PXE boot đứng trƣớc Hard disk, nên chúng ta có thể cho rằng thiết lập nhƣ thế này trong BIOS sẽ khiến các compute node liên tục cài lại mỗi lần reboot. Tuy nhiên, giá trị mặc định ứng với tham số action (sẽ mô tả dƣới đây) cho phép hệ thống bỏ qua quá trình PXE boot và thực thi quá trình boot trên thiết bị tiếp theo trong danh sách kể trên (ở đây là Hard disk) (cũng từ đây ta có thể thấy vai trò của insert-ethers: Nhận diện các thiết bị (bao gồm máy con, thiết bị mạng, ..., gọi chung là appliance) và thêm các thông tin cần thiết vào database, chứ không có vai trò gì trong quá trình cài đặt của từng máy con. Chính vì vậy khi cài đặt lại các máy con ta không cần thiết phải khởi động insert-ethers do các thông tin cần thiết đã có trong cơ sở dữ liệu rồi.). Các thuộc tính của quá trình boot PXE có thể đƣợc thiết lập nhờ thay đổi giá trị 2 tham số: boot và bootaction. Tham số boot định nghĩa hành động nào sẽ đƣợc thực thi (ví dụ, os để bỏ qua quá trình boot PXE và boot trên thiết bị tiếp theo trong danh sách do BIOS định nghĩa, install để cài đặt lại). Đối với tất cả các máy con đang hoạt động ổn định, giá trị của tham số action là os. Hình 32 – Giá trị tham số action với các node trong cluster 44 Tham số bootaction "bind" (tham chiếu) một action cụ thể tới một số tham số cần thiết để thực thi action đó. Hình 33 – Các bootaction hiện có Ví dụ, để bắt buộc máy compute-0-0 phải cài đặt lại trong lần boot PXE tiếp theo, ta thực thi command: rocks set host boot compute-0-0 action=install Khi máy compute-0-0 đƣợc khởi động lại, do tham số action đã thay đổi giá trị từ os thành install nên quá trình boot PXE đƣợc thực thi và máy compute-0-0 đƣợc cài đặt lại. Sau khi cài đặt thành công, compute-0-0 yêu cầu máy frontend thiết lập giá trị tham số action của quá trình boot PXE của nó thành os. Để kiểm chứng, ta có thể yêu cầu máy compute-0-0 khởi động lại: ssh compute-0-0 "shutdown -r now" Lƣu ý rằng ta cũng có thể sử dụng wildcard để thực thi hàng loạt lệnh trên. Cụ thể, để yêu cầu tất cả các node cài đặt lại trong lần boot tiếp theo, ta thực thi lệnh: rocks set host boot % action=install 45 Còn để bắt buộc cài đặt lại tất cả các compute node, ta thực thi lệnh: rocks set host boot compute action=install Để thay đổi tham số bootaction, trƣớc hết ta cần định nghĩa bootaction mới (nếu chƣa có). Ví dụ, ta sẽ định nghĩa một bootaction là install headless noacpi với các tham số nhƣ sau:  Kernel: vmlinuz-5.2-i386  Ramdisk: initrd.img-5.2-i386  Args: ks ramdisk_size=150000 lang= devfs=nomount pxe kssendmac selinux=0 noipv6 headless vnc acpi=off Command là: rocks add bootaction action="install headless noacpi" kernel="vmlinuz- 5.2-i386" ramdisk="initrd.img-5.2-i386 ks ramdisk_size=150000 lang= devfs=nomount pxe kssendmac selinux=0 noipv6 headless vnc acpi=off" Hình 34 – Thêm bootaction Trạng thái compute-0-0 trƣớc khi thay đổi giá trị bootaction 46 Hình 35 – Các thuộc tính của node compute-0-0 Thực hiện lệnh: rocks set host installaction compute-0-0 action="install headless noacpi" Hình 36 – Thay đổi giá trị tham số installaction 47 Ta sẽ thấy giá trị tham số bootaction của compute-0-0 bị thay đổi: Hình 37 – Giá trị tham số installaction thay đổi Để xóa bỏ bootaction vừa thêm, thực thi lệnh: rocks remove bootaction action="install headless noacpi" 48 Hình 38 – Loại bỏ một bootaction Lƣu ý rằng khi thực thi lệnh này, Rocks không kiểm tra giá trị các tham số bootaction của các compute node mà thực thi xóa luôn từ cơ sở dữ liệu. Do đó ngƣời quản trị cần phải thật cẩn thận khi thực thi lệnh này, kiểm tra giá trị bootaction của các computenode trƣớc khi xóa bỏ một bootaction nào đó. 3. 4. 3. 2. Xem và thay đổi các cấu hình mạng Rocks cung cấp một số command để xem và thay đổi các cấu hình mạng của các node trong cluster. Ví dụ, để liệt kê các interface: 49 Hình 39 – Xem các cổng ethernet Để thay đổi các thông tin về mạng, sử dụng lệnh rocks set host interface. Ví dụ, thực thi các command sau đây ta sẽ hoán đổi các ethernet 0 và 1 cho nhau. rocks set host interface mac cluster iface=eth1 mac=00:0c:29:6b:1b:48 rocks set host interface mac cluster iface=eth0 mac=00:0c:29:6b:1b:52 (Thực ra cần hoán đổi cả module (rocks set host interface module) nhƣng vì module giống nhau nên không cần). 50 CHƢƠNG 4. LẬP TRÌNH SONG SONG VỚI MPI 4. 1. Các mô hình lập trình song song Có nhiều mô hình lập trình song song, tuy nhiên phổ biến nhất là 4 mô hình: Mô hình bộ nhớ chia sẻ (Shared Memory), mô hình đa luồng (Threads), mô hình truyền thông điệp (Message Passing) và mô hình song song dữ liệu (Data Parallel). Các mô hình lập trình song song tồn tại nhƣ một tầng giao diện giữa ứng dụng xử lý song song và kiến trúc phần cứng / bộ nhớ. Trên thực tế, các mô hình lập trình kể ra trên đây có thể đƣợc cài đặt trên bất kỳ kiến trúc phần cứng nào [4]. Chẳng hạn:  Mô hình chia sẻ bộ nhớ có thể đƣợc cài đặt trên các máy có bộ nhớ phân tán. Theo hƣớng này, bộ nhớ của máy là phân tán về mặt vật lý nhƣng thống nhất về mặt logic. Hƣớng tiếp cận này thƣờng đƣợc mô tả bằng khái niệm bộ nhớ chia sẻ ảo.  Mô hình truyền thông điệp có thể đƣợc cài đặt trên các máy có bộ nhớ chia sẻ, là các máy mà các tác vụ tính toán có thể truy cập trực tiếp vào không gian bộ nhớ chung. Việc sử dụng mô hình nào tùy thuộc vào các tài nguyên hiện có và sự lựa chọn của ngƣời dùng. Không có mô hình nào là tốt nhất, mặc dù vẫn có những mô hình đƣợc cài đặt tốt hơn những mô hình còn lại [4]. 4. 1. 1. Mô hình bộ nhớ chia sẻ Trong mô hình bộ nhớ chia sẻ, các tác vụ tính toán dùng chung một không gian địa chỉ trong đó các thao tác đọc và ghi đƣợc thi hành một cách bất đồng bộ. Việc truy cập tới vùng nhớ chia sẻ đƣợc quản lý bởi các công cụ nhƣ khóa (lock), cờ hiệu (semaphore). Do không có khái niệm tác vụ nào sở hữu dữ liệu nào, nên hầu nhƣ ngƣời lập trình không cần quan tâm đến việc cài đặt liên lạc giữa các tác vụ. Tuy nhiên, đây cũng chính là điểm yếu lớn nhất của mô hình này, vì việc giữ cho một cụm dữ liệu nào đó là cục bộ đối với một tác vụ cụ thể là rất khó khăn, nhất là trong hoàn cảnh mô hình này không cung cấp một phƣơng tiện / quan niệm nào giúp quản lý tính cục bộ của dữ liệu. 51 Hình 40 – Mô hình bộ nhớ chia sẻ Nguồn: [38] 4. 1. 2. Mô hình đa luồng Trong mô hình đa luồng, một tiến trình đơn lẻ có thể có nhiều luồng thực thi song song. Các luồng liên lạc với nhau thông qua vùng nhớ toàn cục. Điều này khiến việc cài đặt trở nên khó khăn do cần phải đảm bảo không có hai luồng cùng sửa đổi giá trị của một vùng nhớ toàn cục nào đó vào một thời điểm bất kỳ. Nói chung mô hình đa luồng thƣờng đƣợc dùng với kiến trúc bộ nhớ chia sẻ. 52 Hình 41 – Mô hình đa luồng Nguồn: [4] 4. 1. 3. Mô hình truyền thông điệp Mô hình truyền thông điệp thƣờng đƣợc dùng với kiến trúc bộ nhớ phân tán. Mô hình này có những đặc điểm sau đây:  Các tác vụ tính toán sử dụng các vùng nhớ cục bộ của chúng trong quá trình thực thi. Các tác vụ này có thể đƣợc thực thi trên cùng một máy tính hoặc (phổ biến hơn) trên nhiều máy tính.  Các tác vụ này trao đổi dữ liệu bằng cách gửi và nhận thông điệp.  Việc truyền dữ liệu giữa các tác vụ cần phải đồng bộ hóa giữa tác vụ gửi và tác vụ nhận, theo nghĩa, khi có một tác vụ truyền thông điệp thì phải có một tác vụ khác nhận thông điệp đó. 53 Hình 42 – Mô hình truyền thông điệp Nguồn: [4] 4. 1. 4. Mô hình song song dữ liệu Mô hình song song dữ liệu làm việc tốt với cả kiến trúc bộ nhớ chia sẻ lẫn kiến trúc bộ nhớ phân tán. Mô hình này có những đặc điểm sau đây:  Hầu hết các công việc cần xử lý song song đều tập trung vào việc thực thi các tác vụ trên tập hợp dữ liệu. Nói chung tập hợp dữ liệu này đƣợc tổ chức theo một cấu trúc phổ biến, chẳng hạn một dãy các dữ liệu.  Các tác vụ tính toán cùng làm việc trên một cấu trúc dữ liệu, nhƣng mỗi tác vụ làm việc trên một phần riêng biệt của cấu trúc dữ liệu đó.  Các tác vụ thực thi các công việc giống nhau trên những phần dữ liệu riêng của chúng, ví dụ "Cộng thêm 4 vào tất cả các phần tử". 54 Hình 43 – Mô hình song song dữ liệu Nguồn: [4] 4. 2. Các ƣu điểm của mô hình truyền thông điệp 4. 2. 1. Phổ biến Mô hình truyền thông điệp rất phù hợp với hệ thống gồm các bộ xử lý riêng rẽ đƣợc kết nối với nhau thành một mạng cục bộ. Vì thế mô hình này phù hợp một cách tự nhiên với các siêu máy tính song song đang thịnh hành. 4. 2. 2. Khả năng mô tả Mô hình truyền thông điệp đƣợc xem nhƣ một mô hình hoàn chỉnh để diễn tả các thuật toán xử lý song song. Mô hình này cung cấp khả năng quản lý tính cục bộ dữ liệu – lƣu ý rằng đây chính là thiếu sót trong mô hình song song dữ liệu. Mô hình truyền thông điệp rất phù hợp với các thuật toán tự trị (Adaptive Algorithm, loại thuật toán có khả năng thay đổi tính chất tùy vào tài nguyên đƣợc cung cấp, chẳng hạn khi có thêm bộ nhớ thì độ phức tạp thuật toán giảm xuống [31]), hoặc các chƣơng trình có khả năng tiếp tục hoạt động ngay cả khi có sự không cân bằng về tốc độ tính toán [9]. 55 4. 2. 3. Dễ gỡ lỗi hơn Bẫy lỗi và gỡ lỗi cho các chƣơng trình xử lý song song hiện nay vẫn là một lĩnh vực nghiên cứu đầy thách thức. Nói chung việc viết các bộ bẫy / gỡ lỗi cho các chƣơng trình xử lý song song là dễ dàng hơn đối với mô hình chia sẻ bộ nhớ. Tuy nhiên, có lý do để nói rằng quá trình bẫy / gỡ lỗi diễn ra dễ dàng hơn trong mô hình truyền thông điệp. Đó là vì một trong những nguyên nhân phổ biến nhất dẫn đến lỗi trong các chƣơng trình xử lý song song là developer vô tình ghi đè lên vùng nhớ đã tồn tại. Mô hình truyền thông điệp quản lý việc truy cập bộ nhớ chặt chẽ hơn so với các mô hình khác (chỉ có một tiến trình duy nhất đƣợc phép truy cập trực tiếp tới một vùng nhớ cụ thể) nên tạo điều kiện để developer dễ dàng tìm ra những thao tác đọc / ghi gây lỗi. Một số trình gỡ lỗi thậm chí còn có thể hiển thị hàng đợi các thông điệp, điều mà các developer thƣờng không thể biết đƣợc. 4. 2. 4. Hiệu năng Nguyên nhân cơ bản nhất khiến cho truyền thông điệp là mô hình không thể thiếu trong môi trƣờng tính toán song song chính là hiệu năng. Các CPU hiện đại càng ngày càng nhanh hơn, do đó việc quản lý bộ nhớ cache của chúng (và bộ nhớ nói chung) đã trở thành chìa khóa để tận dụng đƣợc khả năng của phần cứng. Mô hình truyền thông điệp cung cấp một phƣơng tiện để các developer liên kết các dữ liệu cụ thể với các tiến trình, và do đó, cho phép bộ biên dịch và bộ quản lý bộ nhớ cache hoạt động ở hiệu suất tối đa. Lƣu ý rằng trong thực tế, một trong những nguyên nhân khiến hệ thống các máy tính riêng rẽ có thể vƣợt qua khả năng tính toán của những cỗ máy chỉ có một vi xử lý chính là vì chúng có dung lƣợng bộ nhớ chính và bộ nhớ cache lớn hơn. Các ứng dụng phụ thuộc vào tài nguyên nhớ (Memory Bound Application, [31]) có thể đƣợc tăng tốc nếu đƣợc viết lại cho các hệ thống kiểu này. Thậm chí đối với các hệ thống máy tính dùng chung bộ nhớ, việc sử dụng mô hình truyền thông điệp cũng có thể giúp tăng hiệu năng vì developer có khả năng quản lý tính cục bộ dữ liệu. 4. 3. Giới thiệu về MPI MPI (Message Passing Interface) không phải là một cuộc cách mạng trong lập trình cho các máy tính song song. MPI là tập hợp của những tính năng tốt nhất của rất nhiều hệ 56 thống truyền thông điệp đã tồn tại trƣớc nó. Các tính năng này, khi đƣợc đƣa vào MPI, sẽ đƣợc chuẩn hóa và nếu nhƣ phù hợp thì sẽ đƣợc phát triển thêm. MPI là một bản mô tả (specification), không phải một bản cài đặt (implementation). Tính tới thời điểm năm 1999 (chƣa rõ con số thống kê cho thời điểm hiện tại), tất cả các nhà cung cấp các hệ thống máy tính song song đều cung cấp các bản cài đặt chuyên biệt hóa của MPI. Ngoài ra, nhiều bản cài đặt MPI miễn phí có thể đƣợc download từ nhiều nguồn trên internet. Do là một bản mô tả không phụ thuộc vào một cài đặt cụ thể nào, nên một chƣơng trình MPI đúng nghĩa phải có khả năng chạy trên tất cả các bản cài đặt mà không cần thay đổi gì. MPI có các phiên bản dành cho các ngôn ngữ khác nhau nhƣ C, C++, Fortran. MPI là một thƣ viện, không phải một ngôn ngữ. Nó định nghĩa tên, các chuỗi lời gọi và kết quả của các tiến trình con đƣợc gọi từ một chƣơng trình Fortran; các hàm sẽ đƣợc gọi từ một chƣơng trình C; và các lớp và phƣơng thức tạo nên thƣ viện MPI cho C++. Các chƣơng trình MPI đƣợc viết bằng Fortran, C hoặc C++ đƣợc biên dịch bằng công cụ biên dịch thông thƣờng của các ngôn ngữ này và đƣợc liên kết tới thƣ viện MPI tƣơng ứng. 4. 4. Mục tiêu của MPI Mục tiêu chính của MPI là để giúp các developer không cần thỏa hiệp giữa tính hiệu quả (efficiency), linh động (portability) và khả năng hoạt động (functionality). Cụ thể hơn, ngƣời dùng có thể viết các chƣơng trình có tính linh động cao trong khi vẫn tận dụng đƣợc khả năng từ các phần cứng và phần mềm đƣợc chuyên biệt hóa từ những nhà cung cấp khác nhau. Lƣu ý rằng một lớp ngƣời dùng quan trọng của MPI chính là những nhà phát triển các thƣ viện xử lý song song, đối với lớp ngƣời dùng này thì nhu cầu về tính hiệu quả, linh động và khả năng hoạt động là rất lớn. 4. 5. Các đặc điểm của MPI MPI hỗ trợ việc lập trình song song: MPI là hệ thống cho phép các máy con trong cụm có thể xử lý song song và giải quyết chung một vấn đề. Nếu một cluster bao gồm 1000 máy con, thì một chƣơng trình MPI lý tƣởng sẽ cho phép tăng tốc tính toán lên gấp 1000 lần. Tuy nhiên, tốc độ tính toán thực sự thì phụ thuộc vào nhiều yếu tố, bao gồm 57 loại hình vấn đề đang phải giải quyết, đặc điểm của thuật toán sử dụng, và kỹ năng của ngƣời lập trình. MPI làm việc trên hệ thống bộ nhớ phân tán: Để tăng tính hiệu quả, MPI thƣờng chạy trên các cluster gồm các máy tính cùng loại, sử dụng các kết nối mạng tốc độ cao. Tuy nhiên, MPI sử dụng một hệ thống bộ nhớ phân tán, theo nghĩa mỗi máy con trong cluster có một bộ nhớ riêng rẽ, dữ liệu cần thiết cho tác vụ đang giải quyết đƣợc chia ra cho tất cả các máy trong cluster. Điều này có nghĩa là trƣớc hoặc trong quá trình xử lý, một máy con trong cluster có thể yêu cầu các dữ liệu hoặc kết quả tính toán từ các máy khác trong cluster. MPI là một giao diện lập trình, không phải một hệ thống đã cài đặt sẵn: Các bản cài đặt MPI có thể đƣợc viết bằng nhiều ngôn ngữ, nhƣ C, C++, Fortran, .. Việc biên dịch một chƣơng trình MPI giống hệt nhƣ biên dịch một chƣơng trình thông thƣờng. Chẳng hạn, nếu chƣơng trình đƣợc viết bằng C, thì ngƣời lập trình chỉ đơn giản include thƣ viện MPI và biên dịch sử dụng gcc. Các máy con trong cluster thực thi cùng một chƣơng trình: Ngƣời lập trình viết một chƣơng trình duy nhất. Tại thời điểm biên dịch, bản thực thi của chƣơng trình đƣợc tạo và tồn tại duy nhất tại máy biên dịch. Thông thƣờng, khi ngƣời quản trị yêu cầu thực thi một chƣơng trình MPI, bản thực thi này sẽ đƣợc tự động copy đến tất cả các máy con đƣợc ngƣời quản trị yêu cầu tham gia tính toán, và sau đó bắt đầu thực thi đồng thời trên các máy này. Tuy nhiên, đối với các chƣơng trình đƣợc thực thi nhiều lần, hoặc để giảm thời gian không cần thiết, việc copy bản thực thi đến các máy con trong cụm có thể đƣợc tiến hành thủ công bởi ngƣời quản trị. Do mỗi máy con trong cụm đƣợc phân biệt bởi một số nhận dạng tƣơng ứng và duy nhất, nên mỗi máy có thể xử lý một công việc khác nhau, mặc dù chúng cùng thực thi một chƣơng trình. Theo thông lệ, máy con với mã số 0 (nhƣ ví dụ dƣới đây) sẽ chịu trách nhiệm thu thập kết quả tính toán từ các máy con khác và xử lý tiếp. Các đoạn mã có sẵn cần phải đƣợc chuyển đổi phù hợp để có thể sử dụng MPI hiệu quả: Ngƣời lập trình cần nghĩ đến một phƣơng án để có thể chia nhỏ bài toán hiện tại thành các bài toán con có độ phức tạp tƣơng đƣơng nhau sao cho các máy tham gia tính toán có thể hoàn thành đƣợc trong khoảng thời gian phù hợp. Nói cách khác, ngƣời lập trình phải "tƣ duy lại theo kiểu lập trình song song". 58 4. 6. Khác biệt giữa các bản cài đặt bằng C và C++ của MPI Một khác biệt quan trọng trong cách cài đặt MPI sử dụng C và C++ nằm ở cách xử lý các giá trị trả về. Trong C, giá trị trả về thực sự đƣợc truyền nhƣ tham số (ví dụ, tham số size trong MPI_Comm_size thực ra là biến lƣu kết quả), còn giá trị trả về thông thƣờng thực chất lại là mã lỗi. Nếu mã lỗi trả về không phải là MPI_SUCCESS, thì mặc định tất cả các tiến trình sẽ dừng thực thi. Nếu các tiến trình vẫn tiếp tục thực thi, thì giá trị trả về của các hàm khi đó sẽ là mã lỗi tƣơng ứng. Trong C++, giá trị trả về thông thƣờng chính là giá trị trả về thực sự (ví dụ, MPI::Comm::Get_size()). Khi có lỗi xảy ra, mặc định tất cả các chƣơng trình cũng sẽ dừng thực thi giống nhƣ C, nhƣng trong trƣờng hợp các tiến trình vẫn tiếp tục thực thi, thì thay vì trả về mã lỗi, chƣơng trình sẽ ném ra một exception. Dƣới đây là bảng tƣơng ứng các hàm MPI trong C và C++. Bảng 1 – Tương ứng các hàm MPI trong C và C++ C C++ int MPI_Init(int *argc, char ***argv) void MPI::Init(int& argc, char**& argv) void MPI::Init( ) int MPI_Comm_size(MPI_Comm comm, int *size) int MPI::Comm::Get_size( ) const int MPI_Comm_rank(MPI_Comm comm, int *rank) int MPI::Comm::Get_rank( ) const int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm) void MPI::Intracomm::Bcast(void* buffer, int count, const Datatype& datatype, int root) const int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) void MPI::Intracomm::Reduce(const void* sendbuf, void* recvbuf, int count, const Datatype& datatype, const Op& op, int root) const int MPI_Finalize( ) void MPI::Finalize( ) Lƣu ý rằng, từ đây trở đi, chúng ta chỉ xét thƣ viện MPI đƣợc cài đặt bằng C. 4. 7. MPI trên Rocks Thƣ viện MPI đƣợc hỗ trợ mặc định trên Rocks là OpenMPI. 59 Hình 44 – MPI trên Rocks Khi một ứng dụng MPI đƣợc gọi, các ứng dụng MPI trên các máy compute đƣợc sử dụng trong quá trình tính toán sẽ lần lƣợt đƣợc gọi thông qua SSH. Đây chính là một lý do khiến mỗi ngƣời dùng đều phải tạo cặp khóa private – public ngay lần đầu khởi động terminal trên máy frontend. 4. 8. Viết chƣơng trình Hello World Dƣới đây là mã nguồn chƣơng trình viết bằng C. #include "mpi.h" #include int main(int argc, char* argv[]) { int processId; int noProcesses; int nameSize; char computerName[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &noProcesses); MPI_Comm_rank(MPI_COMM_WORLD, &processId); MPI_Get_processor_name(computerName, &nameSize); 60 fprintf(stderr, "Hello from process %d on %s\n", processId, computerName); MPI_Finalize(); return 0; } Lƣu mã nguồn trên thành file hello.c, và biên dịch bằng mpicc. Command biên dịch là: mpicc -o hello hello.c Dƣới đây là kết quả khi chạy với các tham số khác nhau. Chạy trên local (máy frontend) Từ thƣ mục chứa file hello (output của quá trình biên dịch bên trên), thực thi lệnh mpirun -np 5 hello Ta nhận đƣợc output nhƣ hình dƣới. 61 Hình 45 – Output của chương trình Hello World (1) Mặc định, khi ngƣời quản trị không chỉ định sẽ sử dụng máy nào trong cluster để thực thi chƣơng trình, thì chƣơng trình sẽ thực thi ngay trên local (máy frontend). Tham số np cho biết số tiến trình sẽ đƣợc khởi động. Do ta xác định số tiến trình là 5, nhƣng lại chỉ có một máy thực thi (máy local) nên các tiến trình sẽ chia sẻ thời gian CPU (trong trƣờng hợp máy thực thi có đủ 5 bộ xử lý thì mỗi tiến trình sẽ chạy trên một bộ xử lý). Chạy trên các máy compute Ta tạo mới một file là machines trên cùng thƣ mục với file hello, với nội dung là: compute-0-0 compute-0-1 Khởi động các máy compute-0-0 và compute-0-1 trong cluster, sau đó thực thi các lệnh sau để copy file hello đến tất cả các máy này: scp ~/hello root@compute-0-0:~ 62 scp ~/hello root@compute-0-1:~ Thực thi bằng lệnh: mpirun -np 2 -machinefile machines hello Khi đó output sẽ là: Hình 46 – Output của chương trình Hello World (2) Nếu sửa lại file machines thành localhost compute-0-1 Thì output sẽ là: 63 Hình 47 – Output của chương trình Hello World (3) Nếu sửa file machines thành: compute-0-1 Thì output sẽ là: 64 Hình 48 – Output của chương trình Hello World (4) Ở trƣờng hợp đầu, số lƣợng tiến trình bằng số lƣợng máy con tham gia thực thi (thực chất là bằng số lƣợng bộ xử lý tham gia tính toán, nhƣng vì mỗi máy có một bộ xử lý nên ta dùng khái niệm "máy con" thay cho khái niệm "bộ xử lý"), nên mỗi máy sẽ thực thi một tiến trình. Ở các trƣờng hợp sau, do số lƣợng tiến trình nhiều hơn số lƣợng máy con nên sẽ có máy phải xử lý nhiều hơn một tiến trình. 4. 9. Các hàm MPI cơ bản 4. 8. 1. Hàm MPI_Init Hàm này đƣợc sử dụng để bắt đầu một phiên làm việc MPI. Tất cả các chƣơng trình MPI đều phải gọi đến hàm này nhƣng chỉ gọi duy nhất 1 lần. Nói chung, hàm MPI_Init cần đƣợc gọi trƣớc tất cả các hàm MPI khác (điều đó có nghĩa là nếu trƣớc lời gọi MPI_Init có thêm các lời gọi hàm khác nhƣng các lời gọi hàm này không trực tiếp hoặc 65 gián tiếp gọi đến một hàm MPI_Init thì cũng không sao). Ngoại lệ duy nhất là hàm MPI_Initialized. Hàm này đƣợc sử dụng để kiểm tra xem hàm MPI_Init đã đƣợc gọi đến hay chƣa. Lƣu ý rằng hàm MPI_Init không nhất thiết phải đƣợc gọi trực tiếp trong hàm main: Nó có thể đƣợc gọi gián tiếp thông qua một hoặc nhiều hàm khác. Trong các chƣơng trình C, có thể truyền các tham số địa chỉ argc và argv để có thể tận dụng các tham số đƣợc truyền vào từ dòng lệnh, tuy nhiên điều này không bắt buộc: Các địa chỉ này có thể đƣợc thay thế bởi hằng NULL. 4. 8. 2. Hàm MPI_Finalize Hàm này đƣợc dùng để đóng một phiên làm việc MPI. MPI_Finalize phải là lời gọi hàm MPI cuối cùng trong chƣơng trình. MPI_Finalize đƣợc sử dụng để giải quyết các phần việc nhƣ giải phóng bộ nhớ, ... Tuy nhiên, ngƣời lập trình cần phải đảm bảo rằng tất cả các giao tiếp giữa các tiến trình có liên quan đều đã kết thúc trƣớc khi gọi hàm MPI_Finalize, và hàm MPI_Finalize phải đƣợc gọi bởi tất cả các tiến trình. 4. 8. 3. Hàm MPI_Comm_size Hàm này đƣợc dùng để lấy số lƣợng tiến trình đang chạy trong nhóm làm việc chứa tiến trình hiện tại. Lƣu ý rằng kết quả trả về là số lƣợng tiến trình đang chạy chứ không phải số lƣợng máy con trong cluster đang đƣợc sử dụng. Hàm này chấp nhận 2 tham số, tham số đầu là tên của bộ liên lạc (Communicator) (mặc định là MPI_COMM_WORLD) (khái niệm bộ liên lạc sẽ đƣợc giải thích bên dƣới), tham số địa chỉ thứ 2 là biến để lƣu kết quả trả về. Bộ liên lạc MPI_COMM_WORLD bao gồm tất cả các tiến trình sẵn có trong quá trình khởi tạo. Bộ liên lạc đƣợc sử dụng để phân biệt cũng nhƣ giao tiếp giữa các tiến trình, do đó nó cung cấp một phƣơng tiện để "đóng gói" phần hạ tầng giao tiếp của MPI. Mặc dù có thể tạo ra một bộ liên lạc khác nhƣng điều này nói chung không cần thiết, do bộ liên lạc mặc định đã đáp ứng đủ nhu cầu của chúng ta. 4. 8. 4. Hàm MPI_Comm_rank Hàm này đƣợc dùng để xác định rank (hạng) của tiến trình hiện tại trong bộ liên lạc. Ý nghĩa của các tham số tƣơng tự nhƣ MPI_Comm_size. Khi khởi tạo các tiến trình, mỗi tiến trình sẽ đƣợc gán một rank tƣơng ứng trong bộ liên lạc, đó là một con số nằm trong 66 khoảng từ 0 đến n - 1, với n là số lƣợng tiến trình. Chẳng hạn trong ví dụ trên ngƣời quản trị yêu cầu 5 tiến trình, do đó rank của các tiến trình sẽ là 0, 1, 2, 3, 4. Do mỗi tiến trình thực chất là việc thực thi của cùng một chƣơng trình trên các máy con khác nhau, nên để biết đƣợc tiến trình hiện tại là tiến trình nào, tiến trình hiện tại cần phải dựa vào rank tƣơng ứng của nó. Theo thông lệ, tiến trình ứng với rank 0 sẽ chịu trách nhiệm lấy kết quả trả về từ các tiến trình khác và tiếp tục xử lý. Việc kết quả trả về từ mỗi tiến trình là nhanh hay chậm nói chung không hoàn toàn đồng nghĩa với sức mạnh xử lý của mỗi máy con tƣơng ứng, vì nó còn phụ thuộc vào tốc độ của các kết nối giữa các máy con. 4. 10. Giá trị trả về của các hàm MPI Hầu hết các hàm MPI đều trả về một số nguyên, cho biết trạng thái thực thi của hàm đó. Giá trị trả về là gì và ý nghĩa của chúng nhƣ thế nào phụ thuộc vào các bản cài đặt khác nhau của MPI [24]. Tuy nhiên, có một giá trị trả về đƣợc chuẩn hóa, đó là MPI_SUCCESS, cho biết hàm thực thi thành công. Nếu giá trị trả về của một hàm không phải là MPI_SUCCESS thì đó là một mã lỗi. Từ mã lỗi này, ngƣời lập trình có thể lấy đƣợc thông tin lỗi nhờ hàm MPI_Error_string. 4. 11. Về các khái niệm Nhóm, Ngữ cảnh và Bộ liên lạc Một nhóm (Group) là một tập có thứ tự của các tiến trình [10]. Mỗi tiến trình trong nhóm có một chỉ số duy nhất gọi là rank (hạng). Rank của một tiến trình có giá trị từ 0 đến p – 1, với p là số tiến trình trong nhóm. Ngữ cảnh (Context) là một khái niệm trừu tƣợng, hàm ý mỗi thông điệp “biết” về bộ liên lạc của nó [32]. Ngữ cảnh ra đời nhằm chia tách các họ thông điệp, tránh tình trạng một thông điệp đƣợc gửi với một bộ liên lạc này lại đƣợc nhận với một bộ liên lạc khác. Nếu một thông điệp đƣợc truyền từ tiến trình thứ nhất và đƣợc nhận bởi tiến trình thứ hai, thì hai tiến trình này phải thuộc cùng một bộ liên lạc; khi đó ta nói rằng thông điệp đó đã đƣợc gửi và nhận trong cùng ngữ cảnh. Một bộ liên lạc (Communicator) bao gồm một nhóm các tiến trình và một ngữ cảnh [32]. Các tiến trình nếu muốn gửi và nhận thông điệp của nhau thì bắt buộc phải thuộc cùng một bộ liên lạc, và ngƣợc lại, khi 2 tiến trình thuộc cùng một bộ liên lạc thì chúng 67 có thể truyền thông điệp cho nhau. Trong môi trƣờng MPI, mỗi tiến trình phải thuộc ít nhất một bộ liên lạc nào đó. Một tiến trình có thể thuộc nhiều hơn một bộ liên lạc. Mỗi bộ liên lạc có một ngữ cảnh duy nhất tƣơng ứng với nó, và mỗi ngữ cảnh chỉ tƣơng ứng với duy nhất một bộ liên lạc [10]. Khi một chƣơng trình MPI bắt đầu chạy, có một nhóm sơ cấp đƣợc khởi tạo bao gồm tất cả các tiến trình. Tƣơng ứng với nó là bộ liên lạc sơ cấp MPI_COMM_WORLD. Sau khi ngƣời dùng gọi hàm MPI_Init, có một bộ liên lạc đặc biệt khác đƣợc tạo là MPI_COMM_SELF [20]. Đây là bộ liên lạc chỉ chứa duy nhất 1 tiến trình hiện tại. Ngoài MPI_COMM_WORLD và MPI_COMM_SELF còn có một số object đặc biệt khác nhƣ MPI_COMM_NULL, …, tuy nhiên đây không phải là các bộ liên lạc đặc biệt ([21, 34, 35]). Về khái niệm liên lạc trong (inter-communication), liên lạc ngoài (intra- communication), bộ liên lạc trong (inter-communicator), bộ liên lạc ngoài (intra- communicator), tham khảo [27, 28]. 4. 12. Liên lạc giữa các tiến trình Có thể liên lạc giữa các tiến trình trong MPI theo 2 cách: Liên lạc 2 điểm (Point – To – Point Communication) và liên lạc đa điểm (Collective Communication). Liên lạc điểm nối điểm lại đƣợc phân chia thành liên lạc đồng bộ (Blocking Communication) và liên lạc bất đồng bộ (Non – Blocking Communication). Có rất nhiều hàm MPI đƣợc cài đặt để phục vụ cho việc liên lạc giữa các tiến trình. Do tài liệu chỉ tập trung vào việc giới thiệu về MPI để phục vụ cho lập trình song song ứng dụng cho Rocks, nên ở đây ta chỉ bàn đến 2 hàm liên lạc phổ biến nhất của MPI, thuộc loại liên lạc đồng bộ là MPI_Send và MPI_Recv. Hàm MPI_Send int MPI_Send(void *address, int count, MPI_Datatype dataType, int destination, int tag, MPI_Comm communicator) Trong đó: 68  (address, count, dataType) định nghĩa count lần xuất hiện của dữ liệu dạng dataType bắt đầu từ địa chỉ address.  destination là rank của tiến trình nhận trong nhóm tƣơng ứng với communicator.  tag là một số nguyên sử dụng để phân loại thông điệp  communicator định nghĩa một nhóm các tiến trình và ngữ cảnh của chúng. Hàm MPI_Recv int MPI_Recv(void *address, int maxCount, MPI_Datatype dataType, int source, int tag, MPI_Comm communicator, MPI_Status *status) Trong đó:  (address, maxCount, dataType) định nghĩa bộ đệm nhận tƣơng tự nhƣ trong MPI_Send. Toán tử này cho phép một lƣợng ít hơn hoặc bằng maxCount dữ liệu dạng dataType đƣợc nhận. Các tham số tag và communicator có ý nghĩa tƣơng tự nhƣ trong MPI_Send, tuy nhiên có một điểm khác biệt là chấp nhận giá trị đại diện.  source là hạng của nguồn gửi thông điệp trong nhóm tƣơng ứng với communicator, hoặc một giá trị đại diện cho bất kỳ nguồn nào.  status lƣu giữ thông tin về kích thƣớc thực sự của thông điệp, nguồn gửi thông điệp thực sự và thẻ thông điệp thực sự. Sở dĩ cần có một biến lƣu giữ các giá trị “thực sự” là vì thông điệp nhận đƣợc có thể có kích thƣớc nhỏ hơn kích thƣớc xác định bởi maxCount, và các tham số source và tag có thể chấp nhận giá trị đại diện. Chúng ta có nhận xét:  3 giá trị source, destination và communicator xác định nhóm, còn 2 giá trị tag và communicator xác định ngữ cảnh của cả 2 tiến trình gửi và nhận.  Bộ tham số (address, maxCount, dataType) xác định thông điệp cần gửi. Sự linh hoạt của bộ tham số này thể hiện trong tham số thứ 3, dataType. Tham số này nhận giá trị là các kiểu dữ liệu cơ sở của ngôn ngữ cài đặt. Ví dụ, (A, 300, MPI_REAL) định nghĩa một vectơ A bao gồm 300 thành phần là các số thực trong 69 Fortran, không cần biết đến chiều dài hay định dạng của các số này. Một bản cài đặt MPI dành cho các mạng hỗn tạp đảm bảo rằng máy tính chủ của tiến trình nhận phải nhận đƣợc chính xác 300 thành phần thực này mà ngữ nghĩa hay giá trị không thay đổi, mặc dù máy tính chủ của tiến trình nhận có thể có kiến trúc khác (và do đó, khác nhau về định dạng số thực) với máy tính chủ của tiến trình nhận. Ở mức cao nhất, sức mạnh của mô hình mới này nằm ở khả năng ngƣời dùng có thể định nghĩa các kiểu dữ liệu mới và các kiểu dữ liệu này có thể mô tả các dữ liệu không liên tục. MPI linh hoạt trong việc định nghĩa thông điệp cần gửi là do các lý do sau đây:  Thƣờng thì dữ liệu cần gửi là dữ liệu rời rạc, theo nghĩa không tồn tại trong một hoặc nhiều vùng nhớ liên tiếp. Một ví dụ đơn giản chính là khi ta cần gửi đi dữ liệu về một cột của ma trận, nhƣng ma trận lại hướng hàng, nghĩa là các phần tử của ma trận đƣợc lƣu trữ theo hàng. Tổng quát hơn, dữ liệu cần gửi có thể là tập hợp của các cấu trúc dữ liệu có kích thƣớc khác nhau. Các thƣ viện cổ điển cung cấp các phƣơng pháp để “đóng gói” dữ liệu trong bộ đệm một cách liên tục tại đầu gửi và “tháo gói” tại đầu nhận. Tuy nhiên, sẽ tốt hơn về mặt hiệu năng nếu nhƣ việc đóng gói đƣợc thực hiện trong quá trình gửi, thay vì phải có thêm một bƣớc trƣớc khi gửi để đóng gói dữ liệu.  Sự phát triển của tính toán hỗn tạp (Heterogeneous Computing, [25, 26]). Tính toán hỗn tạp phát triền do nhu cầu cần phân bố các thành phần của các tác vụ tính toán ra các máy tính bán chuyên biệt nhƣ các dòng máy SIMD, vectơ hay graphics; và nhu cầu sử dụng các mạng máy trạm (Workstation Network) nhƣ các máy song song. Các mạng máy trạm thƣờng bao gồm các máy tính đƣợc tích hợp qua thời gian, do đó thƣờng không đồng nhất về kiến trúc. Khi xuất hiện nhu cầu trao đổi thông điệp giữa các máy tính khác nhau về mặt kiến trúc, thì cần phải có một bộ tham số tổng quát để mô tả phù hợp cho ngữ nghĩa của thông điệp cần gửi. Ví dụ, với một vectơ gồm các số dấu chấm động, không chỉ định dạng mà ngay cả chiều dài của các số dấu chấm động cũng khác nhau với các kiến trúc máy khác nhau. Tƣơng tự, điều này cũng đúng trong trƣờng hợp các số nguyên. Trong quá trình gửi và nhận thông điệp, thƣ viện đƣợc sử dụng có thể tiến hành các chuyển 70 đổi cần thiết nhƣng chỉ khi chúng xác định đƣợc một cách chính xác cái gì đang đƣợc gửi đi. Một trong những điểm cần lƣu ý khi sử dụng cặp hàm MPI_Send và MPI_Recv đó là tính chất đồng bộ. Tác vụ gửi đƣợc xem là hoàn thành nếu nhƣ thông điệp gửi đi đã đƣợc nhận bởi một tiến trình nào đó. Tác vụ nhận đƣợc xem là hoàn thành nếu nhƣ có một thông điệp đến phù hợp với ngữ cảnh của tiến trình nhận, và tiến trình nhận nhận thành công thông điệp đó. Các hàm này không kết thúc cho đến khi các tác vụ gửi và nhận tƣơng ứng của chúng hoàn thành. Vì thế, nếu tất cả các tiến trình đều gọi cặp hàm này theo thứ tự: MPI_Send(data, destination); MPI_Recv(newdata, source); Thì ứng dụng sẽ bị rơi vào trạng thái deadlock (treo). Nguyên nhân là không có tiến trình nào nhận các thông điệp đƣợc gửi đi, vì vậy tất cả các tác vụ gửi đều chƣa hoàn thành, ứng dụng sẽ không thoát đƣợc. Để tránh trƣờng hợp ứng dụng bị rơi vào trạng thái deadlock, nên thiết kế sao cho mỗi tác vụ gửi phải có một tác vụ nhận tƣơng ứng, giống nhƣ tính chất đồng bộ của cặp hàm MPI_Send và MPI_Recv. if (rank % 2) { MPI_Send(data, (rank + 1) % size); MPI_Recv(newdata, (rank - 1) % size); } else { MPI_Recv(newdata, (rank - 1) % size); MPI_Send(data, (rank + 1) % size); } Về phần này, có thể xem thêm phụ lục 2. 4. 13. Xây dựng một ứng dụng tự trị Một trong những vấn đề khó khăn khi thiết kế các ứng dụng tính toán song song là phân chia công việc giữa các tiến trình nhƣ thế nào để tận dụng đƣợc tài nguyên tính toán. Một ứng dụng ở mức đơn giản sẽ đƣợc thiết kế sao cho các tiến trình tham gia tính 71 toán biết trƣớc về phần công việc mà mình cần làm. Chẳng hạn, với ứng dụng tính tích phân (xem mã nguồn đi kèm), thì mỗi máy sẽ đảm nhiệm khối lƣợng công việc, với n là số lƣợng máy tham gia tính toán. Trên thực tế các ứng dụng xử lý song song không gặp thuận lợi nhƣ vậy. Máy chủ (là máy truyền dữ liệu đến các máy con và thu thập kết quả tính toán từ các máy con) thƣờng không tham gia tính toán, nó chịu trách nhiệm điều phối công việc giữa các máy con. Các máy con lại có thể có tài nguyên phong phú ở mức độ khác nhau, thời điểm nhận các dữ liệu đầu vào cũng khác nhau, nên sẽ có máy hoàn thành công việc trƣớc các máy còn lại. Khi đó, máy này sẽ ở trạng thái “rỗi”. Để tận dụng tài nguyên từ những máy nhu thế này, các ứng dụng xử lý song song thƣờng đƣợc thiết kế sao cho máy chủ sẽ giao cho mỗi máy con một phần việc nhƣ nhau; mỗi khi có một máy con thông báo cho máy chủ về kết quả phần việc của mình, thì máy chủ lại tiếp tục gửi một phần việc khác cho nó… Ứng dụng dƣới đây sẽ tính tích của một ma trận với một vectơ. Do chỉ mang tính minh họa, các phần tử của ma trận và vectơ đều đƣợc gán là 1. Mỗi tiến trình con chịu trách nhiệm tính toán một phần tử của ma trận kết quả. Khi một tiến trình con hoàn thành công việc, nó thông báo cho tiến trình chủ biết. Tiến trình chủ tiếp tục giao phần việc tiếp theo cho nó, cho đến khi toàn bộ tác vụ tính toán hoàn thàn

Các file đính kèm theo tài liệu này:

  • pdfLUẬN VĂN- NGHIÊN CỨU HỆ THỐNG CỤM MÁY TÍNH XỬ LÝ SONG SONG ROCKS VÀ ỨNG DỤNG.pdf