2.4 Tính toán song song
2.4.2 Mơ hình lập trình song song
Mơ hình lập trình song song (parallel programming models) là mơ hình để xây dựng các hệ thống tính tốn với các kiến trúc đã trình bày ở mục trên. Hiện nay, các giải pháp tính tốn song song thường được xây dựng dựa vào một số mơ hình lập trình song song sau [5]:
• Bộ nhớ chia sẻ (khơng sử dụng luồng): trong mơ hình lập trình đơn giản này, q trình tính tốn song song được thi hành thơng qua các tiến trình (với tài ngun bộ nhớ, CPU riêng) nhưng có vùng nhớ chia sẻ chung để đọc/ghi theo cơ chế khơng đồng bộ. Do đó, các cơ chế như sử dụng khoá, semaphores... cần phải được sử dụng để kiểm soát tương tranh, tránh khoá chết... trong việc truy xuất đến dữ liệu chung giữa các tiến trình.
• Sử dụng luồng (threads): đây là mơ hình lập trình sử dụng bộ nhớ chia sẻ, tuy nhiên việc tính tốn song song được triển khai trong một tiến trình bao hàm nhiều luồng (threads) thi hành tương tranh. Mỗi luồng sẽ có dữ liệu cục bộ nhưng đều chia sẻ tồn bộ tài ngun của tiến trình cha. Thơng thường, mỗi luồng sẽ được giao phó để thi hành một hàm và việc tương tác giữa các luồng thơng qua khơng gian bộ nhớ tồn
cục. Điều này cũng dẫn đến phải có cơ chế đồng bộ để đảm bảo việc cập nhật dữ liệu chung giữa các luồng.
Về mặt lập trình, mơ hình sử dụng luồng này có thể được thực hiện hoặc (i) sử dụng những thư viện cung cấp các hàm để cài đặt chương trình song song (điển hình là POSIX Threads [10], Microsoft Threads [73], Java/Python threads1, CUDA threads2), hoặc (ii) sử dụng các chỉ thị đã được nhúng trong các ngơn ngữ lập trình để xác lập đoạn mã khi nào song song, khi nào tuần tự (điển hình là OpenMP[9], CilkPlus [49]).
• Bộ nhớ phân tán với phương pháp truyền thơng điệp (message passing): Trong mơ hình lập trình này, các tác vụ sẽ có khơng gian bộ nhớ riêng và có thể được thi hành trên một máy tính hoặc trên nhiều máy khác nhau. Q trình trao đổi dữ liệu giữa chúng sẽ được tiến hành dựa trên gửi và nhận thơng điệp. Về mặt lập trình, cài đặt cơ chế truyền thơng điệp thường được đóng gói trong một thư viện lập trình. Lập trình viên phải sử dụng các hàm trong thư viện đó để đảm nhiệm cài đặt cơ chế song song cho bài toán cần giải quyết. Thư viện MPI (Message Passing Interface) hiện là thư viện được sử dụng rộng rãi nhất hiện nay trong mơ hình lập trình này với ba chuẩn là MPI-1, MPI-2 và MPI-3 [8].
• Song song dữ liệu: là mơ hình lập trình song song sử dụng khơng gian bộ nhớ tồn cục nhưng các công việc song song tập trung thao tác với các tập dữ liệu có cấu trúc chung, chẳng hạn như mảng hay khối dữ liệu. Mỗi công việc tiến hành trên một vùng khác nhau của dữ liệu tồn cục đó. Mơ hình này cịn có tên gọi là mơ hình phân mảnh địa chỉ tồn cục (Partitioned Global Address Space - PGAS). Với kiến trúc bộ nhớ chia sẻ, tất cả cơng việc có thể truy cập cấu trúc dữ liệu qua bộ nhớ toàn cục. Với kiến trúc bộ nhớ phân tán, cấu trúc dữ liệu này có thể được phân chia một cách logic hoặc/và vật lý giữa các công việc.
Hiện nay, mơ hình này cũng có nhiều cài đặt khác nhau được sử dụng trong các ngơn ngữ lập trình khác nhau. Chẳng hạn như thư viện CoArray của Fortran3; Unified Parallel C (UPC) nhúng trong ngơn ngữ C để lập trình kiểu SPMD (Single Program Multiple Data: đơn chương trình, đa dữ liệu)4; Mảng tồn cục; X10, Chapel... [5].
• Mơ hình lai: là mơ hình lập trình sử dụng nhiều kiểu mơ hình trên kết hợp cùng với nhau. Hiện nay, một số kiểu lai hay được sử dụng có thể kể đến như kết hợp MPI với mơ hình luồng OpenMP; MPI với mơ hình luồng sử dụng các bộ xử lý đồ hoạ GPU (CUDA chẳng hạn); MPI với Pthreads; ...
1Tham khảo tạihttps://docs.oracle.com/javase/tutorial/essential/concurrency/procthread. html vàhttps://en.wikibooks.org/wiki/Python_Programming/Threading
2Lập trình luồng với Cudahttp://cuda.ce.rit.edu/cuda_overview/cuda_overview.htm
3Tham khảo thêm tạihttps://en.wikipedia.org/wiki/Coarray_Fortran
Nhìn chung, các mơ hình lập trình độc lập so với kiến trúc bộ nhớ, chẳng hạn như mơ hình lập trình bộ nhớ chia sẻ có thể triển khai trên các máy tính có kiến trúc bộ nhớ phân tán và ngược lại. Trong số các mơ hình trên, khơng có mơ hình nào là "tốt" cho tất cả các trường hợp mà mỗi mơ hình hiệu quả với từng bài tốn cụ thể [102].
Trong các giải pháp song song hố được chúng tơi tiến hành thực hiện trong luận án này, mơ hình lập trình song song sử dụng đa luồng trên kiến trúc đa CPU, đa lõi được chú trọng thực hiện. Các giải pháp song song sẽ được cài đặt dựa trên bộ thư viện CilkPlus do Intel xây dựng [49].
Hình 2.15: Mơ hình xử lý song song trong CilkPlus
Việc lựa chọn CilkPlus cũng đã được chúng tơi phân tích bằng cả thực nghiệm lẫn tham khảo các cơng trình liên quan. Trong số các giải pháp song song hoá hay được sử dụng hiện nay như CilkPlus, OpenMP5, và Pthread6, cơng trình của Leist và Gilman [59] thông qua những thực nghiệm đã minh chứng bộ thư viện CilkPlus cho hệ số tăng tốc (speedup) tốt hơn so với OpenMP và Pthread.