Site icon Nhạc lý căn bản – nhacly.com

Lập trình song song với OpenMP – Tài liệu text

Lập trình song song với OpenMP

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.19 MB, 102 trang )

1
Lập trình song song
với OpenMP
2
Nội dung
• Lập trình đa luồng
• OpenMP là gì?
• Chương trình OpenMP đầu tiên
• Các thành phần của OpenMP
• OpenMP được dịch như thế nào?
3
Lập trình đa luồng
(MultiThreaded Programming)
4
Tiến trình (Process)
• Tiến trình: một thực thể thực thi của chương
trình đã bắt đầu nhưng chưa kết thúc
• Tiến trình là đơn vị nhỏ nhất cho cấp phát tài
nguyên
• Tiến trình được tạo qua lời gọi hệ thống, vd.
fork( ) trong UNIX
• Hệ thống quản lý tiến trình qua khối điều khiển
tiến trình (PCB)
• Liên lạc giữa các tiến trình thông qua các giao
thức IPC
5
Tiến trình
• Theo quan điểm hệ thống
– Tiến trình là đơn vị chiếm dụng tài nguyên: CPU, bộ
nhớ, thanh ghi, thẻ tệp…
– Các tiến trình là riêng biệt: tiến trình không thể truy

cập trực tiếp đến tài nguyên của tiến trình khác
– Liên lạc giữa các tiến trình rất tốn chi phí
• Tiến trình có thể được nhìn theo 2 góc độ:
chiếm dụng tài nguyên và thực thi lệnh → theo
góc độ 2 thi tiến trình là tập hợp các luồng
6
Luồng (Thread)
• Luồng là đơn vị thực thi của tiến trình
• Một tiến trình bao gồm một hoặc nhiều luồng,
mỗi luồng thì thuộc về một tiến trình
• Luồng có vùng nhớ ngăn xếp riêng, con trỏ lệnh
riêng, các thanh ghi riêng
• Các luồng trong tiến trình chia sẻ các tài nguyên
khác của tiến trình, vd. bộ nhớ
• Liên lạc giữa các luồng thông qua vùng nhớ của
tiến trình
7
Tiến trình và luồng
8
Kiến trúc đa luồng
9
Lập trình đa luồng
• Theo quan điểm lập trình
– Luồng là dòng điều khiển độc lập, tức là hàm
– Tham số của hàm là dữ liệu của luồng
– Mỗi hàm thực hiện một công việc cụ thể → một tiến
trình có thể thực hiện nhiều công việc một lúc bằng
cách chia nó thành các luồng → lập trình đa luồng
• Phân biệt với lập trình đa tiến trình
– Chi phí khởi tạo, quản lý, kết thúc công việc

– Chi phí trao đổi dữ liệu giữa các công việc
– Hệ thống máy tính đem triển khai
10
Lập trình đa luồng
• Mô hình lập trình áp dụng tốt cho hệ thống song
song SMP (Sysmetric Multi-Processing)
11
Thread_2
create_C()
Thread_1
transform_B()
Thread_0
calculate_A()
Lập trình đa luồng
Thread_0
for (i=0; idoloop(i)
Thread_1
for (i=50; idoloop(i)
master
worker
12
Ưu điểm của lập trình đa luồng
• Khai thác tối đa tính song song của hệ thống đa
xử lý đối xứng (SMP)
• Sử dụng tối đa khả năng của bộ xử lý
• Tăng hiệu suất của chương trình ngay cả với
máy đơn xử lý
• Tăng khả năng đáp ứng của chương trình

• Đưa ra cơ chế liên lạc giữa các công việc nhanh
và hiệu quả hơn
13
Vấn đề trong lập trình đa luồng
• Đồng bộ hóa các công việc
• An toàn và toàn vẹn với dữ liệu chia sẻ
• Xử lý điều kiện đua tranh
• Dò lỗi chương trình
14
OpenMP là gì?
15
OpenMP: Open specifications for Multi Processing
• OpenMP là
– Application Programming Interface (API),
– đem lại mô hình lập trình linh động cho những nhà
phát triển ứng dụng song song chia sẻ bộ nhớ
• OpenMP được hợp thành bởi
– Chỉ thị chương trình dịch (compiler directives)
– Thư viện hàm thời gian chạy (library runtime routines)
– Các biến môi trường (environment variables)
• Có thể dùng được trên hầu hết các máy với kiến
trúc một không gian nhớ (single memory space)
16
OpenMP không phải
• Một ngôn ngữ lập trình mới
– Thực ra OpenMP hoạt động trên sự liên kết chặt chẽ
với ngôn ngữ lập trình làm cơ sở, vd. Fortran, C/C++
• Tự động song song hóa chương trình
– Người lập trình phải tự ý thức về tính song song của
công việc

– OpenMP cung cấp cơ chế để chỉ định việc thực hiện
song song
• Phương tiện lập trình cho hệ thống có bộ nhớ
phân tán
17
Ưu điểm của OpenMP
• Một chuẩn hoàn chỉnh và được công nhận trên thực tế
• Hiệu suất và khả năng mở rộng tốt
– Nếu chương trình được thiết kế đúng!
• Tính khả chuyển cao
– Chương trình viết ra có thể dịch bởi nhiều chương trình dịch
khác nhau
• Dễ sử dụng nhờ sự đơn giản và số lượng ít các chỉ thị
• Cho phép song song hóa tăng dần chương trình tuần tự
18
OpenMP trong kiến trúc
chia sẻ bộ nhớ
User Layer
OpenMP API
System Layer
19
Mô hình song song OpenMP
• OpenMP cung cấp mô hình lập trình đa luồng
cấp cao, xây dựng trên thư viện lập trình đa
luồng của hệ thống, vd. POSIX Threads
• Thực hiện theo mô hình Fork-Join
– Chương trình OpenMP bắt đầu việc thực hiện như
một luồng chủ duy nhất, master thread
– Luồng chủ thực hiện tuần tự cho đến vùng song song
đầu tiên

– Luồng chủ tạo nhóm các luồng để chia sẻ thực hiện
các công việc song song
20
Mô hình Fork-Join
• Song song đa luồng
• Song song có khai báo
• Song song động
21
Mô hình bộ nhớ OpenMP
• Mọi luồng có quyền
truy cập đến vùng nhớ
chung toàn cục
• Dữ liệu hoặc là chia sẻ
hoặc là riêng tư
• Việc truyền dữ liệu là
trong suốt với người
lập trình
• Cần thiết phải đồng bộ
hóa nhưng hầu như
được thực hiện ngầm
22
Tính năng chính của OpenMP
• Tạo nhóm các luồng cho thực hiện song song
• Chỉ rõ cách các chia sẻ công việc giữa các
luồng thành viên của nhóm
• Khai báo dữ liệu chia sẻ và riêng tư
• Đồng bộ các luồng và cho phép các luồng thực
hiện thực hiện công việc một các độc quyền
• Cung cấp hàm thời gian chạy
• Quản lý số lượng luồng

23
Viết chương trình song song
• Chia tách bài toán thành các công việc
– Lý tưởng nhất khi các cộng việc là hoàn toàn độc lập
• Gán công việc cho các luồng thực thi
• Viết mã trên môi trường lập trình song song
• Thiết kế chương trình phụ thuộc vào
– Nền tảng phần cứng
– Cấp độ song song
– Bản chất của bài toán
24
Phong cách lập trình OpenMP
• Song song theo dữ liệu
– Khuyến kích lập trình song song có cấu trúc dựa trên
phân chia công việc trong vòng lặp
– #pragma omp parallel for
• Song song theo công việc
– Hỗ trợ việc gán các công việc cụ thể cho các luồng
thông qua chỉ số của luồng
– #pragma omp parallel sections
25
OpenMP Environment Variables
OpenMP Runtime Routines
OpenMP Compiler Directives
cập trực tiếp đến tài nguyên của tiến trình khác – Liên lạc giữa những tiến trình rất tốn ngân sách • Tiến trình hoàn toàn có thể được nhìn theo 2 góc nhìn : chiếm hữu tài nguyên và thực thi lệnh → theogóc độ 2 thi tiến trình là tập hợp những luồngLuồng ( Thread ) • Luồng là đơn vị chức năng thực thi của tiến trình • Một tiến trình gồm có một hoặc nhiều luồng, mỗi luồng thì thuộc về một tiến trình • Luồng có vùng nhớ ngăn xếp riêng, con trỏ lệnhriêng, những thanh ghi riêng • Các luồng trong tiến trình san sẻ những tài nguyênkhác của tiến trình, vd. bộ nhớ • Liên lạc giữa những luồng trải qua vùng nhớ củatiến trìnhTiến trình và luồngKiến trúc đa luồngLập trình đa luồng • Theo quan điểm lập trình – Luồng là dòng điều khiển và tinh chỉnh độc lập, tức là hàm – Tham số của hàm là tài liệu của luồng – Mỗi hàm thực thi một việc làm đơn cử → một tiếntrình hoàn toàn có thể thực thi nhiều việc làm một lúc bằngcách chia nó thành những luồng → lập trình đa luồng • Phân biệt với lập trình đa tiến trình – Ngân sách chi tiêu khởi tạo, quản trị, kết thúc việc làm – Ngân sách chi tiêu trao đổi tài liệu giữa những việc làm – Hệ thống máy tính đem triển khai10Lập trình đa luồng • Mô hình lập trình vận dụng tốt cho mạng lưới hệ thống songsong SMP ( Sysmetric Multi-Processing ) 11T hread_2create_C ( ) Thread_1transform_B ( ) Thread_0calculate_A ( ) Lập trình đa luồngThread_0for ( i = 0 ; i