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 ...
186 trang |
Chia sẻ: haohao | Lượt xem: 1381 | Lượt tải: 1
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:
- LUẬ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