Bài giảng Tính toán lưới - Bài 7: Vào ra song song - Nguyễn Hữu Đức
Vào ra song song
Center of High Performance Computing
Hanoi University of Technology
Hà nội, 6/2008
Đại học Bách khoa Hà Nội
{hpcc@mail.hut.edu.vn}
Nội dung bài học
Các cách tiếp cận vào ra song song
Vào/ra dùng con trỏ riêng biệt
Vào/ra dùng khoảng cách
Khái niệm Khung nhìn
Vào/ra cộng tác
Vào/ra dùng con trỏ dùng chung
Các công nghệ vào/ra song song
Vào/ra song song là quá trình nhiều tiến trình của
chương trình song song cùng truy cập một tệp tin
chung
FILE
P(n-1)
P0
P1
P2
Các công nghệ lưư trữ:
RAID: RAID 0, RAID 1, RAID 5, RAID 10, RAID 53
Distributed File Systems:NFS , SMB, DCE/DFS
Parallel File Systems:GPFS, PFS, PVFS
Storage Area Networks:CXFS, GFS, Lustre, SANergy
Các cách tiếp cận vào ra song song
Vào ra dùng 1 tác vụ đơn:
Tất cả tiến trình gửi dữ liệu cho rank 0, sau đó rank 0 ghi dữ liệu ra
tệp tin
Cần gom kết và phát tán dữ liệu
Hiệu năng giới hạn bởi khả năng của rank 0
Không tận dụng công nghệ lưu trữ song song
Các cách tiếp cận vào ra song song
Vào/ra kết hợp
Mỗi tiến trình đọc/ghi vào một tệp tin riêng
Tăng tính song song
Hiệu năng cao
Nhiều tệp tin nhỏ, quản lý khó khăn
Có chương trình phân chia dữ liệu và tập hợp dữ liệu
Tại sao cần dùng vào/ra song song
Vào/ra không song song đơn giản, nhưng
Hiệu năng thấp (một tiến trình ghi vào một tệp tin)
Không có sự tương tác giữa các chương trình (Mỗi tiến trình
chỉ tương tác với 1 tệp tin)
Vào/ra song song:
Hiệu năng cao
Tính khả chuyển
Tính thuận tiện
Một tệp tin có thể dùng cho các chương trình khác nhau
(các chương trình ảo hóa, …)
Cài đặt vào/ra song song sử dụng MPI
Quá trình ghi giống với gửi dữ liệu, quá trình đọc
giống với nhận dữ liệu
Bất kỳ hệ thống vào/ra song song nào cũng cơ chế
để:
Định nghĩa các phép toán cộng tác
MPI Communicator
Định nghĩa dữ liệu không liên tục trong bộ nhớ và tệp tin
Kiểu dữ liệu của MPI: dữ liệu cơ bản và dẫn xuất
Kiểm tra sự hoàn thành của các phép toán không ràng buộc
Đối tượng request trong MPI
Chuẩn vào/ra trong MPI
Tất cả các định tuyến bắt đầu bằng MPI_File_
open, read, write, seek, close
Kí tự không đồng bộ “i”: iread etc.
Kí tự vị trí tuyệt đối “_at”: read_at
Kí tự cộng tác “_all”: read_all etc
Kí tự cộng tác không ràng buộc: “_begin” “_end”
Kí tự con trỏ tệp tin dùng chung: “_shared”
MPI_Type để tạo kiểu dữ liệu dẫn xuất
Một số định tuyến vào/ra cơ bản
MPI_File_open(MPI_Comm comm, char *file, int mode, MPI_Info info, MPI_File *fh)
(note: mode = MPI_MODE_RDONLY, MPI_MODE_RDWR, MPI_MODE_WRONLY,
MPI_MODE_CREATE, MPI_MODE_EXCL, MPI_MODE_DELETE_ON_CLOSE,
MPI_MODE_UNIQUE_OPEN, MPI_MODE_SEQUENTIAL, MPI_MODE_APPEND)
MPI_File_close(MPI_File *fh)
MPI_File_read(MPI_File fh, void *buf, int count, MPI_Datatype type, MPI_Status *status)
MPI_File_read_at(MPI_File fh, int offset, void *buf, int count,
MPI_Datatype type, MPI_Status *status)
MPI_File_seek(MPI_File fh, MPI_Offset offset, in whence);
(chú ý: whence = MPI_SEEK_SET, MPI_SEEK_CUR, or MPI_SEEK_END)
MPI_File_write(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status)
MPI_File_write_at(MPI_File fh, MPI_Offset, void *buf, int count, MPI_Datatype datatype, MPI_Status
*status)
MPI_File_sync(MPI_File fh);
Vào/ra sử dụng con trỏ riêng biệt
1. #include<stdio.h>
2. #include<stdlib.h>
3. #include "mpi.h"
4. #define FILESIZE 1000
5. int main(int argc, char **argv){
6.
int rank, nprocs;
MPI_File fh;
7.
8.
MPI_Status status;
int bufsize, nints;
int buf[FILESIZE];
9.
10.
11.
12.
13.
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
14.
15.
bufsize = FILESIZE/nprocs;
nints = bufsize/sizeof(int);
16.
MPI_File_open(MPI_COMM_WORLD, "datafile", MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);
MPI_File_seek(fh, rank * bufsize, MPI_SEEK_SET);
MPI_File_read(fh, buf, nints, MPI_INT, &status);
MPI_File_close(&fh);
17.
18.
19.
20.
MPI_Finalize();
21. }
Vào ra sử dụng khoảng cách
1. #include<stdio.h>
2. #include<stdlib.h>
3. #include "mpi.h"
4. #define FILESIZE 1000
5. int main(int argc, char **argv){
6.
int rank, nprocs;
MPI_File fh;
7.
8.
MPI_Status status;
int bufsize, nints;
int buf[FILESIZE];
9.
10.
11.
12.
13.
14.
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
15.
16.
bufsize = FILESIZE/nprocs;
nints = bufsize/sizeof(int);
17.
MPI_File_open(MPI_COMM_WORLD, "datafile", MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);
18.
MPI_File_read_at(fh, rank*bufsize, buf, nints, MPI_INT, &status);
19.
MPI_File_close(&fh);
MPI_Finalize();
20.
21. }
Ghi dữ liệu vào tệp tin
Dùng MPI_File_write hoặc MPI_File_write_at
Dùng MPI_MODE_WRONLYhoặc MPI_MODE_RDWR cho
tham số flag trong định tuyến MPI_File_open
Nếu tệp tin chưa tồn tại, cần truyền giá trị
MPI_MODE_CREATE cho biến flag trong
MPI_File_open
Có thể dùng nhiều giá trị cho biến flag, bằng cách sử
dụng toán từ bitwise-or ‘|’ trong ngôn ngữ C
Khái niệm khung nhìn
Các tiến trình ghi dữ liệu vào cùng một tệp tin
Bao gồm các thông tin
Offset (vị trí từ đầu file): cho biết các thao tác IO sẽ bắt đầu
từ vị trí nào trong file
Kiểu dữ liệu sẽ được ghi hoặc đọc
Cách thức sắp xếp dữ liệu trong file (partern)
MPI_File_set_view gán vùng dữ liệu của tệp tin
cho các tiến trình
MPI_File_set_view
MPI_Set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype,
MPI_Datatype filetype, char *datarep, MPI_Info info)
MPI_Set_view xác định phần nào của tệp tin có thể truy cập từ tiến trình đưa ra
disp: Khoảng cách tính theo byte từ vị trí đầu tệp tin
etype: Kiểu dữ liệu cơ bản của tệp tin (integer, doubles, …).
filetype: Xác định sự phân tán dữ liệu đối với các tiến trình.
Thường trùng với giá trị của etype hoặc dẫn xuất từ etype
datarep: cách tổ chức dữ liệu
Tổ chức dữ liệu
Biểu diễn cách thức tổ chức dữ liệu trong file
Có thể được định nghĩa tùy biến
Mặc định
Native:
Dữ liệu trong file và trong bộ nhớ được tổ chức giống nhau
Internal
Được thực hiện hoàn toàn bởi sản phẩm MPI
Thực hiện việc chuyển đổi kiểu khi cần thiết
External32
Sử dụng một cách thức tổ chức chuẩn
Tất cả các cài đặt đều hỗ trợ External 32
Ví dụ về khung nhìn
etype = MPI_INT
filetype = 2 số MPI_INT cùng với 1 khoảng
trống gồm 4 số MPI_INT
Đầu tệp tin
TỆP TIN
displacement
filetype
filetype
Kết hợp các khung nhìn
Vào/ra cộng tác trong MPI
Các tiến trình có thể đọc file bằng các lệnh đọc riêng
rẽ
Có thể cải thiện hiệu năng bằng cách tập trung tất
cả các lệnh đọc/ghi vào một lệnh đọc/ghi theo nhóm
duy nhất.
Các yêu cầu
nhỏ, đơn lẻ
Truy cập công tác
Vào/ra cộng tác trong MPI
MPI_File_read_all, MPI_File_read_at_all,
MPI_File_write_all, MPI_File_write_at_all
_allchỉ định tất cả các tiến trình trong
communicator khai báo ở định tuyến
MPI_File_openđều phải gọi định tuyến vào/ra này.
Mỗi tiến trình chỉ truy cập thông tin của nó – danh
sách các đối số là giống với các định tuyến không
phải cộng tác.
Vào/ra cộng tác không ràng buộc trong
MPI
Vào/ra cộng tác là vào/ra có ràng buộc
Định tuyến chưa trả về giá trị cho đến khi việc đọc/ghi dữ
liệu bộ đệm là an toàn
Vẫn ràng buộc với tiến trình gọi nó.
Vào/ra không ràng buộc
MPI_File_iread(MPI_File fh, void *buf, int count, MPI_Datatype
datatype, MPI_Request *request)
MPI_File_iwrite(MPI_File fh, void *buf, int count, MPI_Datatype
datatype, MPI_Request *request)
Giống với truyền thông không ràng buộc
Trả về đối tượng request thay vì status
Sử dụng MPI_Test và MPI_Wait cho quá trình hoàn thành
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tính toán lưới - Bài 7: Vào ra song song - Nguyễn Hữu Đức", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
- bai_giang_tinh_toan_luoi_bai_7_vao_ra_song_song_nguyen_huu_d.pdf