Vấn đề của tính toán song song thường được thể hiện qua các đặc điểmnhư khả năng:- Chia thành các phần riêng biệt các công việc để có thể giải quyếtcùng một lúc.- Thực thi nhiều cầu lệnh
CƠ SỞ LÝ THUYẾT
Giới thiệu về tính toán song song
1.1.1 Thế nào là lập trình, tính toán song song?
Tính toán song song là một hình thức tính toán trong đó nhiều phép tính được thực hiện đồng thời, hoạt động truyên nguyên tắc là những vấn đề lớn đều có thể chia thành nhiều vấn đề nhỏ hơn, sau dó được giải quyêt tương tranh (“trong lĩnh vực tính toán”)
Có nhiều hình thức khác nhau của tính toán song song: song song dữ liệu, song song cấp lệnh và song song tác vụ Song song đã được sử dụng nhiều năm qua chủ yêu trong lĩnh vực tính toán hiệu năng cao Tính toán song song đã trở thành mô hình thống trị trong lĩnh vực kiến trúc máy tính, phần lớn là dưới dạng bộ xử lý đa nhân.
Thông thường, phần mềm được viết cho tính toán tuần tự, được chạy trên các máy tính đơn với 1 bộ xử lý trung tâm Một bài toán được chia thành một chuỗi các câu lệnh rời rạc, các câu lệnh này sẽ được thực hiện một cách tuần tự, và tại mỗi thời điểm chỉ thực hiện được 1 câu lệnh.
Hình 1 1 Tính toán tuần tự Ý nghĩa đơn giản nhất của tính toán song song là việc sử dụn đồng thời nhiều tài nguyên máy tính để giải quyết bài toán về tính toán Để chạy trên nhiều CPU, một bài toán lớn được chia thành các bài toán nhỏ riêng biệt mà có thể giải quyết đồng thời, mỗi phần lại được chia nhỏ hơn dưới dạng dãy các câu lệnh Các câu lệnh của mỗi phần thực thi đồng thời trên các CPU khác nhau.
Hình 1 2 Tính toán song song
Vấn đề của tính toán song song thường được thể hiện qua các đặc điểm như khả năng:
- Chia thành các phần riêng biệt các công việc để có thể giải quyết cùng một lúc.
- Thực thi nhiều cầu lệnh chương trình tại nhiều thời điểm.
- Giải quyết bài toán trong thời gian ít hơn và nhiều tài nguyên máy tính hơn là thực thi trê một tài nguyên duy nhất.
1.1.2 Tại sao cần tính toán song song?
Theo xu hướng phát triển của công nghệ thông tin, các bộ xử lý đa nhân, đa lõi (multiple processor) đang dần dần thay thế các bộ xử lý đơn lõi (single processor) tuy nhiên với lối lập trình truyền thống (lập trình tuần tự), các câu lệnh, các quá trình xử lý được thực hịên một cách lần lượt, tuần tự như vậy sẽ không phát huy hết công năng, hiệu năng của bộ vi xử lý đa nhân, đa lõi (multiple processor) Lập trình, tính toán song song ra đời như một lời giải cho yêu cầu, thách thức đặt ra là làm thế nào để phát huy công năng, hiệu năng của bộ đa xử lý (multiple processor).
Trên thực tế, có rất nhiều bài toán với dữ liệu lớn, độ phức tạp tính toán cao mà đòi hỏi thời gian xử lý ngắn, độ chính xác cao Vd: các bài toán liên quan tới xử lý ảnh, xử lý tín hiệu, dự báo thời tiết, mô phỏng giao thông, mô phỏng sự chuyển động của các phân tử, nguyên tử, mô phỏng bản đồ gen, các bài toán liên quan đến cơ sở dữ liệu và khai thác cơ sở dữ liệu với bộ xử lý đơn lõi thì khó có thể thực hiện và cho kết quả như mong muốn được.
Lập trình, tính toán song song là lời giải đáp cho bài toán tăng hiệu năng xử lý đồng thời rút ngắn thời gian xử lý tính toán của người dùng.
Việc tính toán song song có thể:
- Tận dụng các nguồn tài nguyên như khai thác tài nguyên tính toán có sẵn trên mạng diện rộng, hoặc thậm chí sử dụng internet khi các tài nguyên cục bộ hạn chế.
- Tiết kiệm chi phí – sử dụng nhiều tài nguyên máy tính “rẻ” thay vì đầu tư một hệ thống siêu máy tính đắt đỏ.
- Khác phục những hạn chế về bộ nhớ - các máy tính đơn có tài nguyên bộ nhỡ rất hữu hạn Đối với những bài toán lớn, sử dụng bộ nhớ của nhiều máy tính có thể vượt qua trở ngại này.
1.1.3 Tính toán song song để làm gì?
Phát huy công năng, hiệu năng của bộ xử lý đa nhân, đa lõi.
Giải quyết một số bài toán lớn mà bộ xử lý đơn lõi (single processor) không thực hiện được Tăng hiệu quả tính toán đồng thời giảm thời gian tính toán.
Tính toán song song là sự tiến hóa của tính toán tuần tự nhằm cố gắng mô phỏng các trạng thái diễn ra trong thế giới tự nhiên mà nó rất phức tạp, các sự kiện liên quan xảy ra cùng một thời điểm, nhưng trong cùng một chuỗi sự kiện như:
- Quỹ đạo hành tính và thiên hà
- Các mô hình thời tiết cà đại dương.
- Dây chuyền lắp ráp ô tô.
Tính toán song song có thể được coi là “tính toán hiệu năng cao” và là động lực để mô phỏng các hệ thống phức tạp để giải quyết các bài toán lớn như:
- Dự báo thời tiết và khí hậu.
- Các phản ứng hóa học và hạt nhân.
- Các bài toán sinh học và gen người.
- Các hoạt động địa chất.
- Các thiết bị cơ khí phức tạp.
1.1.4 So sánh tính toán tuần tự và lập trình tính toán song song.
Lập trình tính toán tuần tự Lập trình tính toán song song
- Chương trình ứng dụng chạy trên bộ xử lý đơn (single processor).
- Các chỉ thị lệnh được bộ xử lý (CPU) thực hiện một cách lần lượt, tuần tự.
- Mỗi chỉ thị lệnh chỉ thực thiện trên duy nhất một thành phần dữ liệu.
- Lập trình viên chỉ cần đảm bảo viết đúng mã lệnh theo giải thuật chương trình là chương trình có thể dịch, chạy và cho ra kết quả.
- Thường được áp dụng đối với các bài toán có dữ liệu nhỏ, độ
- Chương trình ứng dụng chạy trên hai hoặc nhiều bộ xử lý.
- Các chỉ thị lệnh được các bộ vi xử lý thực hiện một cách song song, đồng thời.
- Mỗi chỉ thị lệnh có thể thao tác trên hai hoặc nhiều thành phần dữ liệu khác nhau.
- Ngoài việc đảm bảo viết đúng mã lệnh theo giải thuật, lập trình viên còn phải chỉ ra trong chương trình đoạn mã nào được thực hiện song song, đồng thời
- Thường được áp dụng đối với các bài toán có dữ liệu lớn, phức tạp bình thường và thời gian cho phép. độ phức tạp cao và thời gian ngắn.
Một số vấn đề liên quan đến lập trình và tính toán song song
1.2.1 Định luật Amdal’s Định luật được Amdahl s phát biểu vào năm 1967 nhằm đánh giá hiệu‟ năng của việc tính toán song song Định luật được phát biểu như sau: Hiệu năng tính toán của chương trình được định nghĩa là phân số của đoạn mã mà được thực thi song song.
- Nếu không có đoạn mã được thực thi song song, P = 0 speedup = 1 (Không cải thiện được tốc độ).
- Nếu tất cả các đoạn mã được thực thi song song, P = 1 speedup tăng lên đến vô cùng.
- Nếu 50% đoạn mã được thực thi song song, speedup đạt giá trị max. Công thức nêu lên mối quan hệ giữa hiệu năng tính toán với bộ xử lý.
Thông thường trong quá trình thực hiện xử lý song song, dữ liệu được phân bố trên các bộ nhớ cục bộ của các bộ vi xử lý, khi đó khối lượng công việc cần phải phân phối hợp lý trong suốt quá trình tính toán Tuy nhiên trong thực tế không phải lúc nào điều này cũng được thực hiện, vì vậy sẽ xảy ra trường hợp một số bộ xử lý thực hiện quá tải trong khi đó một số bộ xử lý lại không thực hiện hết khả năng tính toán của mình Giải pháp được đặt ra là cân bằng tải động để phân phối công việc cho phù hợp với các bộ xử lý.
Thông thường khi phân phối xong công việc cho các bộ xử lý, quá trình cân bằng tải động sẽ thực hiện theo các bước sau đây:
- Giám sát hiệu năng của mỗi bộ xử lý.
- Trao đổi thông tin trạng thái giữa các bộ xử lý.
- Tính toán và ra quyết định phân phối lại công việc.
- Thực hiện chuyển đổi dữ liệu cho các bộ xử lý. Để thực hiện được điều này có rất nhiều thuật toán được đưa ra tuy nhiên chúng được phân lớp thành các lớp sau:
- Cân bằng tải tập trung: Nhằm đưa ra các quyết định có tính chất tổng thể trong việc thực hiện phân phối các công việc cho các bộ xử lý Các thuật toán trong lớp này sử dụng thông tin hệ thống có tính chất toàn cục để lưu lại trạng thái của các bộ xử lý Các thông tin này sẽ cho phép thuật toán phân phối lại công việc cho các bộ xử lý một cách dễ dàng Tuy nhiên khối lượng công việc tăng theo tỷ lệ thuận với số lượng các bộ xử lý do vậy cần phải có số lượng lớn bộ nhớ trên các bộ xử lý để lưu trữ thông tin Vì vậy các thuật toán thuộc lớp này ít được sử dụng.
- Cân bằng tải phân tán hoàn toàn: Trong chiến lược này mỗi bộ xử lý có một bản sao về thông tin trạng thái của hệ thống Các bộ xử lý trao đổi thông tin trạng thái với nhau và sử dụng các thông tin này để làm thay đổi một cách cục bộ việc phân chia công việc tuy nhiên các bộ xử lý chỉ có thông tin cục bộ nên việc cân bằng tải không tốt bằng các thuật toán cân bằng tải tập trung.
- Cân bằng tải phân tán một nửa: Các thuật toán này chia các bộ xử lý ra thành từng miền, mỗi miền sử dụng thuật toán cân bằng tải tập trung để phân chia khối lượng công việc cho các bộ xử lý.
Sự bế tắc xảy ra khi có hơn một hoặc nhiều bộ xử lý cùng sử dụng chung một tài nguyên hệ thống mà không có sự kiểm soát tốt Sự bế tắc xảy ra trong các hệ điều hành đa nhiệm, các hệ thống đa bộ xử lý và đa máy tính Đối với các hệ thống đa máy tính, sự bế tắc phổ biến là bế tắc vùng đệm Sự bế tắc vùng đệm xảy ra khi một tiến trình đợi một thông điệp mà thông điệp này có thể không bao giờ nhận được khi vùng đệm của hệ thống đã bị đầy
Các điều kiện gây lên sự bế tắc:
- Sự loại trừ lẫn nhau: Mỗi tiến trình có sự độc quyền khi sử dụng tài nguyên riêng của nó.
- Không có sự ưu tiên: Mỗi tiến trình không bao giờ giải phóng tài nguyên mà tiến trình đó đang chiếm giữ cho đến khi không còn sử dụng chúng nữa.
- Sự chờ đợi tài nguyên: Mỗi tiến trình đang chiếm giữ tài nguyên trong khi lại đợi tiến trình khác giải phóng tài nguyên cho chúng.
- Sự chờ đợi giữa các tiến trình: Tiến trình đợi tài nguyên mà tiến trình kế tiếp đang chiếm giữ mà tài nguyên đó không được giải phóng.
Một số cách khắc phục:
Cách thứ nhất ta sử dụng là dò tìm sự bế tắc khi chúng xảy ra và khôi phục lại Một cách khác là sử dụng các thông tin yêu cầu tài nguyên của các tiến trình để phân phối tài nguyên cho hợp lý tránh rơi vào tình trạng bế tắc.Cách thứ ba là ngăn cấm không để xảy ra đồng thời ba điều kiện cuối trong các điều kiện nảy sinh bế tắc.
Tổng quan về các mô hình tính toán song song
Có nhiều mô hình lập trình song song thường được sử dụng như:
- Mô hình chia sẻ bộ nhớ.
- Mô hình gửi thông điệp.
- Mô hình song song dữ liệu.
- Mô hình lai giữa các mô hình.
Các mô hình lập trình song song tồn tại như một sự trừu tượng hóa trên kiến trúc phần cứng và phần mềm Mặc dù không rõ ràng, các mô hình này không cụ thể cho một kiểu kiến trúc máy tính hay bộ nhớ nào đặc biệt Thực tế với bất ký mô hình nào về mặt lý thuyết đều có thể áp dụng cho bất kỳ kiến trúc phần cứng.
1.3.1 Mô hình chia sẻ bộ nhớ
Trong mô hình lập trình chia sẻ bộ nhớ, các tác vụ chia sẻ không gian địa chỉ trung mà chúng có thể đọc/ghi không đồng bộ Các kỹ thuật khác nhau như lock/semaphore có thể được sử dụng để điều khiển truy cập tới vùng nhớ chia sẻ.
Một thuận lợi của mô hình này từ khía cạnh của lập trình viên là không có khái niệm về quyền sở hữu dữ liệu nên không cần phải xác định một cách rõ ràng về giao tiếp dữ liệu giữa các tác vụ Vì vậy, phát triển chương trình có thể được đơn giản hóa.
Một nhược điểm quan trong về hiệu suất là nó trở nên khó khăn trong việc hiểu và quản lý dữ liệu cục bộ.
1.3.2 Mô hình gửi thông điệp
Hình 1 3 Mô hình gửi thông điệp
Mô hình truyền thông điệp được định nghĩa là:
- Đặt quá trình xử lý sử dụng một bộ nhớ cục bộ
- Các bộ xử lý trao đổi với nhau thông qua việc gửi và nhận các thông điệp
- Sự di chuyển dữ liệu yêu cầu sự kết hợp thao tác thực hiện của mỗi quá trình xử lý (truyền nhận thông điệp một cách nhịp nhàng)
Lập trình với mô hình truyền thông điệp sẽ liên kết tới các thư viện để quản lý dữ liệu trao đổi giữa các bộ xử lý Các thư viện này có sẵn trong một số ngôn ngữ lập trình.
Mô hình gửi thông điệp (Message Passing) có một số đặc điểm như sau:
- Một tập các tác vụ sử dụng bộ nhớ cục bộ riêng của chúng khi tính toán Nhiều tác vụ có thể cư trú trên cùng một máy tính hoặc qua nhiều máy tính.
- Các tác vụ trao đổi dữ liệu thông qua truyền thông gửi và nhận thông điệp.
- Truyền dữ liệu thường đòi hỏi các hoạt động phối hợp khi được thực thi bởi mỗi xử lý Ví dụ, thao tác gửi phải được so khớp với thao tác nhận.
Từ khía cạnh lập trình, thực thi mô hình gửi thông điệp thường bao gồm một thư viện các chương trình còn được nhúng vào trong mã nguồn Các lập trình viên có trách nhiệm xác định tất cả các xử lý song song.
Hiện nay MPI là một chuẩn công nghiệp, nằm trong chuẩn “de facto” cho kết nối giữa các nút chạy một chương trình song song trên bộ nhớ phân tán Với kiến trúc bộ nhớ chia sẻ, thực thi MPI thường không bao giờ sử dụng giao tiếp các tác vụ qua mạng mà thay vào đó chúng sử dụng bộ nhớ chia sẻ vì các lý do hiệu năng.
Tập MPI thực thi bao gồm thư viện các thủ tục sao cho có thể gọi được từ các chương trình Fortran, C, C++ hay Ada.
1.3.3 Mô hình song song dữ liệu
Mô hình song song dữ liệu (Data parallel) được định nghĩa là:
- Mỗi quá trình xử lý công việc được thực hiện trên một thành phần của cấu trúc dữ liệu
- Thường áp dụng với chương trình nhiều dữ liệu Single Program Multiple Data (SPMD)
- Dữ liệu của chương trình sẽ được chia cho các bộ xử lý
- Người lập trình không thấy được quá trình trao đổi dữ liệu
- Thường được xây dựng theo kiểu “on top of ” một kiểu của thư viện Message Passing
Khi lập trình với mô hình này, người lập trình phải viết chương trình với cấu trúc dữ liệu song song và dịch với chương trình dịch dữ liệu song song (Data parallel Compiler)
Chương trình dịch sẽ dịch chương trình thành mã chuẩn và gọi tới thư viện Message Passing để chia dữ liệu cho tất cả quá trình xử lý.
Hình 1 4 Mô hình song song dữ liệu
Mô hình song song dữ liệu thể hiện qua các đặc điểm sau:
- Hầu hết các công việc song song tập trung cà thực hiện các thao tác trên một bộ dữ liệu Bộ dữ liệu này thường được tổ chức thành một cấu trúc chung như mảng hay khối.
- Một tập các tác vụ làm việc trên cùng cấu trúc dữ liệu, tuy nhiên mỗi tác vụ làm việc trên các phần khác nhau của cùng cấu trúc dữ liệu.
2.2.2 Thiết kế thuật toán tuần tự Độ phức tạp của thuật toán: O(n 4 )
2.2.3 Thiết kế thuật toán song song
#pragma omp parallel for num_threads(8) schedule(static, n) reduction(+:dxi)
X[i] = dxi / A[i*n+i] sum += ((dx[i] >= 0.0) ? dx[i] : -dx[i]) if (sum