1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đánh giá hiệu năng một số thuật toán tìm kiếm sử dụng MPI

36 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Đánh Giá Hiệu Năng Một Số Thuật Toán Tìm Kiếm Sử Dụng MPI
Tác giả Đỗ Huy Hoàng, Nguyễn Văn Hoàng, Trần Thị Trà Mi
Người hướng dẫn TS. Hà Mạnh Đào
Trường học Trường Đại Học Công Nghiệp Hà Nội
Chuyên ngành Công Nghệ Thông Tin
Thể loại Báo Cáo Bài Tập Lớn
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 36
Dung lượng 1,14 MB

Cấu trúc

  • CHƯƠNG 1: GIỚI THIỆU KIẾN THỨC CƠ SỞ LIÊN QUAN (7)
    • 1.1 Giới thiệu về tính toán hiệu năng cao (7)
      • 1.1.1 Tính toán hiệu năng cao là gì? (7)
      • 1.1.2 Cách hoạt động của tính toán hiệu năng cao (7)
      • 1.1.3 Tính toán song song là gì? (9)
      • 1.1.4 Mô hình máy tính song song (13)
      • 1.1.5 Nguyên lý thiết kế giải thuật song song (16)
      • 1.1.6 Giới thiệu thư viện MPI (17)
    • 1.2 Giới thiệu thuật toán tìm kiếm (20)
      • 1.2.1 Định nghĩa (20)
      • 1.2.2 Nguyên lý hoạt động (20)
      • 1.2.3 Phân tích độ phức tạp của thuật toán (20)
  • CHƯƠNG 2: MÔ TẢ CHI TIẾT BÀI TOÁN (22)
    • 2.1 Giới thiệu bài toán (22)
    • 2.2 Cài đặt môi trường MPI (22)
    • 2.3 Các thuật toán tìm kiếm (23)
      • 2.3.1 Thuật toán tìm kiếm tuyến tính sử dụng MPI (23)
      • 2.3.2 Thuật toán tìm kiếm nhị phân sử dụng MPI (25)
      • 2.3.3 Thuật toán tìm nhảy với MPI (28)
    • 2.4 Đánh giá hiệu năng (30)
    • 2.5 Đánh giá theo lý thuyết (31)
    • 2.6 Đánh giá theo thực tế (31)
    • 2.7 Biểu đồ và nhận xét (32)
  • CHƯƠNG 3: TỔNG KẾT (35)
  • TÀI LIỆU THAM KHẢO (36)

Nội dung

Trong suốt nhiều thập kỉ qua, những tiến bộ về Khoa học và Công nghệ đã mang đến những thay đổi lớn trên nhiều lĩnh vực và đóng góp một tầm ảnh hưởng vô cùng quan trọng tới mọi mặt đời sống của con người. Một trong những tiến bộ đó có thể nói tới đó là việc các thiết bị phần cứng ngày nay đang trở nên hoàn hảo và đáp ứng được khả năng tính toán mạnh mẽ trước những yêu cầu phức tạp mà con người đề ra. Tính toán hiệu năng cao (High Performance Computing HPC) trên cơ sở các hệ thống siêu máy tính là một trong những thành phần cốt lõi trong sự phát triển đó và nó đã đánh dấu cho sự thay đổi trong bước chuyển hóa về nghiên cứu dựa trên những công cụ tính toán lớn. HPC được coi là một siêu máy tính tập hợp bởi nhiều máy chủ với sự kết hợp về sức mạnh tính toán giúp hiệu năng có sự vượt trội hơn rất nhiều so với một chiếc máy tính truyền thống. Hệ thống HPC đóng một vai trò quan trọng trong đẩy nhanh tốc độ xử lý, đặc biệt với các bài toán trên tập dữ liệu lớn, đa chiều, sử dụng các thuật toán phức tạp. Chính vì vậy, nhóm chúng em quyết định lựa chọn đề tài “Đánh giá hiệu năng một số thuật toán tìm kiếm sử dụng MPI” này để tìm hiểu, khảo sát và nghiên cứu từ đó có được một cái nhìn toàn diện, kiến thức và sự hiểu biết về tính toán hiệu năng cao đã và đang phát triển mạnh mẽ hiện nay đồng thời tìm và đưa ra những kỳ vọng tương lai giúp cho các hệ thống phát triển và có những hướng đi mới toàn diện hơn nữa.

GIỚI THIỆU KIẾN THỨC CƠ SỞ LIÊN QUAN

Giới thiệu về tính toán hiệu năng cao

1.1.1 Tính toán hiệu năng cao là gì?

Kết hợp sức mạnh tính toán của nhiều máy tính giúp nâng cao hiệu suất vượt trội so với máy tính thông thường, từ đó giải quyết hiệu quả các vấn đề nghiên cứu khoa học và xử lý những tính toán phức tạp.

HPC, viết tắt của High Performance Computing (tính toán hiệu năng cao), thường được gọi là siêu máy tính Đây là một mô hình hệ thống tính toán gồm nhiều máy tính kết nối qua mạng internet hoặc siêu máy tính, được thiết kế để giải quyết các bài toán lớn với tốc độ cao.

Hiệu năng HPC được tính bằng FLOPS.

Tính toán hiệu năng cao thường được sử dụng trong một số vấn đề lớn của thế giới về khoa học, kĩ thuật, tài chính, môi trường …

Hình 1 1 Mô hình tính toán hiệu năng cao

1.1.2 Cách hoạt động của tính toán hiệu năng cao

Hệ thống tính toán hiệu năng cao (HPC) hoạt động bằng cách kết nối các nút máy tính đơn lẻ thành một cụm, cho phép thực hiện một lượng lớn tính toán trong thời gian ngắn.

Các máy tính (nodes) được kết nối với nhau qua mạng Internet để trao đổi dữ liệu.

Hệ thống HPC bao gồm ba phần:

Vì sao HPC quan trọng:

Tính toán hiệu năng cao (HPC) đóng vai trò quan trọng trong nghiên cứu và đổi mới công nghiệp trong nhiều thập kỷ qua, giúp các kỹ sư, nhà khoa học dữ liệu, nhà thiết kế và nhà nghiên cứu giải quyết các vấn đề phức tạp một cách nhanh chóng và tiết kiệm chi phí hơn so với điện toán truyền thống.

Các lợi ích to lớn của HPC:

HPC giúp giảm thiểu việc kiểm tra vật lý bằng cách tạo ra các mô phỏng, từ đó loại bỏ nhu cầu thực hiện các thử nghiệm thực tế Chẳng hạn, trong việc thử nghiệm các vụ tai nạn ô tô, việc sử dụng mô phỏng không chỉ dễ dàng hơn mà còn tiết kiệm chi phí hơn nhiều so với các thử nghiệm va chạm truyền thống.

HPC (High-Performance Computing) sử dụng CPU và GPU mới nhất cùng với mạng có độ trễ thấp như RDMA, kết hợp với thiết bị lưu trữ toàn flash, giúp thực hiện các phép tính lớn chỉ trong vài phút Điều này cho phép HPC hoàn thành các tác vụ mà máy tính thông thường có thể mất hàng tuần, tháng, hoặc thậm chí năm để xử lý.

Chi phí cho HPC dựa trên đám mây giúp giảm thiểu lãng phí thời gian và tiền bạc Điều này cho phép ngay cả các doanh nghiệp nhỏ và công ty khởi nghiệp cũng có khả năng triển khai khối lượng công việc HPC, chỉ cần trả tiền cho những gì họ sử dụng và có thể mở rộng quy mô khi cần thiết.

HPC đóng vai trò quan trọng trong việc thúc đẩy đổi mới sáng tạo ở hầu hết các ngành, góp phần tạo ra những khám phá khoa học đột phá Những tiến bộ này không chỉ nâng cao chất lượng cuộc sống mà còn mang lại lợi ích cho con người trên toàn cầu.

Hệ thống HPC (High-Performance Computing) cung cấp hiệu suất vượt trội so với PC trung bình, giúp các tổ chức hoàn thành nhiệm vụ một cách hiệu quả hơn và khai thác giá trị từ dữ liệu hiện có Việc sử dụng HPC trong quá trình phát triển cho phép các sản phẩm hoặc quy trình mới có cơ hội thành công cao hơn nhờ vào khả năng chạy các mô phỏng phức tạp.

1.1.3 Tính toán song song là gì?

Theo nghĩa đơn giản nhất, tính toán song song là việc sử dụng đồng thời nhiều tài nguyên tính toán để giải quyết một vấn đề tính toán:

● Một vấn đề được chia thành các phần riêng biệt có thể được giải quyết đồng thời

● Mỗi phần được chia nhỏ thành một loạt các hướng dẫn

● Các hướng dẫn từ mỗi phần thực thi đồng thời trên các bộ xử lý khác nhau

● Một cơ chế kiểm soát/phối hợp tổng thể được sử dụng

Hình 1 2 Ví dụ chung về tính toán song song

Hình 1 3 Ví dụ tính toán song song xử lý bảng lương

Vấn đề tính toán sẽ có thể:

● Chia nhỏ các công việc rời rạc để có thể giải quyết đồng thời

● Thực hiện nhiều hướng dẫn chương trình bất cứ lúc nào

● Được giải quyết trong thời gian ngắn hơn với nhiều tài nguyên điện toán so với một tài nguyên điện toán duy nhất.

Các tài nguyên tính toán thường là:

● Một máy tính có nhiều bộ xử lý/lõi

● Một số lượng tùy ý các máy tính như vậy được kết nối bởi một mạng

Hầu như tất cả các máy tính độc lập ngày nay đều song song từ góc độ phần cứng:

● Nhiều đơn vị chức năng (bộ đệm L1, bộ đệm L2, nhánh, tìm nạp trước, giải mã, dấu phẩy động, xử lý đồ họa (GPU), số nguyên, )

● Nhiều đơn vị thực thi/lõi

● Nhiều chủ đề phần cứng

Hình 1 4 Chip Điện toán BG/Q của IBM với 18 lõi (PU) và 16 đơn vị Bộ đệm L2 (L2)

● Các mạng kết nối nhiều máy tính độc lập (các nút) để tạo thành các cụm máy tính song song lớn hơn.

Ví dụ, sơ đồ bên dưới hiển thị một cụm máy tính song song LLNL điển hình:

● Bản thân mỗi nút tính toán là một máy tính song song đa bộ xử lý

● Nhiều nút điện toán được nối mạng cùng với mạng Infiniband

● Các nút mục đích đặc biệt, cũng là bộ xử lý đa năng, được sử dụng cho các mục đích khác

Hình 1 6 Ví dụ về cụm máy tính song song

Hình 1 7 Danh sách các nhà phát triển máy tính song song

1.1.4 Mô hình máy tính song song

Mô hình máy tính song song hiện nay có 4 cách phân loại theo Flynn:

Kiến trúc đơn dòng lệnh đơn luồng dữ liệu (SISD) là loại máy tính chỉ có một CPU, cho phép thực hiện một chỉ lệnh tại mỗi thời điểm Máy tính SISD chỉ có khả năng đọc và ghi một mục dữ liệu duy nhất, sử dụng một thanh ghi gọi là bộ đệm chương trình để nạp địa chỉ của lệnh tiếp theo Điều này dẫn đến việc thực hiện các câu lệnh theo một thứ tự xác định, đảm bảo tính nhất quán trong quá trình xử lý dữ liệu.

 Một máy tính nối tiếp (không song song)

 Chỉ lệnh đơn: Chỉ có một luồng lệnh đang được CPU thực hiện trong bất kỳ một chu kỳ xung nhịp nào

 Dữ liệu đơn: Chỉ một luồng dữ liệu được sử dụng làm đầu vào trong bất kỳ một chu kì đồng hồ nào

 Đây là loại máy tính lâu đời nhất

Ví dụ: máy tính lớn thế hệ cũ, máy tính mini, máy trạm và PC lõi đơn/bộ xử lý.

Hình 1 8 Mô hình kiến trúc máy SISD

Kiến trúc đơn dòng lệnh đa luồng dữ liệu (SIMD) cho phép một đơn vị điều khiển nhiều đơn vị xử lý thực hiện theo cùng một luồng câu lệnh Trong kiến trúc này, CPU phát sinh tín hiệu điều khiển tới tất cả các phần xử lý, cho phép các bộ xử lý thực hiện cùng một phép toán trên các mục dữ liệu khác nhau Mỗi bộ xử lý trong mô hình SIMD có luồng dữ liệu riêng, và mô hình này còn được gọi là SPMD, tức là đơn chương trình và đa dữ liệu.

 Một loại máy tính song song

 Lệnh đơn: Tất cả các đơn vị xử lý thực hiện cùng một lệnh tại bất kỳ chu kỳ xung nhịp nhất định nào

 Nhiều dữ liệu: Mỗi đơn vị xử lý có thể hoạt động trên một phần tử dữ liệu khác nhau

 Thích hợp nhất cho các vấn đề chuyên biệt được đặc trưng bởi mức độ đều đặn cao, chẳng hạn như xử lý đồ họa/hình ảnh.

 Thực thi đồng bộ (lockstep) và xác định

 Hai loại: Mảng bộ xử lý và Đường ống Vector

Hình 1 9 Mô hình kiến trúc máy SIMD

Kiến trúc đa dòng lệnh đơn luồng dữ liệu (MISD): Máy tính loại

MISD có thể thực hiện nhiều chương trình (nhiều lệnh) trên cùng một mục dữ liệu (ngược với máy tính loại SIMD).

 Một loại máy tính song song

 Nhiều lệnh: Mỗi đơn vị xử lý hoạt động trên dữ liệu một cách độc lập thông qua các luồng lệnh riêng biệt.

 Dữ liệu đơn: Một luồng dữ liệu được đưa vào nhiều đơn vị xử lý.

 Rất ít (nếu có) ví dụ thực tế về loại máy tính song song này đã từng tồn tại.

Có nhiều cách sử dụng có thể hiểu được, bao gồm việc áp dụng nhiều bộ lọc tần số trên một luồng tín hiệu và sử dụng nhiều thuật toán mã hóa nhằm bẻ khóa một tin nhắn đã được mã hóa.

Hình 1 10 Mô hình kiến trúc máy MISD

Kiến trúc đa dòng lệnh đa luồng dữ liệu (MIMD): Máy tính loại

MIMD, hay đa bộ xử lý, là kiến trúc trong đó mỗi bộ xử lý thực hiện các luồng lệnh khác nhau trên các luồng dữ liệu riêng biệt Hệ thống MIMD thường có bộ nhớ riêng và có khả năng truy cập bộ nhớ chung, giúp giảm thiểu thời gian trao đổi dữ liệu giữa các bộ xử lý Mặc dù đây là loại kiến trúc phức tạp nhất, nhưng nó hỗ trợ xử lý song song hiệu quả nhất, với nhiều máy tính được thiết kế theo cấu trúc này như BBN Butterfly, Alliant FX, và iSPC của Intel.

 Một loại máy tính song song

 Nhiều lệnh: Mỗi bộ xử lý có thể đang thực thi một luồng lệnh khác nhau

 Nhiều dữ liệu: Mọi bộ xử lý có thể đang làm việc với một luồng dữ liệu khác

 Việc thực thi có thể đồng bộ hoặc không đồng bộ, xác định hoặc không xác định

 Hiện tại, loại máy tính song song phổ biến nhất - hầu hết các siêu máy tính hiện đại đều thuộc loại này.

Giới thiệu thuật toán tìm kiếm

Tìm kiếm đánh giá song song là phương pháp hiệu quả cho việc xử lý tập dữ liệu lớn, cho phép chia nhỏ dữ liệu thành nhiều phần và thực hiện nhiều tác vụ đồng thời Phương pháp này đáp ứng tốt các yêu cầu về tốc độ cao trong tìm kiếm.

1.2.2 Nguyên lý hoạt động Để triển khai tìm kiếm bằng MPI trong C++, bạn sẽ chia mảng thành các phần nhỏ hơn và gán mỗi phần cho một luồng MPI khác.

Mỗi luồng sẽ thực hiện tìm kiếm đồng thời trong đoạn mảng được chỉ định và giao tiếp với các luồng khác để phối hợp quá trình tìm kiếm hiệu quả.

1.2.3 Phân tích độ phức tạp của thuật toán Độ phức tạp của một thuật toán tìm kiếm song song phụ thuộc vào nhiều yếu tố, trong đó có:

● Kích thước tập dữ liệu: Độ phức tạp của thuật toán tìm kiếm song song thường tăng dần với kích thước tập dữ liệu

● Số lượng tác vụ song song: Số lượng tác vụ song song càng cao, độ phức tạp của thuật toán càng cao

Số lần tìm kiếm và độ khó của thuật toán ảnh hưởng trực tiếp đến độ phức tạp của chúng Khi số lần tìm kiếm tăng cao, thuật toán sẽ trở nên phức tạp hơn Ngoài ra, một số thuật toán tìm kiếm có độ khó cao hơn, dẫn đến sự gia tăng độ phức tạp trong quá trình tìm kiếm.

Trong một số trường hợp, thuật toán tìm kiếm song song có thể được ưu tiên hơn thuật toán tìm kiếm tuần tự, đặc biệt khi làm việc với tập dữ liệu lớn và yêu cầu tốc độ xử lý cao.

MÔ TẢ CHI TIẾT BÀI TOÁN

Giới thiệu bài toán

Bài toán yêu cầu tìm kiếm một số trong một mảng số nguyên tăng dần và đôi một khác nhau.

Cài đặt môi trường MPI

Bước 1: Cài đặt thư viện MPI cho VS 2019 (trên máy đã cài sẵn VS

 Bộ cài đặt gồm 2 file: msmpisetup.exe, msmpisdk.msi

 Tiến hành cài đặt 2 tệp

Bước 2: Cấu hình MPI trong VS 2019

Trong dự án mới, mở cửa sổ properties của dự án chọn mục VC++ Directories Thêm các đường dẫn như sau:

 Thêm vào Additional Include Directories:$(MSMPI_INC); $

 Thêm vào Additional Dependencies của Linker/Input thư viện msmpi.lib, lưu ý thêm dấu ‘;’ vào sau msmpi.lib để phân tách với chuỗi khác

 Thêm vào mục Additional Library Directories của Linker/General chuỗi: $(MSMPI_LIB64)

Bước 3: Chạy chương trình test

Các thuật toán tìm kiếm

2.3.1 Thuật toán tìm kiếm tuyến tính sử dụng MPI Ý tưởng thuật toán:

Ta sẽ chia mảng thành các phần nhỏ hơn và gán mỗi phần cho một luồng MPI khác.

Mỗi quy trình sẽ thực hiện tìm kiếm tuyến tính trên đoạn mảng được chỉ định và giao tiếp với các quy trình khác để phối hợp tìm kiếm hiệu quả.

Sau khi tìm kiếm hoàn tất, sẽ thu thập tất cả kết quả từ các luồng.

#include using namespace std;

// Hàm random 1 số từ 1 đến limit int randomNoGenerator(int limit)

{ random_device rd; mt19937 gen(rd()); uniform_int_distribution dis(1, limit); return dis(gen);

// Hàm khởi tạo giá trị mảng void createArray(int n, int* a)

In the main function, two variables, rank and size, are initialized to manage parallel processing A target value is generated randomly using the randomNoGenerator function, with a maximum limit defined by the constant N set to 200,000 The createArray function is then called to initialize the array 'a' with the specified size, preparing it for further operations.

MPI_Init(&argc, &argv); // Khởi tạo môi trường MPI

MPI_Comm_rank(MPI_COMM_WORLD, &rank); // Lưu id của luồng hiện tại vào biến rank

MPI_Comm_size(MPI_COMM_WORLD, &size); // Lưu số lượng luồng vào biến size double start = clock(); // Lấy thời gian hiện tại

// Chia mảng thành các mảng nhỏ đều cho các luồng int local_size = N / size; int* local_a = new int[local_size];

MPI_Scatter(a, local_size, MPI_INT, local_a, local_size, MPI_INT, 0,

// Thực hiện linear search trên mỗi luồng int found = -1; for (int i = 0; i < local_size; i++) { if (local_a[i] == target) { found = i; break;

// Thu thập kết quả từ tất cả các luồng int* found_all = new int[size];

MPI_Gather(&found, 1, MPI_INT, found_all, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if (rank == 0) {

// Tìm luồng có chứa giá trị cần tìm. int process = -1; for (int i = 0; i < size; i++) { if (found_all[i] != -1) { process = i; break;

// Xuất ra thời gian thực hiện, luồng tìm được cout

Ngày đăng: 12/01/2024, 19:41

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w