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 1toá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 2lậ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 3Hì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 4Tê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 5Tê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 6hoặ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 716: 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 85 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 9Nguyễ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 10OpenMP 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 11dướ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