1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận môn PHÂN TÍCH & THIẾT KẾ GIẢI THUẬT NÂNG CAO Ứng dụng lập trình song song với MPI trong bài toán nhân hai ma trận

15 1K 5

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 608,94 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Do đó việc sử dụng hệ thống có nhiều bộ xử lý và các giải thuật song song để giải quyết các bài toán trên là vô cùng cần thiết.. Trong khuôn khỗ bài báo này không giới thiệu chi tiết về

Trang 1

toán nhân hai ma trận

Lê Phước Khiêm, Trần Quốc Lịnh, Phan Minh Nhật,

Nguyễn Thái Hùng, Võ Đăng Khoa, and Đinh Hoàng Văn Bửu Thịnh

Tóm tắt nội dung Bài báo này giới thiệu những kiến thức cơ bản về tính toán song song và lập trình song song Ngoài ra còn trình bày khái niệm về MPI (Message Passing Interface), những nguyên tắc lập trình song song với MPI Sử dụng thư viện hàm MPI lập trình minh họa bài toán nhân hai ma trận bằng thuật toán Fox Rút ra những kết luận về thời gian chạy chương trình bằng giải thuật tuần tự và bằng giải thuật song song

Key words: MPI, thuật toán Fox, lập trình song song, nhân ma trận

1 Giới thiệu

Sự phát triển và mở rộng phạm vi ứng dụng của công nghệ thông tin luôn gặp phải hai thách thức lớn đó là không gian nhớ và tốc độ xử lí của máy tính Một

số bài toán do thực tiễn và nghiên cứu lý thuyết đặt ra đòi hỏi phải xử lý nhanh trên một cơ sở dữ liệu đồ sộ, đặc biệt là trong các lĩnh vực trí tuệ nhân tạo, nhận dạng, xử lí ảnh, điều khiển tự động, mô phỏng, các bài toán dự báo mà các phương pháp và công cụ tính toán truyền thống không thể đáp ứng được Trong những trường hợp ấy, ta có thể tìm cách phân rã bài toán thành những bài toán có kích thước và quy mô dữ liệu nhỏ hơn Tuy nhiên điều đó không phải bao giờ cũng có thể thực hiện Xử lí song song (parallel processing) là một trong những giải pháp giúp ta có thể xử lý tình huống nêu trên Hiện nay có rất nhiều chuẩn hỗ trợ lập trình song song như MPI hỗ trợ lập trình song song trên

bộ nhớ phân tán, OpenMP hỗ trợ lập trình trên bộ nhớ chia sẽ chung, Pthread

hỗ trợ lập trình luồng Trong khuôn khổ bài báo này chỉ giới thiệu về MPI và ứng dụng MPI vào lập trình song song bài toán nhân hai ma trận bằng thuật toán Fox Phần tiếp theo giới thiệu tổng quan về xử lý song song và tại sao cần thiết phải xử lý song song Phần 3 sẽ giới thiệu tổng quan về MPI trong đó cho biết MPI là gì, nguyên tắc lập trình MPI Phần 4 sẽ mô tả bài toán nhân hai

ma trận bằng thuật toán Fox và ứng dụng MPI trong việc giải quyết bài toán

2 Tính toán song song

2.1 Tính toán song song là gì?

Tính toán song song là việc sử dụng đồng thời các bộ đa xử lý để giải quyết một vấn đề Việc này được hoàn thành bằng cách tách vấn đề thành nhiều phần độc

Trang 2

lập sau đó mỗi bộ xử lý có thể chạy thuật toán của nó đồng thời với những cái khác Các bộ phận xử lý có thể khác nhau và bao gồm các dạng tài nguyên như: một máy tính đơn gồm nhiều bộ đa xử lý, nhiều máy tính được kết nối mạng, phần cứng chuyên biệt, hoặc có thể là sự kết hợp của những dạng trên.[5]

2.2 Tại sao phải xử lý song song?

Do yêu cầu thực tế ngày càng có nhiều bài toán với kích thước rất lớn và yêu cầu xử lý tính toán phải nhanh Tuy nhiên trong thực tế lại không tồn tại máy tính có bộ nhớ vô hạn và khả năng xử lý vô hạn Và cũng có nhiều bài toán mà với giải thuật tuần tự không thể giải quyết được Do đó việc sử dụng hệ thống

có nhiều bộ xử lý và các giải thuật song song để giải quyết các bài toán trên là

vô cùng cần thiết

2.3 Các thành phần liên quan đến tính toán song song

– Kiến trúc máy tính song song

– Phần mềm hệ thống

– Giải thuật song song

– Ngôn ngữ lập trình song song

Trong khuôn khỗ bài báo này không giới thiệu chi tiết về các thành phần liên quan đến tính toán song song mà chỉ giới thiệu về thư viện MPI hỗ trợ trong việc lập trình xử lý song song trong Fortran 77 và C Phần tiếp theo sẽ giới thiệu tổng quan về MPI

3 Tổng quan về MPI

3.1 MPI là gì

MPI, Message Passing Interface, một dạng giao thức kết nối của máy tính MPI

là một thư viện các hàm hay thủ tục đã được chuẩn hóa hỗ trợ trong lập trình song song có thể gọi được từ các ngôn ngữ Fortran, C, C++ hay Ada

3.2 Mô hình lập trình message passing

Mô hình lập trình message passing được phát triển dựa trên ý tưởng lập trình song song Trong đó bài toán được chia thành nhiều phần nhỏ, mỗi phần được giải quyết trên một processor với bộ nhớ riêng Các phần này sẽ giao tiếp với nhau qua một hoặc nhiều mạng để cùng nhau giải quyết vấn đề của bài toán

Trang 3

Hình 1 Mô hình lập trình message passing

3.3 Các giao thức trong MPI

– Giao thức point to point

Giao thức point to point là giao thức đơn giản nhất trong truyền thông điệp Một thông điệp được truyền từ một processor tới một processor và chỉ hai processor này mới biết được thông tin trong thông điệp đó

– Giao thức collective

Giao thức collective cho phép nhiều processor trao đổi thông điệp cùng nhau

3.4 Nguyên tắc lập trình MPI

– Tất cả chương trình sử dụng MPI phải bắt đầu với hàm MPI_Init và kết thúc với hàm MPI_Finalize và MPI_Init chỉ được gọi một lần duy nhất trong toàn bộ chương trình

3.5 Các hàm MPI thường dùng

Trang 4

Tên hàm Ý nghĩa

MPI_Init() Khởi tạo bộ môi trường thực thi MPI, hàm này phải được gọi

trước tất cả các hàm MPI khác, và chỉ được gọi một lần MPI_Finalize() Dùng để kết thúc môi trường thực thi MPI Hàm này phải được

gọi cuối cùng trong tất cả các hàm MPI MPI_Comm_size(

MPI_COMM_WORLD,

&size)

Xác định số lượng tiến trình tham gia vào một bộ giao tiếp, thông thường, nó được dùng trong bộ giao tiếp MPI_COMM_WORLD bộ giao tiếp được xây dựng sẵn, bao gồm tất cả các tiến trình tham gia vào chương trình

MPI_Comm_rank(

MPI_COMM_WORLD,

&rank)

Xác định thứ tự của tiến trình này trong bộ giao tiếp Lúc ban đầu mỗi tiến trình được gán cho một số thứ tự từ 0 tới n-1 trong

bộ giao tiếp MPI_COMM_WORLD MPI_Finalized(&flag) Kiểm tra xem hàm MPI_Init() đã được gọi hay chưa

MPI_Barrier() Đồng bộ tất cả các tiến trình trong hệ thống, khi hàm này được

gọi, tất cả các tiến trình sẽ cùng chờ cho tới khi tiến trình cuối cùng thực hiện đến bước này và tất cả cùng thực hiện câu lệnh tiếp theo vào cùng một thời điểm

MPI_Wtime() Xác định thời gian của hệ thống

MPI_Wtick() Xác định độ chính xác của thời gian hệ thống

MPI_Reduce(void *local,

void *global, int count,

MPI_Datatype type,

MPI_Op operator, int root,

MPI_Comm comm)

Hàm tình gộp, dùng để gộp các kết quả của từng tiến trình vào kết quả chung Trong đó, local là kết quả cục bộ, global là kết quả nhận được sau khi tính gộp các kết quả cục bộ, type là kiểu

dữ liệu tính gộp, operator là thao tác tính gộp, root là thứ tự của tiến trình sẽ nhận được kết quả global, comm là bộ giao tiếp MPI_Send()

MPI_Receive()

3.6 Các kiểu thường dùng với MPI

Trang 5

Tên Kiểu dữ liệu C tương đương

MPI_CHAR signed char

MPI_DOUBLE double

MPI_FLOAT Float

MPI_LONG_DOUBLE long double

MPI_SHORT Short

MPI_UNISIGNED_CHAR unsigned char

MPI_UNISIGNED unsigned int

MPI_UNSIGNED_LONG unsigned long

MPI_UNSIGNED_SHORT unsigned short

4 Bài toán nhân ma trận và thuật toán Fox

4.1 Bài toán nhân hai ma trận với thuật toán tuần tự

Định nghĩa bài toán nhân hai ma trận rất đơn giản Cho ma trận A có kích thước m x n, và ma trận B có kích thước n x p Ma trận C có kích thước m x p

là kết quả của phép toán nhân ma trận A và B có phần tử ở hàng thứ i cột thứ

j được xác định bởi:

cij =

n

X

k=1

aikbkj

Cách giải quyết trực tiếp trên một máy tính là dùng các vòng lặp:

for (i=0; i<n; i++)

for (j=0; j<n; j++)

for (k=0; k<n; k++)

C[i][j] += a[i][k] * b[k][j]

Với cách cài đặt này thì thời gian để tính phép nhân ma trận A x B là (n3) Đến cuối những năm 1960, Strassen đưa ra một giải pháp cải tiến thuật toán trên, nó có tính đột phá trong lịch sử của thuật toán chia để trị và ông đã tính được T (n) = O(nlg 7) = O(n2.81)

4.2 Thuật toán Fox [1]

Tuy Strassen đã tìm ra cách giảm bớt đáng kể thời gian tính toán trong bài toán nhân hai ma trận, song với số lượng phần tử mảng lớn thì rất ít người đủ kiên nhẫn để ngồi chờ kết quả Vì vậy đã có nhiều người giải bài toán này bằng thuật toán song song như phương pháp chia dữ liệu cho các tác vụ theo dòng, theo cột

Trang 6

hoặc theo khối Ở đây chúng ta sẽ tìm hiểu giải thuật Fox cho bài toán nhân hai

ma trận và so sánh tính ưu việt của nó so với cách giải thuật tuần tự như thế nào

Để đơn giản, chúng ta giả định rằng

- Các ma trận vuông n ∗ n

- Số lượng processes là n2

Giải thuật Fox chia dữ liệu mảng A theo đường chéo

[5] Hình 2 Giải thuật Fox

1: procedure FoxAlgorithm

2: Group p=new Procs2(P,P);

3: Range x=p.dim(0);

4: Range y=p.dim(1);

5: while on(p) do

6: float [[#,#, , ]] a = new float [[x,y,B,B]];

7: float [[#,#, , ]] b = new float [[x,y,B,B]];

8: float [[#,#, , ]] c = new float [[x,y,B,B]];

9: float [[#,#, , ]] temp = new float [[x,y,B,B]];

10: for k=0 p-1 do

11: while over(Location i=x|:) do

12: float [[,]] sub = new float [[B,B]];

13: Adlib.remap(sub, a[[i, (i+k)%P, z, z]]);

14: while over(Location j=y|:) do

15: matmul(c[[i, j, z, z]], sub, b[[i, j, z, z]]);

Trang 7

16: end while

18: //Cyclic shift ’b’ in ’y’ dimension

19: Adlib.shift(tmp, b, 1, 0, 0); // dst, src, shift, dim, mode;

20: Adlib.copy(b, tmp);

22: end while

23: end procedure

Ở thuật toán này thời gian được tính:

Tp=n

3

p + 2tw

n2

p+ tsp Trong đó tslà thời gian bắt đầu (startup time) tw thời gian truyền mỗi từ (per

-word transfer time)

4.3 Kết quả thực nghiệm

Hình 3 Biểu đồ so sánh thời gian thực hiện giải thuật Fox với thuật giải tuần tự

Nhìn vào biểu đồ trên ta thấy giải thuật song song chạy trên 1 Core sẽ chậm

hơn giải thuật tuần tự và với kích thước mảng nhỏ thì giải thuật song song và

tuần tự không có gì khác biệt lớn, nhưng với kích thước mảng đủ lớn thì giải

thuật song song chạy trên nhiều Core sẽ nhanh hơn rất nhiều đây chính là ưu

điểm của giải thuật song song

Trang 8

5 Kết luận

Cùng với sự phát triển mạnh mẽ của khoa học kỹ thuật và hạ tần công nghệ thông tin việc phát triển các ứng dụng số và nhu cầu số hóa tài liệu phục vụ học tập, nghiên cứu, công việc kinh doanh, lưu trữ đã làm cho lượng dữ liệu ngày càng đồ sộ Bên cạnh đó xã hội loài người hiện nay còn phải đối diện với nhiều mối hiểm họa từ thiên nhiên cung như từ con người như động đất, sóng thần, thiên tai, bệnh dịch, tội phạm, chiến tranh, khủng hoảng kinh tế Để tìm kiếm thông tin từ kho dữ liệu khổng lồ hay giúp giảm bớt những rũi ro trong cuộc sống đồng thời tìm kiếm những giải pháp tốt đẹp cho tương lai thì con người bắt buộc phải dùng những chương trình máy tính để thực hiện Nhưng với tốc

độ xử lí cùng bộ nhớ của máy tính có hạn thì việc lập trình truyền thống sẽ khó thực hiện và không đem lại kết quả như mong muốn Do đó lập trình song song

là một lựa chọn tối ưu cho bài toán của thời đại

Tài liệu

1 http://www.hpjava.org/reports/structuredSPMD/javad/node27.html

2 Pgs.TS Trần Cao Đệ Slide tính toán song song 2008

3 Wolfgang Baumann Writing Message-Passing Parallel Programs with MPI The Uni-versity of Edinburgh

4 http://www.software.unn.ac.ru

5 http://vi.wikipedia.org/wiki/MPI

Trang 9

Nguyễn Trung Việt, Nguyễn Minh Toàn, Hà Lê Ngọc Dung,

Trịnh Trần Nguyễn, Trần Huỳnh Anh, Phan Ngọc Diễn

ntrungviet@gmail.com, nmtoan38@gmail.com, hlndung87@gmail.com trinhnguyen88@gmail.com, anh.tran356@gmail.com, phandienmku@gmail.com

Tóm tắt nội dung Bài viết này trình bày một cách tổng quan về lập trình song song với OpenMP, những ưu điểm của mô hình lập trình song song với mô hình tuần tự Dùng bài toán tìm số số nguyên tố trong một giới hạn cho trước để minh họa cho phần lý thuyết đã nghiên cứu, với những bộ số thực nghiệm khác nhau đã cho ra thời gian chênh lệch giữa thực thi song song và tuần tự khác nhau Trong xử lý công việc, thời gian thực thi của một chương trình được lập trình song song luôn ít hơn

so với lập trình tuần tự Qua nghiên cứu cho thấy lập trình song song không phải là khái niệm mới và nó đang là xu thế của những lĩnh vực ứng dụng công nghệ thông tin, đặc biệt là những lĩnh vực cần xử lý những dữ liệu có kích thước lớn với một khoảng thời gian giới hạn

Từ khóa: Lập trình song song, OpenMP

1 Tổng quan lập trình OpenMP

1.1 Giới thiệu về OpenMP (Open specifications for Multi

Processing)

Trước những năm 90, khái niệm lập trình song song đã xuất hiện, các nhà cung cấp các máy tính chia sẻ bộ nhớ đã đưa ra các sản phẩm hỗ trợ sự đồng bộ và các chỉ thị cơ bản sử dụng ngôn ngữ Fortran Tuy nhiên mỗi nhà cung cấp có những chuẩn riêng Trải qua nhiều cải tiến, đầu năm 1997, chuẩn OpenMP được đưa ra để làm một chuẩn chung hỗ trợ việc lập trình song song trên kiến trúc chia sẻ bộ nhớ và phát triển cho đến nay

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

Thành phần của OpenMP bao gồm:

– Các chỉ thị biên dịch (Compiler Directives)

– Các thư viện runtime (Runtime Library Routines)

– Các biến môi trường (Emviroment Variables)

Ngoài ra còn có một số công cụ hỗ trợ như: công cụ điều khiển (Monitoring), công cụ gỡ rối (Debugging), công cụ phân tích hiệu suất (Performance Analysis) OpenMP 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) OpenMP hoạt động trên sự liên kết chặt chẽ với

Trang 10

OpenMP không tự động song song hóa chương trình, mà chỉ cung cấp cơ chế

để chỉ định việc thực hiện song song, chương trình thực hiện song song như thế nào phụ thuộc vào người lập trình

1.2 Mục tiêu của OpenMP

OpenMP ra đời với mục tiêu cung cấp một chuẩn chung cho rất nhiều kiến trúc

và nền tảng phần cứng Thiết lập một tập các chỉ thị biên dịch hỗ trợ việc lập trình song song trên máy tính chia sẻ bộ nhớ chung Một mức song song chính thường được thực thi với ba đến bốn chỉ thị

OpenMP giúp cho việc lập trình song song một cách dễ dàng, cung cấp khả năng song song hóa chương trình tuần tự mà không dùng đến thư viện thông điệp OpenMP được sử dụng để giải quyết các vấn đề giới hạn về thời gian và có khối lượng dữ liệu lớn như: dự báo thời tiết, mô phỏng tai nạn xe hơi, dự báo dòng chảy thủy triều

1.3 Mô hình lập trình song song OpenMP

Có nhiều mô hình lập trình song song như: mô hình chia sẽ bộ nhớ (Shared Memory Model), song song hóa dựa trên cơ chế luồng (Thread based parallelism),

mô hình song song hiện (Explicit Parallelism), mô hình Fork-Join OpenMP sử dụng mô hình Fork-Join để thực thi công việc song song

Hình 1 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 thực thi như một tiến trình đơn gọi là luồng chủ (master thread) Luồng chủ sẽ thực thi tuần tự cho tới khi gặp 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 (FORK), khi hoàn thành đoạn mã trong vùng song song, luồng song song sẽ được đồng bộ và kết thúc, luồng chủ

sẽ thực hiện tiếp công việc còn lại (JOIN)

1.4 Các chỉ thị trong OpenMP

Chỉ thị trong OpenMP xuất hiện như một câu "comment" trong mã nguồn và được bỏ qua trong quá trình thực thi trừ khi được gắn cờ biên dịch (compiler

Trang 11

dưới dạng:

# pragma omp directive-name [clause ] newline

– # pragma omp: yêu cầu bắt buộc đối với mọi chỉ thị OpenMP C/C++ – directive-name: là tên của chỉ thị phải xuất hiện sau # pragma omp và đứng trước bất kì mệnh đề nào

– [clause ] : các mệnh đề này không bắt buộc trong chỉ thị

– newline: yêu cầu bắt buộc với mỗi chỉ thị nó là tập mã lệnh nằm trong khối cấu trúc được bao bọc bởi chỉ thị

Ví dụ: # pragma omp parallel default ( shared ) private (beta,pi)

1.5 Thư viện Run-Time

OpenMP cung cấp thư viện omp.h với rất nhiều các hàm chức năng bao gồm các truy vấn liên quan đến số lượng và chỉ số các luồng, thiết lập số lượng các luồng sử dụng, các hàm thiết lập môi trường thực thi

Ví dụ:

– OMP_ SET_ NUM_ THREADS: thiết lập số lượng các luồng

– OMP_ GET_ NUM_ THREADS: trả về số lượng các luồng thực hiện trong vùng song song đang gọi hàm

– OMP_ GET_ NUM_ PROCS: trả về số lượng các bộ xử lý thực thi chương trinh tại thời điểm được gọi

– OMP_ SET_ NESTED: cho phép hay không cho phép song song lồng – OMP_ INIT_ LOCK: hàm này dùng để thiết lập một khóa thông qua các biến khóa

1.6 Các biến môi trường

Các biến môi trường được dùng để điều khiển sự thực hiện đoạn mã song song

Ví dụ:

– OMP_ SCHEDULE: chỉ được sử dụng trong chỉ thị có kiểu lập lịch RUN-TIME như for và parallel for Dùng để xác định các công việc trong vòng lặp được lập lịch trên các bộ xử lý

– OMP_ NUM_ THREADS: thiết lập số lượng lớn nhất các luồng được sử dụng

– OMP_ DYNAMIC: (TRUE hoặc FALSE) cho phép hay không cho phép sự điều chỉnh động cho các luồng thực thi các vùng song song

1.7 Viết chương trình song song với OpenMP

– 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

Ngày đăng: 23/03/2015, 07:51

HÌNH ẢNH LIÊN QUAN

Hình 1. Mô hình lập trình message passing - Tiểu luận môn PHÂN TÍCH & THIẾT KẾ GIẢI THUẬT NÂNG CAO Ứng dụng lập trình song song với MPI trong bài toán nhân hai ma trận
Hình 1. Mô hình lập trình message passing (Trang 3)
Hình 3. Biểu đồ so sánh thời gian thực hiện giải thuật Fox với thuật giải tuần tự - Tiểu luận môn PHÂN TÍCH & THIẾT KẾ GIẢI THUẬT NÂNG CAO Ứng dụng lập trình song song với MPI trong bài toán nhân hai ma trận
Hình 3. Biểu đồ so sánh thời gian thực hiện giải thuật Fox với thuật giải tuần tự (Trang 7)
Hình 1. Mô hình Fork-Join - Tiểu luận môn PHÂN TÍCH & THIẾT KẾ GIẢI THUẬT NÂNG CAO Ứng dụng lập trình song song với MPI trong bài toán nhân hai ma trận
Hình 1. Mô hình Fork-Join (Trang 10)
Hình 2. Demo chương trình - Tiểu luận môn PHÂN TÍCH & THIẾT KẾ GIẢI THUẬT NÂNG CAO Ứng dụng lập trình song song với MPI trong bài toán nhân hai ma trận
Hình 2. Demo chương trình (Trang 14)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w