Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

CSE703032

Lập trình song song

Bài giảng 5
LẬP TRÌNH SONG SONG
VỚI BỘ NHỚ CHIA SẺ
Khoa Công nghệ thông tin
Đại học Phenikaa
Lập lịch vòng lặp (loop schedules):
o Thông thường, số lần lặp trong một vòng lặp sẽ nhiều hơn số lượng luồng. Do đó, chúng ta
có thể gán một số vòng lặp cho các luồng. OpenMP cho phép chúng ta thực hiện điều này
bằng mệnh đề lập lịch (schedule clause).
o Cú pháp: #pragma omp for schedule(....)
o Trước hết chúng ta phân biệt 2 phương thức lập lịch là: Tĩnh (static) và Động (dynamic).
o Với lập lịch Tĩnh: chia cố định các đoạn lặp cho các luồng.
o Lập lịch Động: có hang đợi chung chứa các đoạn lặp, khi luồng kết thúc một đoạn lặp nó lấy
đoạn lặp tiếp theo từ hàng đợi.

2
Lập lịch vòng lặp (loop schedules):
o Lập lịch Tĩnh mặc định là gán một khối lặp liên tiếp cho mỗi luồng. Nếu chúng ta muốn các
khối có kích thước khác nhau thì phải xác định kích thước các khối đó.
 Cú pháp: #pragma omp for schedule(static[,chunk])
o Với lập lịch Tĩnh, trình biên dịch sẽ xác định việc gán số lần vòng lặp cho các luồng tại thời
điểm biên dịch, do đó, miễn là các lần lặp mất khoảng thời gian gần như nhau thì đây là
cách hiệu quả nhất trong thời gian chạy.
o Trong lập lịch động, OpenMP sẽ đặt các khối lặp lại (kích thước khối mặc định là 1) vào
hàng đợi tác vụ và các luồng sẽ thực hiện một trong các tác vụ này bất cứ khi nào chúng
hoàn thành với tác vụ trước đó.
 Cú pháp: #pragma omp for schedule(dynamic[,chunk])
o Ngoài ra, còn có lập lịch có hướng dẫn (guided schedule), giúp giảm dần kích thước khối. Tư
duy ở đây là các khối lớn mang lại ít chi phí nhất, nhưng các khối nhỏ hơn sẽ tốt hơn cho
việc cân bằng tải.
 Cú pháp: #pragma omp for schedule(guided[,chunk])
3
Lập lịch vòng lặp (loop schedules):
o Nếu không muốn quyết định lịch trình trong code của mình, chúng ta có thể chỉ định lập
thời gian chạy (the runtime schedule).
o Sau đó, lập lịch thực tế sẽ được đọc từ biến môi trường OMP_SCHEDULE trong thời gian
chạy. Chúng ta có thể để nó trong the runtime library bằng cách tự động.
o Đặc biệt ở hai trường hợp cuối, chúng ta có thể biết lập lịch nào hiện đang được sử dụng
với cú pháp: int omp_get_schedule(omp_sched_t * kind, int * modifier );

4
Lập lịch vòng lặp (loop schedules):
o Dưới đây là các lập lịch khác nhau mà chúng ta có thể đặt bằng mệnh đề lập lịch:
 affinity : Đặt bằng cách sử dụng giá trị omp_sched_affinity
 auto: Đặt bằng cách sử dụng giá trị omp_sched_auto
 static (value: 1): Tham số sửa đổi là kích thước chunk. Cũng có thể được đặt
bằng cách sử dụng giá trị omp_sched_static
 dynamic (value: 2): Tham số sửa đổi là kích thước khối; mặc định 1. Cũng có thể
được đặt bằng cách sử dụng giá trị omp_sched_dynamic
 guided (value: 3): Tham số sửa đổi là kích thước khối. Đặt bằng cách sử dụng giá
trị omp_sched_guided
 runtime: Sử dụng giá trị của biến môi trường OMP_SCHEDULE. Đặt bằng cách
sử dụng giá trị omp_sched_runtime
5
Lập lịch vòng lặp (loop schedules):
o Ví dụ 5.1:

6
Lập lịch vòng lặp (loop schedules):
o Ví dụ 5.2:

7
Lập lịch vòng lặp (loop schedules):
o Ví dụ 5.3:

8
Thu gọn các vòng lặp lồng nhau (Collapsing nested loops):
o Về cơ bản, càng nhiều công việc để phân chia trên một số luồng thì việc song song
hóa sẽ càng hiệu quả hơn.
o Với các vòng lặp song song, có thể tăng khối lượng công việc bằng cách song song
hóa tất cả các cấp độ vòng lặp thay vì chỉ một được thực hiện.
o Ví dụ:
for ( int i=0; i<N; i++ )
for ( int j=0; j<N; j++ )
A[i][j] = B[i][j] + C[i][j]
o Sử dụng collapse clause:
#pragma omp for collapse(2)
for ( int i=0; i<N; i++ )
for ( int j=0; j<N; j++ )
A[i][j] = B[i][j] + C[i][j]
9
Thu gọn các vòng lặp lồng nhau (Collapsing nested loops):
o Ví dụ 5.4:

10
Lặp lại theo thứ tự (Ordered iterations):
o Sử dụng lặp lại theo thứ tự để đảm bảo code chạy theo thứ tự lặp của vòng lặp.
o Ví dụ 5.5:

11
References
1. Đỗ Thanh Nghị, Nguyễn Văn Hòa, Đỗ Hiệp Thuận (2014), Giáo trình lập trình
song song. NXB Trường ĐHCT. ISBN: 978-604-919-065-0
2. A. Grama, G. Karypis, V. Kumar and A. Gupta (2003), Introduction to Parallel
Computing. Addison Wesley. ISBN: 978-0201648652

You might also like