Như chúng ta đã thấy các phần mềm phổ biến ngày nay hầu hết đều được viết trên cơ sở của tính toán tuần tự. Các phần mềm này thường được thực hiện trên một máy tính đơn với duy nhất một bộ xử lý. Vấn đề ở đây được giải quyết thông qua một chuỗi các lệnh tuần tự được thực hiện bởi một bộ xử lý. Tại một thời điểm chỉ có một lệnh được thực hiện. Tính toán song song ra đời là một sự cải tiến của tính toán tuần tự. Nó là sự giải quyết vấn đề dựa trên sự thực thi đồng thời của nhiều tài nguyên máy tính. Tài nguyên máy tính đây bao gồm: Một máy tính đơn với nhiều bộ xử lý Nhiều máy tính nối lại với nhau thành một mạng máy tính Kết hợp cả hai loại trên Tính toán song song thường được dùng để giải quyết các vấn đề hết sức phức tạp yêu cầu thời gian tính toán lớn hoặc làm việc với khối dữ liệu lớn như các bài toán dự báo thời tiết, mô phỏng tai nạn xe hơi, xây dựng các mô hình thương mại và các vấn đề khoa học như khai phá dữ liệu , trí tuệ nhân tạo, an toàn dữ liệu… 1.1.2 Tại sao phải tính toán song song?
Tổng quan về mô hình lập trình song song với MPI
Tính toán song song
1.1.1 Tính toán song song là gì?
Các phần mềm phổ biến hiện nay chủ yếu được phát triển dựa trên tính toán tuần tự, thường chạy trên một máy tính đơn với một bộ xử lý duy nhất Vấn đề được giải quyết thông qua một chuỗi lệnh tuần tự, trong đó tại mỗi thời điểm chỉ có một lệnh được thực hiện.
Tính toán song song đã được phát triển như một bước tiến vượt bậc so với tính toán tuần tự, cho phép giải quyết vấn đề hiệu quả hơn thông qua việc sử dụng đồng thời nhiều tài nguyên máy tính.
Tài nguyên máy tính đây bao gồm:
- Một máy tính đơn với nhiều bộ xử lý
- Nhiều máy tính nối lại với nhau thành một mạng máy tính
- Kết hợp cả hai loại trên
Tính toán song song là phương pháp hiệu quả để giải quyết các vấn đề phức tạp, yêu cầu thời gian tính toán lớn và xử lý khối lượng dữ liệu lớn Nó được áp dụng trong nhiều lĩnh vực như dự báo thời tiết, mô phỏng tai nạn xe hơi, xây dựng mô hình thương mại, khai phá dữ liệu, trí tuệ nhân tạo và an toàn dữ liệu.
1.1.2 Tại sao phải tính toán song song?
Tính toán song song là một phương pháp quan trọng, đặc biệt khi giải quyết các bài toán yêu cầu thời gian tính toán lớn và khối lượng dữ liệu khổng lồ Ngoài ra, nó còn giúp tối ưu hóa việc sử dụng tài nguyên từ nhiều máy tính trong mạng LAN hoặc qua internet, cho phép kết hợp nhiều tài nguyên tính toán nhỏ để tạo thành một siêu máy tính Việc phân bổ bộ nhớ trên nhiều máy tính cũng rất hiệu quả trong việc xử lý các vấn đề lớn, do hạn chế về không gian lưu trữ của bộ nhớ trên một máy đơn.
Giới hạn của tính toán tuần tự bao gồm cả nguyên nhân thực tế và nguyên nhân vật lý, gây ra nhiều thách thức trong việc xây dựng máy tính tuần tự tốc độ cao.
Tốc độ truyền dữ liệu của máy tính tuần tự phụ thuộc vào quá trình di chuyển dữ liệu trong phần cứng, do đó, để tăng tốc độ thực hiện, cần tập trung vào các yếu tố tính toán.
Công nghệ chế tạo bộ xử lý hiện đại cho phép tích hợp nhiều bóng bán dẫn trên một con chip, nhưng điều này cũng dẫn đến việc tăng kích thước của bộ xử lý.
- Về thương mại: Việc tạo ra một bộ xử lý tốc độ xử lý cao là rất tốn kém.
Sử dụng nhiều bộ xử lý nhỏ đạt hiệu quả tương tự mà lại ít tốn kém hơn.
1.1.3 Các thành phần liên quan đến tính toán song song
- Kiến trúc máy tính song song.
- Ngôn ngữ lập trình song song.
1.1.4 Nguyên lý thiết kế thuật toán song song
Để thực hiện xử lý song song, cần xem xét cả kiến trúc máy tính và các thuật toán song song Việc thiết kế các thuật toán song song đòi hỏi phải tiến hành một cách cẩn thận và có hệ thống.
- Phân chia dữ liệu cho các tác vụ.
- Chỉ ra cách truy cập và chia sẻ dữ liệu.
- Phân các tác vụ cho các tiến trình (bộ xử lí).
- Các tiến trình được đồng bộ ra sao
Khi thiết kế một thuật toán song song có thể sử dụng năm nguyên lí chính trong thiết kế thuật toán song song:
Nguyên lý lập lịch nhằm tối ưu hóa việc sử dụng bộ xử lý trong thuật toán, đảm bảo rằng thời gian tính toán không tăng lên khi xem xét độ phức tạp Mục tiêu chính là giảm thiểu số lượng bộ xử lý cần thiết mà vẫn duy trì hiệu suất tính toán ổn định.
- Nguyên lý hình ống: Nguyên lý này được áp dụng khi bài toán xuất hiện một dãy các thao tác {T1, T2, , Tn}, trong đó Ti+1 thực hiện sau khi
- Nguyên lý chia để trị: Chia bài toán thành những phần nhỏ hơn tương đối độc lập với nhau và giải quyết chúng một cách song song.
Nguyên lý đồ thị phụ thuộc dữ liệu tập trung vào việc phân tích mối quan hệ giữa các dữ liệu trong quá trình tính toán Bằng cách xây dựng đồ thị phụ thuộc dữ liệu, chúng ta có thể phát triển các thuật toán song song hiệu quả.
Nguyên lý điều kiện tương tranh đề cập đến tình huống khi hai tiến trình đồng thời muốn truy cập vào một mục dữ liệu chia sẻ Trong trường hợp này, chúng phải tương tranh với nhau, có nghĩa là sự truy cập của một tiến trình có thể cản trở hoặc ảnh hưởng đến tiến trình còn lại.
Khi thiết kế thuật toán song song, ngoài các nguyên lý cơ bản, cần chú ý đến kiến trúc của hệ thống tính toán Việc chuyển đổi từ thuật toán tuần tự sang thuật toán song song, hoặc điều chỉnh thuật toán song song cho phù hợp với kiến trúc hiện có, đòi hỏi xác định rõ các yêu cầu cần thiết.
- Kiến trúc tính toán nào sẽ phù hợp với bài toán?
- Những bài toán loại nào sẽ xử lý hiệu quả trong kiến trúc song song cho trước ?
Giới thiệu về OpenMP
OpenMP là một giao diện lập trình ứng dụng (API) cho phép điều khiển các luồng trên cấu trúc chia sẻ bộ nhớ chung Các thành phần chính của OpenMP bao gồm các chỉ thị, thư viện và biến môi trường, giúp lập trình viên dễ dàng phát triển các ứng dụng đa luồng hiệu quả.
1 Các chỉ thị biên dịch (Compiler Directives)
2 Các thư viện runtime (Runtime Library Routines)
3 Các biến môi trường (Emviroment Variables)
Các chỉ thị biên dịch, thư viện runtime và biến môi trường được sử dụng để lập trình song song với ngôn ngữ Fortran và C/C++ OpenMP là chuẩn bộ nhớ chia sẻ được hỗ trợ bởi nhiều nền tảng phần cứng và phần mềm như DEC, Intel, IBM, SGI, và Numerical Algorithms Group Ngoài ra, OpenMP còn có khả năng thực thi trên cả môi trường UNIX và Windows NT.
Trước thập kỷ 90, các nhà cung cấp máy tính chia sẻ bộ nhớ đã phát triển sản phẩm hỗ trợ đồng bộ và chỉ thị cơ bản, trong đó ngôn ngữ Fortran được sử dụng phổ biến để lập trình chương trình song song Người dùng có thể rút ngắn thời gian thực hiện các chương trình Fortran bằng cách thực hiện vòng lặp song song, với trình biên dịch tự động hóa quá trình này qua các BXL SMP Tuy nhiên, mỗi nhà cung cấp áp dụng phương thức và thực thi khác nhau tùy thuộc vào nền tảng phần cứng của họ Để chuẩn hóa lập trình song song trên kiến trúc chia sẻ bộ nhớ, chuẩn ANSI X3H5 ra đời vào năm 1994 nhưng không tồn tại lâu do sự phổ biến của máy tính bộ nhớ phân tán Chuẩn OpenMP được giới thiệu vào mùa xuân năm 1997 để thay thế ANSI X3H5, trong bối cảnh máy tính chia sẻ bộ nhớ đang thịnh hành Mặc dù Pthread cũng được phát triển, nhưng nó thiếu tính mở rộng và chỉ thị biên dịch, khiến việc lập trình song song trở nên khó khăn và đòi hỏi người lập trình phải quan tâm nhiều đến chi tiết ở mức thấp OpenMP được thiết kế nhằm khắc phục những nhược điểm này của Pthread.
1.2.3 Mục đích và ứng dụng của OpenMP
OpenMP được phát triển nhằm cung cấp một tiêu chuẩn chung cho nhiều kiến trúc và nền tảng phần cứng khác nhau Nó thiết lập một bộ các chỉ thị biên dịch hỗ trợ lập trình song song trên máy tính với bộ nhớ chia sẻ Việc thực thi song song thường sử dụng từ ba đến bốn chỉ thị chính OpenMP giúp đơn giản hóa quá trình lập trình song song, cho phép song hóa các chương trình tuần tự mà không cần sử dụng thư viện thông điệp.
OpenMP là công cụ hữu ích trong việc giải quyết các vấn đề thời gian, chẳng hạn như dự báo thời tiết Nó cũng được áp dụng để mô phỏng các tình huống thực tế, như tai nạn xe hơi, và giải quyết các bài toán khoa học đòi hỏi khối lượng tính toán lớn, ví dụ như mô phỏng N-Body.
1.2.4 Mô hình lập trình song song OpenMP
1.2.4.1 Song song hóa d a trên c ch lu ng (Thread based ựa trên cơ chế luồng (Thread based ơ chế luồng (Thread based ế luồng (Thread based ồng (Thread based parallelism)
Trong mô hình này, chương trình xử lý trên bộ nhớ toàn cục có nhiều luồng thực thi đồng thời OpenMP được xây dựng dựa trên nguyên tắc của mô hình lập trình chia sẻ bộ nhớ chung, cho phép tối ưu hóa hiệu suất thông qua việc sử dụng nhiều luồng.
1.2.4.1.1 Mô hình song song hi n (Explicit Parallelism) ện (Explicit Parallelism)
Mô hình trên là một mô hình lập trình không tự động Người lập trình có quyền điều khiển việc song song hóa một cách độc lập
OpenMP sử dụng mô hình Fork-Join để thực thi công việc song song, bắt đầu với một luồng chủ (master thread) thực hiện các tác vụ tuần tự cho đến khi gặp vùng song song (parallel region) đầu tiên Khi đó, luồng chủ sẽ tạo ra một tập các luồng song song, và đoạn mã trong vùng song song sẽ được thực thi đồng thời bởi các luồng này.
Khi luồng song song hoàn thành mã trong vùng song song, chúng sẽ được đồng bộ hóa và kết thúc, sau đó công việc sẽ tiếp tục được thực hiện bởi luồng chính.
Hình 1: Mô Hình Fork-Join
1.2.4.2 Các ch th trong OpenMPỉ thị trong OpenMP ị trong OpenMP
1.2.4.2.1 Khuôn d ng ch th trong OpenMPạng chỉ thị trong OpenMP ỉ thị trong OpenMP ị trong OpenMP
Chỉ thị trong OpenMP được cho dưới dạng sau
# pragma omp directive-name [clause ] newline
# pragma omp: Yêu cầu bắt buộc đối với mọi chỉ thị OpenMP C/C++
directive-name: Là tên của chỉ thị phải xuất hiện sau #pragma omp và đứng trước bất kì mệnh đề nào
[clause ]: Các mệnh đề này không bắt buộc trong chỉ thị
Mỗi chỉ thị trong mã lệnh đều yêu cầu một cấu trúc cụ thể, được bao bọc bởi chỉ thị a Phạm vi tĩnh (Static Extent) chỉ bao gồm các đoạn mã nguyên bản từ đầu đến cuối khối cấu trúc, và không mở rộng đến các thủ tục hay tệp chứa mã Ngoài ra, cần lưu ý đến khái niệm chỉ thị đơn độc (Orphaned Directive), liên quan đến các chỉ thị không có mối liên hệ rõ ràng với các phần khác trong mã.
Chỉ thị đơn độc là một loại chỉ thị xuất hiện độc lập, không bị ảnh hưởng bởi các chỉ thị khác Nó tồn tại ngoài phạm vi tĩnh của những chỉ thị này và có khả năng mở rộng thông qua các thủ tục và tệp mã nguồn C Phạm vi động (Dynamic Extent) của chỉ thị đơn độc cho phép nó hoạt động một cách linh hoạt trong các tình huống khác nhau.
Phạm vi động của chỉ thị bao gồm phạm vi tĩnh của của chỉ thị và phạm vi của các chỉthị mồ côi 2.2.2.2 Cấu trúc vùng song song
Một vùng song song là một khối mã nguồn được thực thi bởi nhiều luồng Trong C/C++ một vùng song song có định dạng như sau:
Khi một luồng gặp chỉ thị PARALLEL trong OpenMP, nó sẽ tạo ra một tập hợp các luồng, trong đó luồng ban đầu là luồng chủ (luồng số 0) Mỗi luồng sẽ nhận một bản sao của đoạn mã trong vùng song song để thực hiện song song Luồng chủ sẽ chờ cho tất cả các luồng hoàn thành công việc của mình trước khi tiếp tục thực hiện các công việc còn lại Để xác định số lượng luồng thực hiện mã song song, ta sử dụng hàm OMP_NUM_THREADS(), và để biết số thứ tự của từng luồng, ta dùng hàm OMP_GET_THREAD_NUM() Lưu ý rằng số thứ tự của các luồng nằm trong khoảng từ 0 đến số thứ tự của luồng chủ trừ đi 1 Khái niệm vùng song song cũng dẫn đến việc xuất hiện vùng song song lồng và luồng động.
Vùng song song lồng (Nested Parallel Region) đề cập đến việc trong một vùng song song con có thể xuất hiện các vùng song song nhỏ hơn Luồng động (Dynamic Thread) cho phép hệ thống gán số lượng luồng thực hiện cho mỗi vùng song song một cách linh hoạt, thay vì giữ số lượng luồng bằng nhau theo mặc định Để kích hoạt tính năng này, người dùng có thể sử dụng hàm thư viện omp_set_dynamic() hoặc thiết lập biến môi trường OMP_DYNAMIC.
1.2.4.2.2Các hàm OpenMP thường dùngng dùng
Hàm `omp_get_max_threads` trả về giới hạn tối đa số luồng có thể sử dụng trong một nhóm mới, trong khi `omp_get_num_procs` cung cấp số lượng bộ xử lý khả dụng cho thiết bị Hàm `omp_get_num_threads` cho biết số luồng đang hoạt động, và `omp_get_wtime` trả về thời gian thực tế đã trôi qua tính bằng giây Hàm `omp_in_parallel` kiểm tra xem mức hoạt động ICV có lớn hơn không, trả về true nếu có và false nếu không Ngoài ra, `omp_init_lock` và `omp_init_nest_lock` được sử dụng để khởi tạo các khóa.
Khởi tạo khóa với omp_set_dynamic cho phép điều chỉnh động số lượng luồng để thực hiện các vùng song song, thông qua việc thiết lập giá trị của ICV dyn-var Hàm omp_set_nested không còn được sử dụng để cho phép hoặc vô hiệu hóa song song lồng nhau, mà thay vào đó, ICV tối đa mức hoạt động-var sẽ được thiết lập Các hàm omp_test_lock và omp_test_nest_lock cũng hỗ trợ quản lý khóa trong môi trường đa luồng.
Các thói quen này nhằm thiết lập khóa OpenMP mà không làm ngừng các tác vụ thực hiện Hàm omp_unset_lock và omp_unset_nest_lock cung cấp cách thức để gỡ bỏ khóa OpenMP.
Phương pháp giải quyết bài toán
Bài toán nhân 2 ma trận dày đặc (dense) và thuật toán Cannon
2.1.1 Ma trận dày đặc (dense) là gì?
Trong phân tích số và tính toán khoa học, ma trận dày đặc là loại ma trận mà hầu hết các phần tử khác 0, với số lượng phần tử bằng 0 rất ít Ngược lại, ma trận thưa được định nghĩa là ma trận có phần lớn các phần tử bằng 0.
Trong toán học, phép nhân ma trận là một phép toán nhị phân tạo ra một ma trận mới từ hai ma trận đã cho Để thực hiện phép nhân này, số cột của ma trận thứ nhất phải bằng số hàng của ma trận thứ hai Kết quả của phép nhân, được gọi là tích ma trận, sẽ có số hàng tương ứng với ma trận đầu tiên và số cột tương ứng với ma trận thứ hai.
Nếu A là ma trận m×n và B là ma trận n×p, thì tích ma trận C = A×B (ký hiệu không có dấu nhân hoặc dấu chấm) được xác định là ma trận m×p.
2.1.3 Thiết kế thuật toán song song nhân 2 ma trận dày đặc (dense) Để đơn giản, chúng ta sẽ làm việc với ma trận vuông kích thước n × n Coi số lượng bộ xử lý có sẵn trong các máy song song là p Ma trận cần nhân sẽ là 2 ma trận dày đặc (có ít số 0) A và B có cùng kích thước n × n Kết quả sẽ được lưu trữ trong ma trận C.
Ta thực hiện phép nhân theo các bước sau:
B1: Chia ma trận thành các khối vuông Pi, trong đó Pi là các threads có sẵn (vd 4 threads thì có P0, P1, P2, P3).
B2: Tạo ma trận các quy trình có kích thước P*1/2 × P*1/2 sao cho mỗi quá trình có thể duy trì một khối ma trận A con và một khối ma trận B con.
Mỗi khối được chuyển đến từng quy trình, trong khi các phần phụ được sao chép từ các khối và nhân với nhau Kết quả của quá trình này sẽ được thêm vào các tiểu khối C.
B4: Các khối con A được đẩy sang trái một bước và các khối con B được cuộn lên một bước.
Cho 2 ma trận dày đặc A và B có kích thước 4x4
Hình 2 ví dụ ma trận dày đặc
Cho p=4, chia ma trận A và ma trận B thành 4 khối:
Hình 3 Tách ma trận thành các khối 1
Hình 4 Căn chỉnh ma trận
Hình 5 Nhân các ma trận con
Các khối con A được đẩy sang trái một bước và các khối con B được cuộn lên một bước.
Tính tích 2 ma trận bằng thuật toán tuần tự và thuật toán song song
#define N 4000 // Kich thuoc ma tran NxN int main() { int** a = (int**)malloc(N * sizeof(int*)); for (int i = 0; i < N; i++)
} int** b = (int**)malloc(N * sizeof(int*)); for (int i = 0; i < N; i++)
} int** c = (int**)malloc(N * sizeof(int*)); for (int i = 0; i < N; i++)
} clock_t start, end; double dif; printf("Khoi tao ma tran \n"); start = clock(); for (int i = 0; i < N; i++)
} printf("Nhan hai ma tran \n"); for (int i = 0; i < N; i++)
} end = clock(); dif = ((double)(end - start)) / CLOCKS_PER_SEC; printf("Xong Thoi gian thuc hien het: %f giay.\n", dif); for (int i = 0; i < N; i++)
} Độ phức tạp: Đây là phép nhân giữa 2 ma trận vuông cấp n, vì vậy, số lượng phép toán cơ bản giữa các đại lượng vô hướng là 2n ³-n² = O(n³).
#define N 2000 // Kich thuoc ma tran NxN int main(int argc, char* argv[])
a, **b, **c; sử dụng các biến tid, nthreads, chunk để lưu trữ số lượng thread và kích thước chunk là 10 Biến double dif được sử dụng để lưu trữ thời gian tính toán Các biến int i, j, k được dùng cho vòng lặp trong quá trình thực hiện.
/* Cap phat bo nho cho ma tran A */ a = (int**)malloc(10 * N); for (i = 0; i < N; i++)
/* Cap phat bo nho cho ma tran B */ b = (int**)malloc(10 * N); for (i = 0; i < N; i++)
/* Cap phat bo nho cho ma tran C */ c = (int**)malloc(10 * N); for (i = 0; i < N; i++)
} printf("Khoi tao ma tran \n"); double start = omp_get_wtime(); // Bat dau dem thoi gian
/*** Tao mot vung song song voi cac bien chia se giua cac thread gom: a,b,c nthread, chunks va cac bien rieng duoc su dung cho cac thread la i,j,k ***/
#pragma omp parallel shared(a, b, c, nthreads, chunk) private(tid, i, j, k) { tid = omp_get_thread_num(); if (tid == 0)
{ nthreads = omp_get_num_threads(); // Lay so thread duoc su dung printf("Bat dau nhan ma tran voi so thread la: %d threads\n", nthreads);
/* Khai bao mot vong lap duoc thuc hien song song giua cac thread voi lich trinh Tinh va kich thuoc moi doan la 10*/
#pragma omp for schedule(static, chunk) for (i = 0; i < N; i++)
/* Khai bao mot vong lap duoc thuc hien song song giua cac thread voi lich trinh Tinh va kich thuoc moi doan la 10*/
#pragma omp for schedule(static, chunk) for (i = 0; i < N; i++)
/* Khai bao mot vong lap duoc thuc hien song song giua cac thread voi lich trinh Tinh va kich thuoc moi doan la 10*/
#pragma omp for schedule(static, chunk) for (i = 0; i < N; i++)
/* Khai bao mot vong lap duoc thuc hien song song giua cac thread voi lich trinh Tinh va kich thuoc moi doan la 10*/
#pragma omp for schedule(static, chunk) for (i = 0; i < N; i++)
The process concludes with the recording of the end time using `omp_get_wtime()` The execution duration is calculated by subtracting the start time from the end time, yielding a total execution time Finally, the results are displayed, indicating that the operation is complete, along with the total execution time in seconds.
} Độ phức tạp: độ phức tạp của thuật toán Cannon là O( p 3 2 ).
Một số vấn đề về hiệu năng
Việc song song hóa một chương trình nhằm tăng tốc độ thực thi của nó, nhưng mức độ tăng tốc này phụ thuộc vào nhiều yếu tố Định luật Amdahl’s cung cấp công thức để xác định mức độ cải thiện hiệu suất khi song song hóa, đặc biệt là trong khía cạnh thời gian.
Trong một chương trình có 22 chạy, một phần p có thể được song song hóa, trong khi phần 1-p phải chạy tuần tự Nếu sử dụng n bộ xử lý trong điều kiện lý tưởng, thời gian chạy của chương trình sẽ là 1-p cộng với p/n so với thời gian chạy tuần tự Đây là hệ quả trực tiếp từ định luật Amdahl trong trường hợp thực thi lý tưởng.
Nếu 80% chương trình có khả năng song song hóa và chúng ta sử dụng 4 bộ xử lý, thời gian chạy song song sẽ được tính toán là 1 - 0.8 + 0.8/4, dẫn đến kết quả là 0.4, tương đương với 40% thời gian chạy tuần tự.
Thời gian chạy song song của chương trình không thể nhỏ hơn 20% so với thời gian chạy tuần tự, ngay cả khi sử dụng nhiều bộ xử lý Trong thực tế, khi thực hiện chương trình song song, chi phí truyền thông và sự phân công công việc không đồng đều giữa các bộ xử lý thường dẫn đến thời gian chạy tăng lên.
Hình 9 So sánh thời gian chạy 2
Do vậy để tăng tốc độ của chương trình ta cần:
- Tăng tỉ lệ (thành phần) được song song hóa của chương trình.
- Phân công công việc một cách công bằng cho các bộ xử lý.
- Giảm tới mức tối thiểu thời gian truyền thông.
Thực nghiệm và kết quả
Cấu hình thiết bị
Môi trường tiến hành thực nghiệm
Hai ma trận vuông, có kích thước như nhau.
Kích thước ma trận tăng dần từ 500 đến 4000, mỗi lần tăng 500
Mỗi lần kiểm tra được chạy 3 lần, lấy thời gian trung bình
Môi trường lập trình: Microsoft Visual Studio 2019
Chạy kiểm tra trên máy tính Core i5 2.50GHz, 4 core, 8 threads
Hình 10 Cấu hình thiết bị
Kết quả thực hiện
Bảng 1: Thời gian tính toán nhân hai ma trận không sử dụng OpenMP
Kích thước ma trận (NxN)
Thời gian chạy lần 1 (Giây)
Thời gian chạy lần 3 (Giây)
Thời gian chạy trung bình (Giây)
Thời gian chạy lâu nhất (Giây)
Bảng 2: Thời gian tính toán nhân hai ma trận sử dụng OpenMP
Kích thước ma trận (NxN)
Thời gian chạy lần 1 (Giây)
Thời gian chạy lần 2 (Giây)
Thời gian chạy lần 3 (Giây)
Thời gian chạy trung bình (Giây)
Thời gian chạy lâu nhất (Giây)
Bảng 3: Tính toán Speed up và Efficiency dựa trên thời gian chạy trung bình
Kích thước ma trận (NxN) Without
Bảng 4: Tính toán Speed up và Efficiency dựa trên thời gian chạy lâu nhất
Với n là kích thước của ma trận nxn, s là thời gian nhân ma trận:
Hình 11Biểu đồ so sánh thời gian tính toán trung bình
Hình 12 Biểu đồ so sánh thời gian tính toán lâu nhất
Hình 13 Biểu đồ Speed Up
Kết luận
Trong bài tiểu luận này, chúng ta đã phân tích sự khác biệt giữa tính toán song song và tính toán tuần tự Tính toán song song là phương pháp tận dụng nhiều tài nguyên tính toán cùng lúc để hoàn thành một nhiệm vụ cụ thể, trong khi tính toán tuần tự chỉ sử dụng một tài nguyên tính toán duy nhất để thực hiện tác vụ.
Từ các kết quả và thông tin được cung cấp trong bài tiểu luận, chúng ta có thể rút ra những kết luận quan trọng sau:
1 Tính toán song song có thể cung cấp tăng tốc đáng kể so với tính toán tuần tự Nhìn chung, các kích thước ma trận lớn hơn có xu hướng đạt được tăng tốc lớn hơn Điều này là do tính toán song song có thể chia nhỏ tác vụ thành các phần nhỏ hơn và thực hiện chúng đồng thời trên nhiều tài nguyên tính toán.
2 Tuy nhiên, tăng tốc không phải lúc nào cũng tuyến tính theo kích thước ma trận Có thể thấy rằng, khi kích thước ma trận tăng lên, tăng tốc dần giảm Điều này có thể do những yếu tố như tải cân bằng, chi phí giao tiếp giữa các tiểu tác vụ và đồng bộ hóa dữ liệu.
3 Hiệu suất (efficiency) là một chỉ số quan trọng để đánh giá hiệu quả của tính toán song song Efficiency đo lường mức độ tận dụng tài nguyên tính toán có sẵn Các giá trị efficiency trong bài tiểu luận đều dưới 100%, điều này cho thấy việc tận dụng tài nguyên chưa hoàn hảo và có thể cải thiện.