« Home « Kết quả tìm kiếm

Cơ bản lập trình song song MPI cho Fortran Mục lục


Tóm tắt Xem thử

- Cơ bản lập trình song song MPI cho Fortran Đặng Nguyên Phương [email protected] Ngày 21 tháng 11 năm 2013 Mục lục 1 Mở đầu 2 2 MPI 3 2.1 Giới thiệu.
- 6 3.4 Ví dụ truyền thông điệp.
- 11 4.2 Các kiểu dữ liệu.
- Để có thể chạy được chương trình một cách hiệu quả trên các hệ thống máy tính (cluster ) hoặc các cpu đa lõi (multi-core), chúng ta cần phải tiến hành song song hóa chương trình đó.
- Ưu điểm của việc tính toán song song (parallel computation) chính là khả năng xử lý nhiều tác vụ cùng một lúc.
- Việc lập trình song song có thể được thực hiện thông qua việc sử dụng các hàm thư viện (vd: mpi.h) hoặc các đặc tính đã được tích hợp trong các chương trình biên dịch song song dữ liệu, chẳng hạn như OpenMP trong các trình biên dịch fortran F90, F95.
- Công việc lập trình song song bao gồm việc thiết kế, lập trình các chương trình máy tính song song sao cho nó chạy được trên các hệ thống máy tính song song.
- Nguyên tắc quan trọng nhất ở đây chính là tính đồng thời hoặc xử lý nhiều tác vụ (task ) hay tiến trình (process) cùng một lúc.
- Do đó, trước khi lập trình song song ta cần phải biết được rằng bài toán có thể được song song hoá hay không (có thể dựa trên dữ liệu hay chức năng của bài toán).
- Có hai hướng chính trong việc tiếp cận lập trình song song.
- Song song hoá ngầm định (implicit parallelism): bộ biên dịch hay một vài chương trình khác tự động phân chia công việc đến các bộ xử lý.
- Song song hoá bằng tay (explicit parallelism): người lập trình phải tự phân chia chương trình của mình đế nó có thể được thực thi song song.
- Hiện nay có rất nhiều mô hình lập trình song song như mô hình đa luồng (multi-threads), truyền thông điệp (message passing), song song dữ liệu (data parallel.
- Theo tiêu chí thứ hai, chúng ta cũng có hai loại mô hình là song song hóa tác vụ (task parallelism) và song song hóa dữ liệu (data parallelism.
- Với mô hình bộ nhớ chia sẻ, tất cả các xử lý đều truy cập một dữ liệu chung thông qua một vùng nhớ dùng chung.
- Với mô hình truyền thông điệp thì mỗi xử lý đều có riêng một bộ nhớ cục bộ của nó, các xử lý trao đổi dữ liệu với nhau thông qua hai phương thức gửi và nhận thông điệp.
- Song song tác vụ là phương thức phân chia các tác vụ khác nhau đến các nút tính toán khac nhau, dữ liệu được sử dụng bởi các tác vụ có thể hoàn toàn giống nhau.
- 2 Đặng Nguyên Phương Tài liệu nội bộ NMTP • Song song dữ liệu là phương thức phân phối dữ liệu tới các nút tính toán khác nhau để được xử lý đồng thời, các tác vụ tại các nút tính toán có thể hoàn toàn giống nhau.
- Mô hình truyền thông điệp là một trong những mô hình được sử dụng rộng rãi nhất trong tính toán song song hiện nay.
- Các luồng trao đổi dữ liệu bằng cách gửi nhận các thông điệp • Việc truyền dữ liệu thường yêu cầu thao tác điều phối thực hiện bởi mỗi luồng.
- Tài liệu này được xây dựng với mục đích cung cấp các kiến thức cơ bản bước đầu nhằm tìm hiểu khả năng viết một chương trình song song bằng ngôn ngữ lập trình Fortran theo cơ chế trao đổi thông điệp sử dụng các thư viện theo chuẩn MPI.
- 2 MPI 2.1 Giới thiệu Mô hình truyền thông điệp là một trong những mô hình lâu đời nhất và được ứng dụng rộng rãi nhất trong lập trình song song.
- Hai bộ công cụ phổ biến nhất cho lập trình song song theo mô hình này là PVM (Parallel Virtual Machine) và MPI (Message Passing Interface).
- Thực thi Trong trường hợp phiên bản MPICH2 sử dụng trình quản lý MPD, trước khi thực thi chương trình ta cần gọi MPD qua lệnh mpdboot như đã đề cập đến ở trên hoặc mpd & Chương trình đã được biên dịch bằng MPI có thể được thực thi bằng cách sử dụng lệnh mpirun -np hoặc mpiexec -n 4 Đặng Nguyên Phương Tài liệu nội bộ NMTP Trong đó N là số tác vụ song song cần chạy và tenchuongtrinh là tên của chương trình ứng dụng cần thực thi.
- Ví dụ.
- Bắt đầu chương trình.
- Kết thúc chương trình 3.2 Các khái niệm cơ bản Một chương trình song song MPI thường chứa nhiều hơn một tác vụ (task ) hay còn gọi là tiến trình (process) thực thi.
- Mỗi tác vụ (tiến trình) được phân biệt với nhau bởi chỉ số tác vụ (được gọi là rank hay task ID).
- Chỉ số này là một số nguyên từ 0 đến (N−1) với N là tổng số tác vụ MPI tham gia chạy chương trình.
- Đối với các chương trình chạy theo cơ chế master/slave thì trong hệ thống thường có một tác vụ chủ (master ) điểu khiển các tác vụ khác được gọi là tác vụ con (slave), tác vụ chủ này thường có chỉ số là 0 còn các tác vụ con có chỉ số từ 1 đến (N−1).
- Tập hợp của các tác vụ MPI cùng chạy một chương trình được gọi là một nhóm (group).
- Và tập hợp của các tác vụ trong cùng một nhóm mà có thể trao đổi thông tin với nhau được gọi là một communicator.
- Khi bắt đầu chương trình, communicator mà bao gồm tất cả các tác vụ thực thi được mặc định là MPI_COMM_WORLD.
- Các tác vụ trong MPI trao đổi với nhau thông qua việc gửi/nhận các thông điệp (message).
- Mỗi thông điệp đều chứa hai thành phần bao gồm dữ liệu (data) và header, mỗi header bao gồm.
- Chỉ số của tác vụ gửi • Chỉ số của tác vụ nhận • Nhãn (tag) của thông điệp • Chỉ số của communicator 5 Đặng Nguyên Phương Tài liệu nội bộ NMTP 3.3 Ví dụ “Hello world” Để bước đầu làm quen với việc viết một chương trình MPI, ta sẽ bắt đầu với một ví dụ đơn giản, đó là viết chương trình “Hello world”.
- Khai báo môi trường MPI program hello use mpi integer ierror call MPI_INIT ( ierror ) Lệnh MPI_INIT khởi tạo môi trường MPI để thực hiện tác vụ song song, lệnh này sẽ trả về một giá trị nguyên cho biến ierror, giá trị này sẽ bằng 0 nếu có xảy ra lỗi trong quá trình khởi tạo môi trường.
- Gọi lệnh quản lý số tác vụ song song program hello use mpi integer ierror , ntasks call MPI_INIT ( ierror ) call MPI_COMM_SIZE ( MPI_COMM_WORLD , ntasks , ierror ) Lệnh MPI_COMM_SIZE trả về giá trị số lượng tác vụ song song vào trong biến ntasks.
- Gọi lệnh xác định chỉ số của tác vụ program hello use mpi integer ierror , ntasks , mytask call MPI_INIT ( ierror ) call MPI_COMM_SIZE ( MPI_COMM_WORLD , ntasks , ierror ) call MPI_COMM_RANK ( MPI_COMM_WORLD , mytask , ierror ) Lệnh MPI_COMM_RANK trả về chỉ số (rank ) của tác vụ vào trong biến mytask, chỉ số này có giá trị từ 0 đến ntasks-1, và được sử dụng để nhận biết tác vụ khi điều khiển gửi/nhận thông tin.
- ntasks call MPI_FINALIZE ( ierror ) end Lệnh MPI_FINALIZE đóng môi trường MPI, tuy nhiên các tác vụ chạy song song đang được thực thi vẫn được tiếp tục.
- Trong thực tế, rất nhiều chương trình song song MPI có thể được xây dựng chỉ với 6 lệnh cơ bản, ngoài 4 lệnh vừa kể trên ta còn sử dụng thêm hai lệnh nữa là MPI_SEND để gửi thông điệp và MPI_RECV để nhận thông điệp giữa các tác vụ với nhau.
- Cấu trúc của hai lệnh này như sau: MPI_SEND (buffer,count,datatype,destination,tag,communicator,ierr) MPI_RECV (buffer,count,datatype,source,tag,communicator,status,ierr) Trong đó buffer mảng dữ liệu cần chuyển/nhận count số phần từ trong mảng datatype kiểu dữ liệu (vd: MPI_INTEGER, MPI_REAL.
- destination chỉ số của tác vụ đích (bên trong communicator) source chỉ số của tác vụ nguồn (bên trong communicator) tag nhãn của thông điệp (dạng số nguyên) communicator tập hợp các tác vụ status trạng thái của thông điệp ierror mã số lỗi Để có thể hiểu rõ hơn về cách sử dụng hai lệnh này, ta sẽ xem ví dụ vòng lặp (fixed_loop) sau.
- Trong ví dụ này, MPI_SEND được sử dụng để gửi đi số vòng lặp đã hoàn thành từ mỗi tác vụ con (có chỉ số từ 1 đến N−1) đến tác vụ chủ (chỉ số là 0).
- Lệnh MPI_RECV được gọi N−1 lần ở tác vụ chủ để nhận N−1 thông tin được gửi từ N−1 tác vụ con.
- Các bước khai báo đầu tiên cũng tương tự như trong ví dụ “Hello world” program fixedloop use mpi integer i , rank , ntasks , count , start , stop , nloops integer total_nloops , err integer status ( MPI_STATUS_SIZE ) call MPI_INIT ( err ) call MPI_COMM_RANK ( MPI_COMM_WORLD , rank , err ) call MPI_COMM_SIZE ( MPI_COMM_WORLD , ntasks , err ) Giả sử chúng ta muốn thực hiện vòng lặp 1000 lần, do đó số lần lặp của mỗi tác vụ sẽ bằng 1000/ntasks với ntasks là tổng số tác vụ.
- Chúng ta sẽ sử dụng chỉ số của mỗi tác vụ để đánh dấu phân khúc lặp của mỗi tác vụ 7 Đặng Nguyên Phương Tài liệu nội bộ NMTP program fixedloop use mpi integer i , rank , ntasks , count , start , stop , nloops integer total_nloops , err integer status ( MPI_STATUS_SIZE ) call MPI_INIT ( err ) call MPI_COMM_RANK ( MPI_COMM_WORLD , rank , err ) call MPI_COMM_SIZE ( MPI_COMM_WORLD , ntasks , err ) count = 1000 / ntasks start = rank * count stop = start + count - 1 nloops = 0 do i=start ,stop nloops = nloops + 1 enddo print *,"Task ",rank.
- iterations of the loop." Trong đó count là số lần lặp của mỗi tác vụ, các tác vụ có chỉ số rank sẽ thực hiện lần lặp thứ rank*count đến lần lặp thứ rank*count+count-1.
- Biến nloops sẽ đếm số lần thực hiện vòng lặp của tác vụ có chỉ số rank và xuất ra màn hình.
- Trong trường hợp tác vụ đang thực hiện không phải là tác vụ chủ (rank khác 0), tác vụ này sẽ gửi kết quả nloops cho tác vụ chủ.
- do i=1, ntasks -1 call MPI_RECV (nloops , 1, MPI_INTEGER , i, 0, MPI_COMM_WORLD , status , err) total_nloops = total_nloops + nloops enddo endif Tác vụ chủ sẽ chạy tiếp để đủ số 1000 vòng lặp trong trường hợp có dư ra một số vòng lặp sau khi chia 1000 cho tổng số tác vụ.
- Ban đầu mỗi tác vụ sẽ được gán cho một số nguyên từ 0 đến (N−1) với N là tổng số tác vụ trong communicator MPI_COMM_WORLD.
- c a l l MPI_FINALIZE ( ierr ) end 4.2 Các kiểu dữ liệu Các kiểu dữ liệu cơ bản của MPI được liệt kê trong bảng sau Tên Kiểu dữ liệu MPI_CHARACTER character MPI_INTEGER integer MPI_INTEGER1 integer*1 MPI_INTEGER2 integer*2 MPI_INTEGER4 integer*4 MPI_REAL real MPI_REAL2 real*2 MPI_REAL4 real*4 MPI_REAL8 real*8 MPI_DOUBLE_PRECISION double precision MPI_COMPLEX complex MPI_DOUBLE_COMPLEX double complex MPI_LOGICAL logical MPI_BYTE byte MPI_PACKED data packed Ngoài ra người dùng còn có thể tự tạo ra các cấu trúc dữ liệu riêng cho mình dựa trên các kiểu dữ liệu cơ bản này.
- Các kiểu dữ liệu có cấu trúc do người dùng tự định nghĩa được gọi là derived data types.
- Các lệnh định nghĩa cấu trúc dữ liệu mới bao gồm: MPI_TYPE_CONTIGUOUS tạo ra kiểu dữ liệu mới bằng cách lặp count lần kiểu dữ liệu cũ.
- MPI_TYPE_CONTIGUOUS (count,oldtype,newtype,ierr) MPI_TYPE_VECTOR tương tự như contigous nhưng có các phân đoạn (stride) cố định, kiểu dữ liệu mới được hình thành bằng cách lặp một dãy các khối (block ) của kiểu dữ liệu cũ có kích thước bằng nhau tại các vị trí có tính tuần hoàn.
- MPI_TYPE_VECTOR (count,blocklength,stride,oldtype,newtype,ierr) MPI_TYPE_INDEXED kiểu dữ liệu mới được hình thành bằng cách tạo một dãy các khối của kiểu dữ liệu cũ, mỗi khối có thể chứa số lượng các bản sao kiểu dữ liệu cũ khác nhau.
- MPI_TYPE_INDEXED (count,blocklens(),offsets(),oldtype,newtype,ierr) MPI_TYPE_STRUCT tương tự như trên nhưng mỗi khối có thể được tạo thành bởi các kiểu dữ liệu cũ khác nhau.
- MPI_TYPE_STRUCT (count,blocklens(),offsets(),oldtypes,newtype,ierr) Hình 1 trình bày một số ví dụ cho các cách tạo cấu trúc dữ liệu mới.
- Trong trường hợp truyền các cấu trúc dữ liệu không cùng kiểu, ta có thể sử dụng các lệnh MPI_PACKED và MPI_UNPACKED để đóng gói dữ liệu trước khi gửi.
- 12 Đặng Nguyên Phương Tài liệu nội bộ NMTP Hình 1: Ví dụ các cách tạo cấu trúc dữ liệu mới MPI_TYPE_EXTENT trả về kích thước (tính theo byte) của kiểu dữ liệu MPI_TYPE_EXTENT (datatype,extent,ierr) MPI_TYPE_COMMIT đưa kiểu dữ liệu mới định nghĩa vào trong hệ thống MPI_TYPE_COMMIT (datatype,ierr) MPI_TYPE_FREE bỏ kiểu dữ liệu MPI_TYPE_FREE (datatype,ierr) Ví dụ: tạo kiểu dữ liệu vector program vector u s e mpi 3 i n t e g e r SIZE parameter ( SIZE=4) i n t e g e r numtasks , rank , source , dest , tag , i , ierr r e a l ∗4 a ( 0 : SIZE −1 ,0: SIZE−1.
- MPI_COMM_WORLD , s t a t , ierr ) p r i n t.
- endif c a l l MPI_TYPE_FREE ( rowtype , ierr ) c a l l MPI_FINALIZE ( ierr ) 43 end 4.3 Các cơ chế truyền thông điệp Các cơ chế giao tiếp trong MPI gồm có: Point-to-point cơ chế giao tiếp điểm-điểm, đây là cơ chế giao tiếp giữa từng cặp tác vụ với nhau, trong đó 1 tác vụ thực hiện công việc gửi thông điệp và tác vụ còn lại có nhiệm vụ nhận thông điệp tương ứng đó.
- Thông điệp được phân biệt bởi chỉ số của tác vụ và nhãn (tag) của thông điệp.
- Trong cơ chế này có nhiều kiểu giao tiếp với nhau, chẳng hạn như • Blocking: các lệnh gửi/nhận dữ liệu sẽ kết thúc khi việc gửi/nhận dữ liệu hoàn tất.
- Non-blocking: các lệnh gửi/nhận dữ liệu sẽ kết thúc ngay mà quan tâm đến việc dữ liệu đã thực sự được hoàn toàn gửi đi hoặc nhận về hay chưa.
- Việc dữ liệu đã thực sự được gửi đi hay nhận về sẽ được kiểm tra các lệnh khác trong thư viện MPI.
- Synchronous: gửi dữ liệu đồng bộ, quá trình gửi dữ liệu chỉ có thể được kết thúc khi quá trình nhận dữ liệu được bắt đầu.
- Buffer : một vùng nhớ đệm sẽ được tạo ra để chứa dữ liệu trước khi được gửi đi, người dùng có thể ghi đè lên vùng bộ nhớ chứa dữ liệu mà không sợ làm mất dữ liệu chuẩn bị gửi.
- Ready: quá trình gửi dữ liệu chỉ có thể được bắt đầu khi quá trình nhận dữ liệu đã sẵn sàng.
- Bảng dưới đây tổng hợp các chế độ giao tiếp điểm-điểm và các lệnh gửi/nhận thông điệp tương ứng, thông tin chi tiết về các lệnh này sẽ được trình bày ở những phần sau 14 Đặng Nguyên Phương Tài liệu nội bộ NMTP Chế độ Điều kiện kết thúc Blocking Non-blocking Send Thông điệp đã được gửi MPI_SEND MPI_ISEND Receive Thông điệp đã được nhận MPI_RECV MPI_IRECV Synchronous send Khi quá trình nhận bắt đầu MPI_SSEND MPI_ISSEND Buffer send Luôn kết thúc, không quan tâm quá MPI_BSEND MPI_IBSEND trình nhận đã bắt đầu hay chưa Ready send Luôn kết thúc, không quan tâm quá MPI_RSEND MPI_IRSEND trình nhận đã kết thúc hay chưa Collective communication cơ chế giao tiếp tập thể, liên quan tới tất cả các tác vụ nằm trong phạm vi của communicator, các kiểu giao tiếp trong cơ chế này (xem Hình 2) gồm có • Broadcast: dữ liệu giống nhau được gửi từ tác vụ gốc (root) đến tất cả các tác vụ khác trong communicator.
- Scatter : các dữ liệu khác nhau được gửi từ tác vụ gốc đến tất cả các tác vụ khác trong communicator.
- Gather : các dữ liệu khác nhau được thu thập bởi tác vụ gốc từ tất cả các tác vụ khác trong communicator.
- Reduce: phương thức này cho phép ta có thể thu thập dữ liệu từ mỗi tác vụ, rút gọn dữ liệu, lưu trữ dữ liệu vào trong một tác vụ gốc hoặc trong tất cả các tác vụ.
- Hình 2: Minh họa các kiểu giao tiếp theo cơ chế tập thể 4.4 Các lệnh truyền thông điệp blocking Một số lệnh thông dụng cho chế độ truyền thông điệp blocking gồm có: MPI_SEND gửi các thông tin cơ bản MPI_SEND (buf,count,datatype,dest,tag,comm,ierr) MPI_RECV nhận các thông tin cơ bản MPI_RECV (buf,count,datatype,source,tag,comm,status,ierr) MPI_SSEND gửi đồng bộ thông tin, lệnh này sẽ chờ cho đến khi thông tin đã được nhận (thông tin được gửi sẽ bị giữ lại cho đến khi bộ đệm của tác vụ gửi được giải phóng để có thể sử dụng lại và tác vụ đích (destination process) bắt đầu nhận thông tin) MPI_SSEND (buf,count,datatype,dest,tag,comm,ierr) 15 Đặng Nguyên Phương Tài liệu nội bộ NMTP MPI_BSEND tạo một bộ nhớ đệm (buffer ) mà dữ liệu được lưu vào cho đến khi được gửi đi, lệnh này sẽ kết thúc khi hoàn tất việc lưu dữ liệu vào bộ nhớ đệm.
- MPI_COMM_WORLD , s t a t , ierr ) e l s e i f ( rank .
- MPI_COMM_WORLD , reqs ( 1.
- MPI_COMM_WORLD , reqs ( 2.
- MPI_COMM_WORLD , reqs ( 3.
- MPI_BARRIER (comm,ierr) Hình 3: Minh họa lệnh rào chắn MPI_BCAST gửi bản sao của bộ đệm có kích thước count từ tác vụ root đến tất cả các tiến trình khác trong cùng một communicator.
- MPI_BCAST (buffer,count,datatype,root,comm,ierr) MPI_SCATTER phân phát giá trị bộ đệm lên tất cả các tác vụ khác, bộ đệm được chia thành sendcnt phần.
- MPI_SCATTER (sendbuf,sendcnt,sendtype,recvbuf,recvcnt,recvtype,root,comm,ierr) MPI_GATHER tạo mới một giá trị bộ đệm riêng cho mình từ các mảnh dữ liệu gộp lại.
- MPI_GATHER (sendbuf,sendcnt,sendtype,recvbuf,recvcnt,recvtype,root,comm,ierr) MPI_ALLGATHER tương tự như MPI_GATHER nhưng sao chép bộ đệm mới cho tất cả các tác vụ.
- MPI_ALLGATHER (sendbuf,sendcnt,sendtype,recvbuf,recvcnt,recvtype,comm,ierr) 18 Đặng Nguyên Phương Tài liệu nội bộ NMTP MPI_REDUCE áp dụng các toán tử rút gọn (tham số op) cho tất cả các tác vụ và lưu kết quả vào một tác vụ duy nhất.
- MPI_ALLREDUCE tương tự như MPI_REDUCE nhưng lưu kết quả vào tất cả các tác vụ.
- MPI_ALLTOALL (sendbuf,sendcnt,sendtype,recvbuf,recvcnt,recvtype,comm,ierr) MPI_SCAN kiểm tra việc thực hiện toán tử rút gọn của các tác vụ.
- endif 26 c a l l MPI_FINALIZE ( ierr ) end 5 Một số ví dụ 5.1 Ví dụ tính số π Trong ví dụ này ta sẽ tiến hành lập trình song song cho phép tính số π.
- Dựa vào công thức phía trên ta có thể dễ dàng nhận ra rằng chỉ có một tham số duy nhất, đó là n, do đó ta sẽ truyền tham số này cho tất cả các tác vụ trong hệ thống thông qua lệnh MPI_BCAST c a l l MPI_BCAST ( n , 1 , MPI_INTEGER , 0 , MPI_COMM_WORLD , ierr ) Mỗi tác vụ con sẽ thực thi công thức xấp xỉ n/numtasks lần, với numtasks là tổng số các tác vụ, do đó vòng lặp sẽ được chỉnh sửa lại f ( a.
- 5 d0 ) 20 Đặng Nguyên Phương Tài liệu nội bộ NMTP sum = sum + f ( x ) 10 c o n t i n u e mypi = h ∗ sum với myid là chỉ số của tác vụ đang thực thi.
- Kết quả chạy từ các tác vụ sẽ được tính tổng và lưu ở tác vụ chủ thông qua lệnh MPI_REDUCE c a l l MPI_REDUCE ( mypi , pi , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , ierr ) Đoạn code chương trình sau khi thêm phần MPI program main use mpi double precision mypi , pi , h, sum , x, f, a 4 integer n, myid , numprocs , i, ierr f ( a.
- abs ( pi − PI25DT ) endif g o t o 10 30 c a l l MPI_FINALIZE ( ierr ) 39 stop end 5.2 Ví dụ nhân ma trận Trong ví dụ này ta sẽ xây dựng một chương trình tính tích của hai ma trận bằng phương pháp tính toán song song.
- Điểm đặc biệt trong ví dụ này là ta sẽ chia các tác vụ (tiến trình) ra làm hai loại: tác vụ chính và tác vụ con, mỗi loại tác vụ sẽ thực hiện những công việc khác nhau.
- Để thuận tiện trong việc ghi nhớ, ta có thể khai báo các tham số biểu diễn cho chỉ số của tác vụ chính (MASTER), và nhãn (tag) để đánh dấu rằng dữ liệu được gửi là từ tác vụ chính (FROM_MASTER) hay tác vụ con (FROM_WORKER).
- parameter ( MASTER = 0 ) parameter ( FROM_MASTER = 1 ) parameter ( FROM_WORKER = 2 ) Các công việc của tác vụ chính gồm có • Khởi tạo các ma trận A và B ! I n i t i a l i z e A and B 2 do 30 i=1, NRA do 30 j=1, NCA a ( i , j.
- j−1) 40 c o n t i n u e • Gửi dữ liệu cho các tác vụ con.
- Trong ví dụ này số cột của ma trận B sẽ được chia thành numworkers phần tương tứng với số lượng tác vụ con.
- dest , mtype , MPI_COMM_WORLD , ierr ) 21 offset = offset + cols 50 c o n t i n u e • Nhận dữ liệu từ tác vụ con ! R e c e i v e r e s u l t s from worker t a s k s mtype = FROM_WORKER 3 do 60 i=1, numworkers source = i c a l l MPI_RECV ( offset , 1 , MPI_INTEGER , source.
- 90 c o n t i n u e Các công việc của tác vụ con gồm có • Nhận dữ liệu từ tác vụ chính 23 Đặng Nguyên Phương Tài liệu nội bộ NMTP ! R e c e i v e matrix data from master t a s k 2 mtype = FROM_MASTER c a l l MPI_RECV ( offset , 1 , MPI_INTEGER , MASTER.
- mtype , MPI_COMM_WORLD , s t a t u s , ierr.
- b(j , k) 100 c o n t i n u e • Trả kết quả về cho tác vụ chính ! Send r e s u l t s back t o master t a s k mtype = FROM_WORKER 3 c a l l MPI_SEND ( offset , 1 , MPI_INTEGER , MASTER , mtype