Tải bản đầy đủ (.pptx) (24 trang)

Tìm hiểu về OpenMP trong lập trình song song

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 (866.11 KB, 24 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP. HCM
KHOA CÔNG NGHỆ THƠNG TIN

LẬP TRÌNH SONG SONG VỚI
OPENMP
OpenMP
là gì?

Mơ hình
lập trình
như thế
nào?

Nó có
cấu trúc
ra sao?

Nhóm 8
1. Đặng Quốc Hải : 2001170046
2. Thái Kim Hùng : 2001170064
3. Nguyễn Hữu Trọng : 2001170205
4. Phạm Thị Thanh Thanh : 2001170171


Mục lục
1

 Giới thiệu OpenMP là gì?
 
Mơ hình lập trình song song của OpenMP
 


Cấu trúc chương trình
 Các loại chỉ thị trong OpenMP
 Các hàm trong OpenMP và biến môi trường

6

 Cách sử dụng và ví dụ
 Phần câu hỏi phản biện


OpenMP là gì ?

OpenMP (Open Multi
– Processing) là một
giao diện lập trình ứng
dụng Application
Program Interface
(API) được sử dụng để
điều khiển các luồng
(Thread) dựa trên cấu
trúc chia sẻ bộ nhớ
chung.

Các thành phần của
OpenMP gồm:
• Các chỉ thị biên dịch
(Compiler Directive).
• Thư viện runtime
(Runtime Library
Rountines).

• Các biến mơi trường
(Enviroment
Variables).

OpenMP là một thư
viện, giúp cho người
lập trình đơn giản và
mềm dẻo để phát triển
chương trình song
song chạy trên máy
PC hỗ trợ nhiều bộ xử
lý.


Mơ hình lập trình song song trong OpenMP.
 

*Mơ hình fork-Join:

Trong mơ hình này tất cả các chương trình song
song đều bắt đầu với việc xử lý đơn bởi một luồng
chủ (master thread)
 

FORK: Có nghĩa là luồng chủ sau đó sẽ tạo ra một
tập các luồng song song. Và sau đó đoạn mã trong
vùng song song được thực thi song song bởi tập
luồng song song vừa tạo ra.
 


JOIN: Khi mà tập luồng song song đã hoàn thành
đoạn mã trong vùng song song chúng sẽ được đồng
bộ và kết thúc rồi sau đó cơng việc lại được thực
hiện bởi luồng chủ
 


Cú Pháp và cấu trúc song song

2.#pragma
omp theo sau
là các thơng số
và kết thúc
bằng một ký
hiệu xuống
dịng.

1.Tất cả các chỉ dẫn
OpenMP trong
C/C++ đều được
dùng thông qua


Chỉ thị Parallel
-Với OpenMP, chỉ thị được bắt đầu
bởi #pragma omp
 

-Chỉ thị #pragma omp parallel cho
biết các câu lệnh trong khối được thực

thi song song trên các thread của máy Chương trình sẻ xuất hiện 4 dịng:”OpenMP:
 

 

*Lưu ý:
– Chương trình sử dụng các hàm thư
viện, nên phải có
#include <omp>.
 

Hello” nếu máy có 4 thread.


Chỉ thị Parallel For
Chỉ thị này chia các công việc trong vịng lặp for
cho các thread
 

• Trên máy có 4 thread, với 12 câu lệnh lặp được
phân chia cho mỗi thread đảm trách 3 câu lệnh.
 

• Câu lệnh printf giá trị 0, 1, 2 (của vòng lặp) được
thực hiện bởi thread thứ I
 

• Câu lệnh in giá trị 3, 4, 5 bởi thread thứ II

 


• Câu lệnh in giá trị 6, 7, 8 bởi thread thứ III

 

• Câu lệnh in giá trị 9, 10, 11 bởi thread thứ IV

 

 

Kết quả lần lượt 4 thread xuất ra 3 con số
của mình cần print (4 x 3 = 12 con số)
 


Chỉ thị Section
 

Ví dụ cách viết code:

Dùng để chỉ ra các phần mã trong vùng song
song chia cho các luồng thực hiện. Trong

#pragma omp sections [clause...]
newline
private(list)
firstprivate(list)
lastprivate(list)
reduction(operator:list)

nowait
{
#pragma omp section newline
structured_block
#pragma omp section newline
structured_block
 

phạm vi của chỉ thị SECTIONS có các chỉ thị
SECTION.
Mỗi một SECTION sẽ được thực hiện bởi
một luồng trong tập các luồng và các
SECTION khác nhau sẽ được thực hiện bởi
các luồng khác nhau


Chỉ thị SINGLE

Chỉ ra rằng đoạn mã bao quanh
chỉ thị chỉ được thực hiện bởi
một luồng trong tập các luồng :
#pragma omp sections [clause...]
newline
private(list)
firstprivate(list)
nowait
Structure_block

Các luồng khác mà không
thực thi đoạn mã trong chỉ

thị SINGLE sẽ phải đợi đến
khi luồng thực thi đoạn mã
trong chỉ thị kết thúc mới
được thực hiện các cơng
việc ngoai chỉ thị SINGLE
nếu khơng có mệnh đề
NOWAIT được đưa ra


Các hàm trong OpenMP
Hàm:
OMP_SET_NUM_THREADS:

Hàm này phải được khai báo trong
vùng tuần tự và khi đến vùng song
song gần ngay nó thì vùng song
song đó sẽ được thực hiện với số
lượng các luồng mà nó đưa ra.

Hàm thư viện này dùng để
thiết lập số lượng các luồng
để thực hiện vùng song
song tiếp sau.

#include <omp.h>
void omp_set_num_threads ( int num_threads )


Các hàm trong OpenMP


4.Nếu hàm này được gọi ra
từ vùng tuần tự thì nó sẽ
trả lại kết quả là 1 .

1.Hàm:
OMP_GET_NUM_THREAD
S

#include <omp.h>
int omp_get_num_thread
()

2.Hàm này được gọi từ
vùng song. Khi được gọi
nó sẽ trả về số lượng các
luồng thực hiện vùng song
song đó.


Các hàm trong OpenMP
*Hàm OMP_GET_MAX_THREADS:

 

Hàm này trả về giá trị lớn nhất trong các
giá trị trả về của các hàm
OMP_GET_NUM_THREADS.
#include <omp.h> //thư viện
int omp_get_max_threads ( ) //khng mẫu
Hàm này có thể gọi cả ở vùng tuần tự lẫn

vùng song song

 

*Hàm OMP_GET_THREAD_NUM :

Hàm này trả về chỉ số của luồng đang
thực hiện . Chỉ số này nằm trong khoảng từ
0 đến OMP_GET_NUM_THREADS – 1.
Và luồng chủ luân mang chỉ số 0 .
#include <omp.h>
int omp_get_thread_num ()
Nếu nó được gọi từ vùng tuần tự thì kết
quả trả về là 0


Ngồi ra cịn các hàm nữa
int omp_in_parallel (): kiểm tra xem
vùng mã chứa nó được thực hiện song
song hay tuần tự
void omp_set_dynamic (int
dynamic_thread) :cho phép hoặc không
cho phép sự điều chỉnh động của các
luồng thực thi trong vùng song song
int omp_get_dynamic ():kiểm tra xem có
sự điều chỉnh động hay khơng

void omp_set_nested (int nested): cho phép
hay không cho phép việc song song lồng
int omp_get_nested ():sử dụng để nhận biết

xem có sự song song lồng sẩy ra không.
void omp_init_lock ():dùng để thiết lập một
khóa thơng qua các biến khóa
void omp_destroy_lock() : dùng tách ra các
biến khóa từ bất kì khóa nào
double omp_get_wtime(): trả về thời gian
hiện tại, tính ra giây


Một số Biến môi trường
setenv <tên biến>
giá trị

export biên>= giá trị

*Cú pháp khai
báo biến:

1.OMP_SCHEDULE
Biến này cũng giống như mệnh đề
schedule. Dùng để lập lịch sự thực hiện
các công việc trong vịng lặp các luồng
thực hiện.
Ví dụ :
setenv OMP_SCHEDULE “ static, 4”


Một số Biến môi trường
2.OMP_NUM_THREADS

Biến này giống như hàm thư viện omp_set_num_threads().
Dùng để thiết lập số lượng các luồng thực hiện trong vùng
song song.
Ví dụ: setenv OMP_NUM_THREADS 8
3.OMP_DYNAMIC: Biến này dùng để thiết lập sự điều
chỉnh động các luồng. Nó nhận hai giá trị TRUE hoặc
FALSE. Nếu giá trị TRUE tức là có cho phép sự điều chỉnh
động các luồng thực thi trong vùng song song, ngược lại
không cho phép sự điều chỉnh động các luồng thực thi trong
vùng song song.
Ví dụ : setenv OMP_DYNAMIC TRUE


CÁCH SỬ DỤNG VÀ VÍ DỤ
Cách sử dụng thư
viện OpenMP trên
Visual Studio

Ví dụ minh
họa


Cách sử dụng thư viện OpenMP
Có thể enable trên IDE
bằng cách tạo 1 Project
Properties → C/C+
+ → Language → OpenM
P và set là Yes (/openmp)



Cách sử dụng thư viện OpenMP


Ví dụ minh họa


Ví dụ minh họa
Từ kết quả trên có thể
thấy rằng vòng lặp for đã
được chia thành 8 thread,
mỗi thread xử lí một phần
(khơng giao nhau) của
vịng lặp.

Chính dịng này chỉ
định vòng lặp for tự
động chạy song song
(ở đây cpu máy tơi có
4 nhân nên sẽ có 8
thread chạy).

So với chương trình
c++ bình thường,
đoạn code trên có
thêm dịng #pragma
omp parallel for.




×