Tính toán song song Tính toán song song là quá trình tính toán gồm nhiều tiến trình được kích hoạt đồng thời và cùng tham gia tính toán giải quyết một vấn đề, và nói chung phải thực hiện
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
Thành phố Hồ Chí Minh - Tháng 07 Năm 2013
Trang 2NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
Trang 4
1 Tổng quan về tính toán song song
1.1 Tính toán tuần tự
- Một vấn đề được chia thành một dãy rời rạc các chỉ thị (Instruction – lệnh máytính) mà máy tính có thể hiểu để thực hiện
- Máy tính thực hiện các chỉ thị theo thứ tự mà chúng xuất hiện
- Chỉ có duy nhất một chỉ thị được thực hiện tại một thời điểm
- Các phần mềm ứng dụng đều được viết cho các máy tính tuần tự
Máy tính tuần tự là loại máy tính thực hiện các lệnh một cách tuần tự và tại mỗithời điểm chỉ một chỉ thị duy nhất được thực hiện Cách tính toán tuần tự trên máyđơn nguyên có thể minh họa bởi hình 1.1
Hình 1.1 Mô tính toán tuần tự
1.2 Tính toán song song
Tính toán song song là quá trình tính toán gồm nhiều tiến trình được kích hoạt đồng thời và cùng tham gia tính toán giải quyết một vấn đề, và nói chung phải thực hiện trên các hệ thống đa bộ xử lí.
- Một vấn đề cần tính toán được phân hoạch thành các phần tính toán rời rạc,các phần này lại có thể tính toán được đồng thời (song song)
- Từng phần của phân hoạch lại được chia nhỏ thành chuỗi các chỉ thị và đượcthực hiện tuần tự
- Các chỉ thi của từng phần thực hiện đồng thời trên các CPU khác nhau
Quan niệm đơn giản nhất, tính toán song song là việc sử dụng đồng thời nhiềumáy tính được kết nối thành mạng hoặc chỉ trên một máy tính nhưng có nhiều hơnhai bộ xử lý
Trang 5Hình 1.2 Mô tính toán song song
Trong tính toán song song hiện nay, có hai công nghệ chính:
Thứ nhất là sử dụng các siêu máy tính với rất nhiều bộ xử lý được tích hợp bên trong được thiết kế đồng bộ cảvềphần cứng và phần mềm Các công nghệ được áp dụng trong các siêu máy tính thường là các công nghệ tiên tiến làm cho giá thành của hệ thống siêu tính tăng rất cao.Vì thế các siêu máy tính thường được sử dụng trong các lĩnh vực mà vấn đềtính toán phức tạp, nhạy cảm và yêu cầu thời gian thực như mô phỏng thực hiện của các động cơ máy bay, quốc phòng, vũ trụ
Cách thứ hai là kết nối các máy tính lại với nhau và cùng thực hiện bài toán Hệ thống các máy tính kết nối này chính là hệ thống tính toán song song phân cụm Hệ thống này có ưu điểm là giá thành rẻ hơn rất nhiều so với siêu máy tính có cùng sức mạnh (do sử dụng các thiết bị thông thường) và tính linh hoạt của hệthống (sốnút, số
bộ xử lý, bộ nhớ, thiết bịmạng đều mang tính tuỳ biến cao) Sự phát triển mạnh mẽ của mạng máy tính, các công nghệ mạng hiện nay đã lấp đi hạn chế về truyền thông trong hệ thống máy tính song song phân cụm làm cho nó được phát triển rộng rãi Cáclĩnh vực sử dụng hệ thống tính toán song song phân cụm thường yêu cầu tính toán cáckiến trúc song song
1.3 Tại sao sử dụng tính toán song song?
• Tiết kiệm thời gian và / hoặc tài chính
Trang 6• Giải quyết được các vấn đề lớn hơn, phức tạp hơn
Nhiều vấn đề quá lớn và/hoặc quá phức tạp đến nỗi nó không thực tế hoặc không
có khả năng giải quyết chúng trên máy tính đơn, đặc biệt là bộ nhớ máy tính lại bị hạnchế Chẳng hạn các vấn đề:
- Dự báo thời tiết, bão, động đất, sóng thần, mô hình sinh thái, …
- Máy dò tìm web/CSDL để xử lý hàng triệu triệu giao dịch trên một giây(công cụ tìm kiếm web/CSDL xử lý hàng triệu giao dịch/giây)
- …
• Cung cấp tính đồng thời
• Sử dụng tài nguyên phi cục bộ
Sử dụng tài nguyên tính toán trên một mạng diện rộng, hoặc thậm chí Internetkhi tài nguyên tại nơi tính toán tài nguyên đang khan hiếm, không đủ Ví dụ:
• Những hạn chế khi tính toán tuần tự
o Tốc độ truyền - tốc độ của một máy tính tuần tự phụ thuộc trực tiếp vào tốc độchuyển dữ liệu qua phần cứng Giới hạn tốc độ tuyệt đối là tốc độ của ánh sáng(30 cm/nanosecond) và hạn chế sự lan truyền (băng thông) của dây đồng (9cm/nanosecond) Để tăng tốc độ cần phải tăng số lượng các phần tử xử lý,
o Các giới hạn về công nghệ tiểu họa vi xử lý (miniaturization – processortechnology) là cho phép tăng số lượng bóng bán dẫn được đặt trên một chip.Tuy nhiên, ngay cả với các thành phần cấp độ phân tử hoặc nguyên tử thì mộtgiới hạn cũng sẽ được đạt đến dù các thành phần nhỏ đến thế nào đi nữa
o Các hạn chế về kinh tế - làm một bộ xử lý đơn càng nhanh thì càng đắt tiền
o Các kiến trúc máy tính hiện tại đang ngày càng dựa vào khả năng song songhóa phần cứng để cải thiện hiệu suất như:
Có nhiều đơn vị thực hiện
Dùng các chỉ lệnh đường ống (Pipelined instructions)
Đa nhân (Multi-core)
Trang 7Một vấn đề được thực hiện song song sẽ có các ưu/nhược điểm cơ bản sau:
Ưu điểm:
- Có thể kết thúc công việc sớm hơn,
- Chi phí có thể ít hơn nhiều,
-
Nhược điểm:
- Tăng tính phức tạp cho hệ thống
- Tăng chi phí cho nhân lực vì phải tăng nhân lực
- Tăng chi phí mua các thiết bị
- Tăng chi phí lắp đặt hệ thống
Trong 20 năm qua, sự phát triển mạnh của các mạng (network), hệ thống phân tán
và kiến trúc đa xử lý (thậm chí là máy tính để bàn) đã cho thấy rõ song song là xu hướng của tính toán Trong thời gian đó, các siêu máy tính đã tăng hơn 1000 lần về hiệu xuất, và sẽ tiếp tục trong tương lai
Trang 8Tính toán song song hiện đang được sử dụng rộng rãi trên thế giới trong nhiều ứng dụng lớn
Nguồn: Top500.org
Trang 9Nhà cung cấp:
Trang 10Phần lớn các siêu máy tính trên thế giới là các cụm phần cứng được sản xuất bởi một
số ít các nhà cung cấp nổi tiếng
Nguồn: Top500.org
2 Các mô hình máy tính song song
Micheal Flynn chia kiến trúc máy tính song song như hình sau:
2.1 Đơn chỉ thị đơn dữ liệu (SISD - Single Instruction Single Data)
− Dùng cho máy tính đơn nguyên tuần tự - không song song
− Đơn chỉ thị: mỗi thời điểm chỉ dùng một chỉ có một chỉ thị đang được xử lý bởiCPU trong một chu kỳ đồng hồ nào đó Chẳng hạn, hình 2.1, chu kỳ đồng hồ
thứ nhất load, chu kỳ đồng hồ thứ hai load, … , chu kỳ đồng hồ cuối cùng
Store
Trang 11Hình 2.1 Ví dụ về đơn chỉ thị, đơn luồng dữ liệu
− Đơn luồng dữ liệu: chỉ có một dữ liệu đang được sử dụng như đầu vào trong
một chu kỳ đồng hồ nào đó Chẳng hạn , hình 1.8, chu kỳ đồng hồ thứ nhất A,
chu kỳ đồng hồ thứ hai B, … , chu kỳ đồng hồ cuối A
− Thực hiện theo tiền định, nghĩa là công việc được hoạch định rõ ràng khi lậptrình (tĩnh), trong qúa trình thực thi các câu lệnh và dữ liệu không bị thay đổi
− Đây là loại máy tính lâu đời nhất và thậm chí cho đến ngày nay vẫn là loại máytính phổ biến nhất
2.2 Đơn chỉ thị đa dữ liệu (SIMD - Single Instruction Multiple Data)
− Đơn chỉ thị: Tất cả các bộ vị xử lý p1, p2, …, pn cùng thực thi cùng một chỉ thị tại cùng một chu kỳ đồng hồ đã cho Chẳng hạn, hình 2.1, chu kỳ đồng hồ thứ nhất, n bộ xử lý này cùng có một chỉ thị là load, chu kỳ đồng hồ thứ hai, n
bộ xử lý cùng có một chỉ thị là load, … , chu kỳ đồng hồ thứ 4, n bộ xử lý cùng
có một chỉ thị là Store,…
− Đa luồng dữ liệu: Mỗi bộ xử lý có thể hoạt động trên một phần tử dữ liệu khác với dữ liệu của bộ xử lý khác - có nhiều dữ liệu đang được sử dụng như đầu vào trong một chu kỳ đồng hồ nào đó Chẳng hạn, hình 2.1, chu kỳ đồng hồ thứnhất A(1), A(2), …, A(n); chu kỳ đồng hồ thứ hai B(1), B(2), …, B(n) ; … , chu kỳ đồng hồ thứ 4 là C(1), C(2), …, C(n); …
− Loại máy tính này rất phù hợp cho các vấn đề chuyên ngành được đặc trưng bởi mức đồng bộ cao, chẳng hạn như xử lý đồ họa hoặc hình ảnh,…
− Đồng bộ và thực hiện tiền định
− Hai kiến trúc bộ xử lý hay được sử dụng nhất trong trường hợp này là: Bộ xử
lý mảng và xử lý kiểu đường ống vectơ
Máy tính kiến trúc SIMD chỉ có một CU để điều khiển nhiều PE thực hiện theomột luồng lệnh CU phát lệnh điều khiển tới tất cả các PE, các PE này cùng thực hiện
Trang 12một phép toán trên các mục dữ liệu khác nhau, nghĩa là mỗi PE có một luồng dữ liệu riêng Như vậy SIMD cho phép các Pi khác nhau (hoặc ALU khác nhau) làm cùng một phép tính trên các toán hạng khác nhau Máy tính SIMD có hỗ trợ cách xử lý vector, nghĩa là gán mỗi thành phần của một vector cho các Pi để thực hiện tính toán đồng thời Cấu trúcbản của SIMD như hình 2.2
Hình 2.2.a Kiến trúc kiến trúc SIMD
Hình 2.2.b Đơn chỉ thị, đa luồng dữ liệu
2.3 Da dữ liệu đơn dòng lệnh (MISD - Multiple Instruction Single Data)
− Một dòng dữ liệu duy nhất được đưa vào các đơn vị đa xử lý
− Mỗi đơn vị xử lý hoạt động trên các dữ liệu một cách độc lập thông qua cácluồng chỉ thị độc lập khác nhau
− Rất ít ví dụ thực tế của lớp các máy tính song song kiểu này
Kiến trúc MISD được chia làm hai nhóm cơ bản:
− Thứ nhất, nhóm máy tính yêu cầu có các công việc khác nhau, các phần tử xử
lý khác nhau có thể nhận những chỉ lệnh khác nhau để thực hiện trên một mục
dữ liệu
Trang 13− Thứ hai, nhóm máy tính có các luồng dữ liệu được chuyển tuần tự theo dãy các
PE liên tiếp Hoạt động của máy tính theo kiến trúc này giống như hệ tuầnhoàn nên còn được gọi là hệ tâm thu, hình 2.3
Hình 2.3 Kiến trúc kiến trúc MISD
2.4 Đa dữ liệu đa dòng lệnh (MIMD – Multiple Instruction Multiple Data)
Hiện nay, các loại phổ biến nhất của máy tính song song Hầu hết máy tính hiệnđại đều thuộc vào loại này
dòng chỉ thị khác với các dòng chỉ thị của các bộ xử lý khác
dòng dữ liệu khác với các dòng dữ liệu của các bộ xử lý khác
Việc thực hiện các chỉ thị có thể được đồng bộ hoặc không đồng bộ, tiền định hoặckhông tiền định
Hình 2.4.a Các kiến trúc máy tính xử lý song
Kiến trúc MIMD còn được gọi là máy đa bộ xử lý, mỗi bộ xử lý có thể thực hiện bởi luồng lệnh và luồng dữ liệu riêng
Trang 14Hình 2.4.b Kiến trúc kiến trúc MIMD
MIMD có bộ nhớ chung, các bộ xử lý của MIMD đều có bộ nhớ riêng, nhưng được phép truy cập vào bộ nhớ chung khi cần, do vậy giảm được các thao tác trao đổi giữa các bộ xử lý trong hệ thống, xem hình 2.4.b
Trang 153 Các mô hình lập trình song song
Một số mô hình lập trình song song phổ biến được liệt kê dưới đây:
- Chia sẻ bộ nhớ (Shared Memory)
- Luồng, tiến trình (Thread)
- Truyền thông báo (Massage Passing)
- Dữ liệu song song (Data Parallel)
lý thuyết) được thi hành trên bất kỳ phần cứng cơ bản nào
Vấn đề quan trọng trong lập trình song song là phải tận dụng được khả năng tính toán của các bộ xử lý Có hai cách tiếp cận để tận dụng các bộ xử lý:
1. Phát triển những ngôn ngữ lập trình cho phép thể hiện được việc thực hiện song song ở mức thuật toán, ví dụ như Fortran, C,
2. Xây dựng những chương trình dịch đủ mạnh để nhận dạng được các phân chia chương trình thành các đoạn có thể thực hiện song song hay tuần tự -với loại chương trình dịch này có thể dùng cho tự động song song
Hai cách tiếp cận trên bổ sung cho nhau cho phép chúng ta sử dụng tốt nhất các bộ
xử lý, nếu áp dụng một cách thì dĩ nhiên là sẽ không hiệu quả bằng
Ngoài tiết cận để tận dụng các bộ xử lý, thì các cách tiếp cận trong lập trình song song như sau đây cũng đóng vai trò rất quan trọng:
1. Lập trình song song kiểu SIMD với bộ nhớ chia sẻ, trong đó truy cập bộ nhớ là
Trang 164. Lập trình song song kiểu SPMD với bộ nhớ chia sẻ, trong đó truy cập bộ nhớ là
3.1 Mô hình chia sẻ bộ nhớ (Shared Memory Model)
Trong mô hình lập trình chia sẻ bộ nhớ, các tác vụ chia sẻ với nhau một không gian địa chỉ chung, ở đó các tác vụ đọc và ghi không đồng bộ
Các cơ chế khác nhau như khóa / semaphores (cờ hiệu) có thể được sử dụng đểkiểm soát (hoặc điều khiển) truy cập vào bộ nhớ chia sẻ
Một lợi thế của mô hình này theo quan điểm của lập trình viên thì khái niệm
"sở hữu" dữ liệu là đang thiếu, do đó, không cần thiết phải định rõ việc truyền dữ liệu giữa các tác vụ Do vậy việc lập trình thường đơn giản hơn
Một số bất lợi quan trọng về hiệu năng, đó là nó khó hiểu hơn và khó quản lý
dữ liệu cục bộ hơn, vì:
- Việc lưu giữ dữ liệu cục bộ cho bộ xử lý làm việc trên đó, bộ xử lý này sẽ chiếm giữ bộ nhớ truy cập, nên cần phải làm tươi (mới) lại bộ nhớ cache và đường truyền bus khi có nhiều bộ xử lý sử dụng chung dữ liệu
- Việc kiểm soát dữ liệu cục bộ sẽ rất khó và ngoài tầm kiểm soát của người lập trình chưa có trình độ cao cần thiết
- Trên nền tảng bộ nhớ chia sẻ, trình biên dịch chương trình chuyển các biến của người lập trình vào các địa chỉ bộ nhớ thực, đó là địa chỉ vật lý toàn cục
- Không có những bổ sung cơ bản nào cho bộ nhớ phân tán đang tồn tại Tuy nhiên, như đã đề cập trước đó, các cách tiếp cận KSR ALLCACHE cung cấp cách thức dữ liệu của bộ nhớ chia sẻ ngay cả khi bộ nhớ vật lý của máy tính này được phân tán
3.2 Lập trình chia sẻ bộ nhớ dựa vào tiến trình
Trang 17Tạo lập và huỷ bỏ tiến trình
Yêu cầu đầu tiên của xử lý song song là khả năng tạo ra một số tiến trình cần thiếtcho bài toán và khả năng huỷ bỏ tiến trình khi phần việc xử lý song song kết thúc đểgiải phóng các tài nguyên mà các tiến trình đã chiếm giữ và không cản trở hoạt độngcủa những tiến trình khác
Để thêm N tiến trình, chúng ta dùng lệnh:
id = create_process (N);
Lệnh này tạo thêm N tiến trình và cả một tiến trình cha (chủ) nữa để thực hiện câu lệnh đó, kết quả là có N+1 tiến trình như nhau được tạo ra và mỗi giá trị của id được
gán tương ứng cho một tiến trình
Để sử dụng các tiến trình đã được tạo ra, chúng ta có thể viết ra các chương trìnhsong song có dạng:
id = create_process(N);
Switch (id) {
Case 0 : … do NhiemVu 0 …; Break;
Case 1 : … do NhiemVu 1 …; Break;
Case 2 : … do NhiemVu 2 …; Break;
join_process (N, id)
Chỉ tiến trình tương ứng với giá trị id còn tiếp tục hoạt động, những tiến trình còn
lại kết thúc sau lời gọi hàm trên Tuy nhiên, nếu ta đặt sau nó một câu lệnh nào đó thìlệnh này sẽ không được thực hiện cho đến khi tất cả các tiến trình đều thực hiện câu
lệnh join_process() Sau đó chỉ còn lại một tiến trình hoạt động, do vậy vấn đề xử lý
song song không xuất hiện mà xử lý tuần tự
Vấn đề là khả năng các tiến trình được tạo lập có thể nhìn thấy dữ liệu của nhaunhư thế nào? Một mặt một tiến trình có thể muốn giữ một phần dữ liệu cục bộ choriêng mình, không cho những tiến trình khác nhìn thấy/truy cập tới những dữ liệu đó
Trang 18Mặt khác, nó cũng muốn trao đổi thông tin với các tiến trình khác Do đó, xử lý vấn
đề che giấu hay chia sẻ thông tin như thế nào còn tuỳ thuộc vào mô hình mà chúng ta
áp dụng: dựa vào tiến trình hay luồng.
- Các tiến trình trong UNIX được sử dụng như các đơn vị tính toán độc lập, theo
mặc định, việc tính toán và cập nhật bộ nhớ của một tiến trình “không” sẽ không chocác tiến trình khác nhìn thấy
- Đối với các luồng, tất cả các thông tin, theo mặc định, là nhìn thấy được Do vậy,
trong mô hình này cần phải cố gắng rất nhiều mới che giấu được thông tin khi cầnthiết
Một số hàm điều phối vấn đề chia xẻ bộ nhớ
Khi muốn sử dụng bộ nhớ chung, ta cần phải xin cấp phát bộ nhớ và sau khi sử
dụng xong phải giải phóng chúng Người lập trình phải có nhiệm vụ giải phóng phần
bộ nhớ chia sẻ một khi chúng không còn sử dụng Có hai hàm cơ bản được sử dụng ở
đây là:
- Hàm cấp phát bộ nhớ shared(m , &id): hàm này giống như malloc(), nhưng cấp phát m byte bộ nhớ chia sẻ cho tiến trình id.
- Hàm giải phóng bộ nhớ free_shm(): giải phóng phần bộ nhớ đã được cấp phát.
3.3 Lập trình chia sẻ bộ nhớ dựa vào luồng
1. Trong mô hình lập trình song song dựa vào luồng, một tiến trình trình đơn
có thể có nhiều cách thực hiện đồng thời
Trang 192. Perhaps the most simple analogy that can be used to describe threads is theconcept of a single program that includes a number of subroutines: Lý luận đơn
giản nhất được dùng để mô tả các luồng là xét một chương trình chính a.out
bao gồm một số chương trình con, hình 4.1.2-1
The main program a.out is scheduled to run by the native operating system a.out
loads and acquires all of the necessary system and user resources to run.Hình 3.3
Chương trình chính a.out bao gồm một số chương trình con
- Chương trình chính a.out được lập lịch để chạy bằng hệ điều hành
- Each thread has local data, but also, shares the entire resources of a.out Mỗi thread có dữ liệu địa phương riêng của nó, nhưng cũng có, dùng chung tàinguyên của a.out This saves the overhead associated with replicating aprogram's resources for each thread Điều này giúp tiết kiệm chi phí “vô ích”liên quan với việc nhân bản các tài nguyên của chương trình để cung cấp chocác thread Each thread also benefits from a global memory view because itshares the memory space of a.out Mỗi thread cũng có lợi vì nó chia sẻ khônggian bộ nhớ của a.out