Bài giảng lập trình song song MPI trong công nghệ hóa học - Thoại Nam

Tìm hiểu ứng dụng tin học trong công nghệ hóa học với kỹ thuật xử lý song song MPI, tối ưu hóa mô phỏng và tính toán các quá trình hóa học phức tạp.

Chuyên ngành

Công nghệ thông tin

Tác giả

Ẩn danh

Người đăng

Ẩn danh

Thể loại

Bài giảng
58
0
0

Phí lưu trữ

30 Point

Tóm tắt

I. Tổng quan về parallelprocessing 2 mpi trong công nghệ hóa học

Giao thức truyền thông điệp MPI là nền tảng cốt lõi trong tính toán hiệu năng cao. Lĩnh vực công nghệ hóa học hiện đại đòi hỏi xử lý khối lượng dữ liệu khổng lồ. Các mô hình hóa động học phản ứng và cân bằng pha yêu cầu tài nguyên phần cứng vượt trội. Chuẩn MPI cho phép kết nối nhiều bộ vi xử lý làm việc đồng thời trên môi trường bộ nhớ phân tán. Kiến trúc này giúp giải phóng tắc nghẽn tính toán trong máy tính đơn lẻ. Mỗi tiến trình hoạt động độc lập và trao đổi thông tin qua các gói tin chuẩn hóa. Không gian giao tiếp MPI_COMM_WORLD quản lý toàn bộ các tiến trình tham gia. Hàm MPI_Init khởi tạo môi trường thực thi và hàm MPI_Finalize giải phóng tài nguyên hệ thống an toàn. Việc xác định định danh tiến trình qua MPI_Comm_rank và số lượng tiến trình qua MPI_Comm_size tạo tiền đề điều phối tải. Song song hóa bằng MPI đẩy nhanh tiến độ nghiên cứu vật liệu mới. Các quy trình phân tích và thiết kế thiết bị hóa chất được rút ngắn thời gian đáng kể. Đây là công cụ không thể thiếu trong tự động hóa và tối ưu hóa quy trình hóa kỹ thuật.

1.1. Khái niệm và môi trường thực thi cơ bản của chuẩn MPI

Chuẩn MPI định nghĩa giao diện truyền thông điệp giữa các tiến trình độc lập. Môi trường tính toán MPI vận hành trên cụm máy tính liên kết mạng. Hàm MPI_Init bắt buộc phải được gọi đầu tiên để kích hoạt hệ thống. Sau khi khởi động, MPI_Comm_rank cấp phát số định danh duy nhất cho mỗi tiến trình. Hàm MPI_Comm_size trả về tổng số tiến trình đang hoạt động trong nhóm MPI_COMM_WORLD. Nhờ các chỉ số này, thuật toán hóa học dễ dàng phân bổ ma trận tính toán. Khi hoàn tất chu trình tính toán, MPI_Finalize đóng toàn bộ luồng truyền thông an toàn. Trường hợp xảy ra lỗi nghiêm trọng, hàm MPI_Abort sẽ dừng tức thì mọi tiến trình để bảo vệ tài nguyên hệ thống.

1.2. Vai trò của xử lý song song đối với kỹ thuật hóa học

Các bài toán kỹ thuật hóa học thường liên quan đến hệ phương trình vi phân phi tuyến. Phương pháp mô phỏng số truyền thống đòi hỏi nhiều tuần tính toán liên tục. Kỹ thuật song song hóa MPI chia nhỏ miền tính toán thành các lưới không gian nhỏ hơn. Mỗi nút mạng xử lý một phần dữ liệu nhiệt độ, nồng độ và áp suất của lò phản ứng. Sự phối hợp song song giảm thiểu thời gian mô phỏng xuống còn vài giờ. Kỹ sư dễ dàng khảo sát nhiều kịch bản vận hành nhà máy khác nhau. Độ chính xác của các mô hình động học phân tử cũng tăng lên đáng kể. Ứng dụng này giúp tiết kiệm chi phí thử nghiệm thực nghiệm và nâng cao độ an toàn vận hành thiết bị hóa chất.

II. Phân tích truyền thông điểm điểm của parallelprocessing 2 mpi

Truyền thông điểm-điểm đóng vai trò hạt nhân trong việc đồng bộ hóa dữ liệu giữa hai tiến trình riêng biệt. Trong mô phỏng hóa học, việc trao đổi giá trị biên giữa các phân vùng lưới tính toán diễn ra liên tục. Chuẩn MPI phân chia rõ ràng giữa truyền thông chặn và không chặn. Cơ chế truyền chặn sử dụng hàm MPI_Send và MPI_Recv giữ luồng điều khiển cho đến khi bộ đệm sẵn sàng tái sử dụng. Cách tiếp cận này đảm bảo an toàn dữ liệu nhưng dễ gây ra hiện tượng nghẽn đường truyền nếu không cân bằng tải tốt. Ngược lại, truyền thông không chặn với MPI_Isend và MPI_Irecv cho phép tiến trình tiếp tục tính toán trong khi việc gửi nhận dữ liệu diễn ra ngầm. Mỗi thông điệp gửi đi đều được đóng gói kèm phong bì thư chứa thông tin nguồn, đích, nhãn định danh và không gian truyền thông. Việc kiểm soát cấu trúc phong bì này ngăn chặn hiện tượng lẫn lộn dữ liệu giữa các biến trạng thái phản ứng.

2.1. Cơ chế truyền chặn và không chặn trong MPI

Truyền chặn ngưng thực thi chương trình cho đến khi hoàn tất thao tác bộ đệm. Thao tác MPI_Send chỉ trở về khi tài nguyên gửi được giải phóng hoàn toàn. Tương tự, MPI_Recv yêu cầu nhận đủ dữ liệu mới chuyển tiếp lệnh tiếp theo. Ngược lại, truyền không chặn với MPI_Isend và MPI_Irecv trả về quyền điều khiển ngay lập tức. Lập trình viên sử dụng hàm MPI_Wait để xác nhận trạng thái hoàn tất truyền thông. Cấu trúc MPI_Status lưu trữ thông tin chi tiết về nguồn gửi thực tế và nhãn tin nhắn. Hàm MPI_Get_count hỗ trợ đếm số phần tử dữ liệu nhận được. Kỹ thuật không chặn giúp chồng lấp thời gian tính toán và thời gian giao tiếp mạng hiệu quả.

2.2. Các chế độ truyền thông tiêu chuẩn bộ đệm và đồng bộ

Chuẩn MPI hỗ trợ bốn chế độ truyền thông dữ liệu cơ bản. Chế độ tiêu chuẩn tự động lựa chọn giữa lưu đệm hoặc đồng bộ tùy kích thước gói tin. Chế độ có bộ đệm cho phép hoàn thành lệnh gửi bất kể lệnh nhận tương ứng đã xuất hiện hay chưa. Chế độ đồng bộ chỉ kết thúc khi tiến trình nhận bắt đầu tiếp nhận gói tin. Cuối cùng, chế độ sẵn sàng đòi hỏi lệnh nhận phải được kích hoạt trước khi lệnh gửi khởi chạy. Việc lựa chọn sai chế độ dễ dẫn đến lỗi tắc nghẽn nghiêm trọng khi mô phỏng phản ứng phức tạp. Cần phân tích đặc thù luồng dữ liệu trước khi chọn chế độ phù hợp.

III. Giải pháp truyền thông tập thể trong parallelprocessing 2 mpi

Truyền thông tập thể cung cấp giải pháp tối ưu cho việc điều phối dữ liệu trên toàn bộ nhóm tiến trình. Trong các bài toán hóa học, các phép tính tổng hợp như tính tổng năng lượng hệ thống hay nhiệt lượng phản ứng cần thu gom từ mọi nút tính toán. Hàm MPI_Gather tập hợp dữ liệu từ từng tiến trình thành viên về tiến trình gốc theo đúng thứ tự định danh. Đối với các bài toán có kích thước dữ liệu phân tán không đồng đều, hàm MPI_Gatherv mở rộng khả năng tiếp nhận thông qua các mảng xác định dung lượng và độ dịch chuyển bộ đệm. Đặc biệt, hàm MPI_Reduce kết hợp cả việc thu thập dữ liệu lẫn thực hiện các phép toán thu gọn như tìm giá trị cực đại, cực tiểu hoặc tính tổng nồng độ. Tất cả các tiến trình trong nhóm liên lạc bắt buộc phải cùng gọi hàm tập thể để duy trì tính toàn vẹn của thuật toán. Sự chuẩn hóa này loại bỏ hoàn toàn các lỗi sai lệch dữ liệu phân tán.

3.1. Kỹ thuật thu thập dữ liệu với MPI_Gather và MPI_Gatherv

Hàm MPI_Gather gom các mảng dữ liệu có kích thước bằng nhau từ các tiến trình về tiến trình gốc. Dữ liệu nhận được sắp xếp tuần tự theo thứ tự rank của từng tiến trình gửi. Khi mô phỏng các vùng biên phản ứng có số nút lưới không đều, MPI_Gatherv là giải pháp tối ưu hơn. Hàm này sử dụng mảng recvcounts để định lượng phần tử nhận từ mỗi nguồn. Đồng thời mảng displs xác định vị trí dịch chuyển tương đối trong bộ đệm nhận. Điều này giúp tối ưu hóa bộ nhớ và truyền tải dữ liệu linh hoạt. Tiến trình gốc nhận đầy đủ dữ liệu cấu trúc phức tạp mà không làm phát sinh dữ liệu rác.

3.2. Tối ưu tính toán tổng hợp bằng hàm thu gọn MPI_Reduce

Hàm MPI_Reduce thực hiện đồng thời hai thao tác gom dữ liệu và tính toán thống kê. Các toán tử tích hợp sẵn bao gồm MPI_SUM tính tổng, MPI_MAX tìm giá trị lớn nhất và MPI_MIN tìm giá trị nhỏ nhất. Trong công nghệ hóa học, toán tử này ứng dụng trực tiếp để tính tổng entanpi phản ứng của toàn hệ thống. Dữ liệu từ các tiến trình con được tổng hợp song song theo mô hình cây phân cấp. Thuật toán phân tán giảm độ phức tạp tính toán từ tuyến tính xuống mức logarit. Tiến trình gốc nhận kết quả cuối cùng với độ trễ thấp nhất. Nhờ vậy, hiệu suất toàn hệ thống được cải thiện vượt bậc so với việc xử lý tuần tự thông thường.

IV. Ứng dụng parallelprocessing 2 mpi trong ngành công nghệ hóa học

Ứng dụng xử lý song song chuẩn MPI tạo bước đột phá trong nghiên cứu và sản xuất hóa chất công nghiệp. Khả năng mô phỏng động lực học chất lưu tính toán giúp thiết kế buồng đốt và tháp chưng cất đạt hiệu suất tối ưu. Các hiện tượng truyền nhiệt và truyền khối đa pha được mô hình hóa chính xác ở quy mô vi mô lẫn vĩ mô. Việc phân tán dữ liệu thông qua các hàm MPI_Send, MPI_Recv và MPI_Reduce cho phép giải quyết các bài toán tối ưu hóa quy trình cực lớn trong thời gian thực. Các viện nghiên cứu và doanh nghiệp hóa chất giảm thiểu tối đa chi phí xây dựng mô hình thử nghiệm thực địa. Song song hóa tính toán còn đảm bảo độ an toàn cao khi đánh giá nguy cơ phản ứng tỏa nhiệt quá mức. Nắm vững kỹ thuật lập trình song song MPI là yêu cầu trọng tâm của nhân lực tin học hóa ứng dụng hiện đại.

4.1. Mô phỏng động lực học chất lưu và truyền nhiệt đa pha

Mô phỏng chất lưu trong thiết bị hóa học đòi hỏi giải hệ phương trình Navier-Stokes trên hàng triệu nút lưới. Phân vùng miền tính toán với MPI chia nhỏ thể tích buồng phản ứng cho các vi xử lý riêng biệt. Các điều kiện biên áp suất và vận tốc dòng chảy được trao đổi liên tục qua các gói tin MPI_Isend và MPI_Irecv. Kỹ thuật này giúp phát hiện các điểm xoáy chết và vùng tích tụ nhiệt cục bộ bên trong đường ống. Thời gian tính toán rút ngắn cho phép kỹ sư khảo sát nhiều phương án thiết kế cánh khuấy. Kết quả mô phỏng hỗ trợ cải tiến cấu trúc thiết bị và giảm tổn thất năng lượng đáng kể.

4.2. Tối ưu hóa điều khiển lò phản ứng và cân bằng hóa học

Hệ thống điều khiển tối ưu hóa lò phản ứng liên tục yêu cầu xử lý dữ liệu động học tức thời. Cụm máy tính song song sử dụng MPI phân tích các phương trình vi phân cân bằng pha và tốc độ sinh nhiệt. Hàm MPI_Reduce tổng hợp dữ liệu nhiệt độ và áp suất từ nhiều cảm biến ảo để đưa ra quyết định điều khiển chuẩn xác. Khả năng tính toán song song nhanh chóng giúp dự báo sớm các nguy cơ mất kiểm soát nhiệt phản ứng. Nhờ vậy, nhà máy vận hành ổn định tại điểm công suất tối đa mà vẫn bảo đảm an toàn. Lợi ích kinh tế và tính khả thi trong thực tiễn được nâng cao rõ rệt.

Tóm tắt và mô tả trên trang này được tạo với sự hỗ trợ của AI. Nếu bạn thấy nội dung không chính xác hoặc có vấn đề, vui lòng Báo lỗi nội dung.

05/06/2026
Tin học ứng dụng trong công nghệ hóa học parallelprocessing 2 mpi

Trích đoạn nội dung tài liệu

MPI THOAI NAM Outline  Communication modes  MPI – Message Passing Interface Standard TERMs (1)  Blocking If return from the procedure indicates the user is allowed to reuse resources specified in the call  Non-blocking If the procedure may return before the operation completes, and before the user is allowed to reuse resources specified in the call  Collective If all processes in a process group need to invoke the procedure  Message envelope Information used to distinguish messages and selectively receive them <source, destination, tag, communicator> TERMs (2)  Communicator – The communication context for a communication operation – Messages are always received within the context they were sent – Messages sent in different contexts do not interfere – MPI_COMM_WORLD  Process group – The communicator specifies the set of processes that share this communication context. – This process group is ordered and processes are identified by their rank within this group MPI  Environment  Point-to-point communication  Collective communication  Derived data type  Group management MPI P0 P1 P2 P3 P4 Daemon Daemon Daemon P0 P1 P2 P3 P4 Environment  MPI_INIT  MPI_COMM_SIZE  MPI_COMM_RANK  MPI_FINALIZE  MPI_ABORT MPI_Init  Usage – int MPI_Init( int* argc_ptr, /* in */ char** argv_ptr[] ); /* in */  Description – Initialize MPI – All MPI programs must call this routines once and only once before any other MPI routines MPI_Finalize  Usage int MPI_Finalize (void);  Description – Terminates all MPI processing – Make sure this routine is the last MPI call. – All pending communications involving a process have completed before the process calls MPI_FINALIZE MPI_Comm_Size  Usage int MPI_Comm_size( MPI_Comm comm, /* in */ int* size ); /* out */  Description – Return the number of processes in the group associated with a communicator MPI_Comm_Rank  Usage – int MPI_Comm_rank ( MPI_Comm comm,/* in */ int* rank ); /* out */  Description – Returns the rank of the local process in the group associated with a communicator – The rank of the process that calls it in the range from 0 … size - 1 MPI_Abort  Usage – int MPI_Abort( MPI_Comm comm, /* in */ int errorcode ); /* in */  Description – Forces all processes of an MPI job to terminate Simple Program #include “mpi.h” int main( int argc, char* argv[] ) { int rank; int nproc; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); /* write codes for you */ MPI_Finalize(); } Point-to-Point Communication  MPI_SEND  MPI_RECV  MPI_ISEND  MPI_IRECV  MPI_WAIT  MPI_GET_COUNT Communication Modes in MPI (1)  Standard mode – It is up to MPI to decide whether outgoing messages will be buffered – Non-local operation – Buffered or synchronous?  Buffered(asynchronous) mode – A send operation can be started whether or not a matching receive has been posted – It may complete before a matching receive is posted – Local operation Communication Modes in MPI (2)  Synchronous mode – A send operation can be started whether or not a matching receive was posted – The send will complete successfully only if a matching receive was posted and the receive operation has started to receive the message – The completion of a synchronous send not only indicates that the send buffer can be reused but also indicates that the receiver has reached a certain point in its execution – Non-local operation Communication Modes in MPI (3)  Ready mode – A send operation may be started only if the matching receive is already posted – The completion of the send operation does not depend on the status of a matching receive and merely indicates the send buffer can be reused – EAGER_LIMIT of SP system MPI_Send  Usage int MPI_Send( void* buf, /* in */ int count, /* in */ MPI_Datatype datatype, /* in */ int dest, /* in */ int tag, /* in */ MPI_Comm comm ); /* in */  Description – Performs a blocking standard mode send operation – The message can be received by either MPI_RECV or MPI_IRECV MPI_Recv  Usage int MPI_Recv( void* buf, /* out */ int count, /* in */ MPI_Datatype datatype, /* in */ int source, /* in */ int tag, /* in */ MPI_Comm comm, /* in */ MPI_Status* status ); /* out */  Description – Performs a blocking receive operation – The message received must be less than or equal to the length of the receive buffer – MPI_RECV can receive a message sent by either MPI_SEND or MPI_ISEND Sample Program for Blocking Operations (1) #include “mpi.h” int main( int argc, char* argv[] ) { int rank, nproc; int isbuf, irbuf; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); Sample Program for Blocking Operations (2) if(rank == 0) { isbuf = 9; MPI_Send( &isbuf, 1, MPI_INTEGER, 1, TAG, MPI_COMM_WORLD); } else if(rank == 1) { MPI_Recv( &irbuf, 1, MPI_INTEGER, 0, TAG, MPI_COMM_WORLD, &status); printf( “%d\n”, irbuf ); } MPI_Finalize(); } MPI_Isend  Usage int MPI_Isend( void* buf, /* in */ int count, /* in */ MPI_Datatype datatype, /* in */ int dest, /* in */ int tag, /* in */ MPI_Comm comm, /* in */ MPI_Request* request ); /* out */  Description – Performs a nonblocking standard mode send operation – The send buffer may not be modified until the request has been completed by MPI_WAIT or MPI_TEST – The message can be received by either MPI_RECV or MPI_IRECV. MPI_Irecv (1)  Usage int MPI_Irecv( void* buf, /* out */ int count, /* in */ MPI_Datatype datatype, /* in */ int source, /* in */ int tag, /* in */ MPI_Comm comm, /* in */ MPI_Request* request ); /* out */ MPI_Irecv (2)  Description – Performs a nonblocking receive operation – Do not access any part of the receive buffer until the receive is complete – The message received must be less than or equal to the length of the receive buffer – MPI_IRECV can receive a message sent by either MPI_SEND or MPI_ISEND MPI_Wait  Usage – int MPI_Wait( MPI_Request* request, /* inout */ MPI_Status* status ); /* out */  Description – Waits for a nonblocking operation to complete – Information on the completed operation is found in status.

– If wildcards were used by the receive for either the source or tag, the actual source and tag can be retrieved by status->MPI_SOURCE and status->MPI_TAG MPI_Get_count  Usage – int MPI_Get_count( MPI_Status status, /* in */ MPI_Datatype datatype, /* in */ int* count ); /* out */  Description – Returns the number of elements in a message – The datatype argument and the argument provided by the call that set the status variable should match Sample Program for Non-Blocking Operations (1) #include “mpi.h” int main( int argc, char* argv[] ) { int rank, nproc; int isbuf, irbuf, count; MPI_Request request; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if(rank == 0) { isbuf = 9; MPI_Isend( &isbuf, 1, MPI_INTEGER, 1, TAG, MPI_COMM_WORLD, &request ); Sample Program for Non-Blocking Operations (2) } else if (rank == 1) { MPI_Irecv( &irbuf, 1, MPI_INTEGER, 0, TAG, MPI_COMM_WORLD, &request); MPI_Wait(&request, &status); MPI_Get_count(&status, MPI_INTEGER, &count); printf( “irbuf = %d source = %d tag = %d count = %d\n”, irbuf, status.MPI_SOURCE, status.MPI_TAG, count); } MPI_Finalize(); } Collective Operations  MPI_BCAST  MPI_SCATTER  MPI_SCATTERV  MPI_GATHER  MPI_GATHERV  MPI_ALLGATHER  MPI_ALLGATHERV  MPI_ALLTOALL MPI_Bcast (1)  Usage – int MPI_Bcast( void* buffer, /* inout */ int count, /* in */ MPI_Datatype datatype, /* in */ int root, /* in */ MPI_Comm comm); /* in */  Description – Broadcasts a message from root to all processes in communicator – The type signature of count, datatype on any process must be equal to the type signature of count, datatype at the root MPI_Bcast (2) MPI_Scatter  Usage int MPI_Scatter( void* sendbuf, /* in */ int sendcount, /* in */ MPI_Datatype sendtype, /* in */ void* recvbuf, /* out */ int recvcount, /* in */ MPI_Datatype recvtype, /* in */ int root, /* in */ MPI_Comm comm); /* in */  Description – Distribute individual messages from root to each process in communicator – Inverse operation to MPI_GATHER Example of MPI_Scatter (1) #include “mpi.h” int main( int argc, char* argv[] ) { int i; int rank, nproc; int isend[3], irecv; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); Example of MPI_Scatter (2) if(rank == 0) { for(i=0; i<nproc; i++) isend(i) = i+1; } MPI_Scatter( isend, 1, MPI_INTEGER, irecv, 1, MPI_INTEGER, 0, MPI_COMM_WORLD); printf(“irecv = %d\n”, irecv); MPI_Finalize(); } Example of MPI_Scatter (3) MPI_Scatterv  Usage int MPI_Scatterv( void* sendbuf, /* in */ int* sendcounts, /* in */ int* displs, /* in */ MPI_Datatype sendtype, /* in */ void* recvbuf, /* in */ int recvcount, /* in */ MPI_Datatype recvtype, /* in */ int root, /* in */ MPI_Comm comm); /* in */  Description – Distributes individual messages from root to each process in communicator – Messages can have different sizes and displacements Example of MPI_Scatterv(1) #include “mpi.h” int main( int argc, char* argv[] ) { int i; int rank, nproc; int iscnt[3] = {1,2,3}, irdisp[3] = {0,1,3}; int isend[6] = {1,2,2,3,3,3}, irecv[3]; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); Example of MPI_Scatterv(2) ircnt = rank + 1; MPI_Scatterv( isend, iscnt, idisp, MPI_INTEGER, irecv, ircnt, MPI_INTEGER, 0, MPI_COMM_WORLD); printf(“irecv = %d\n”, irecv); MPI_Finalize(); } MPI_Gather  Usage int MPI_Gather( void* sendbuf, /* in */ int sendcount, /* in */ MPI_Datatype sendtype, /* in */ void* recvbuf, /* out */ int recvcount, /* in */ MPI_Datatype recvtype, /* in */ int root, /* in */ MPI_Comm comm ); /* in */  Description – Collects individual messages from each process in communicator to the root process and store them in rank order Example of MPI_Gather (1) #include “mpi.h” int main( int argc, char* argv[] ) { int i; int rank, nproc; int isend, irecv[3]; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); Example of MPI_Gather (2) isend = rank + 1; MPI_Gather( &isend, 1, MPI_INTEGER, irecv, 1, MPI_INTEGER, 0, MPI_COMM_WORLD); if(rank == 0) { for(i=0; i<3; i++) printf(“irecv = %d\n”, irecv[i]); MPI_Finalize(); } MPI_Gather MPI_Gatherv  Usage int MPI_Gatherv( void* sendbuf, /* in */ int sendcount, /* in */ MPI_Datatype sendtype, /* in */ void* recvbuf, /* out */ int* recvcount, /* in */ int* displs, /* in */ MPI_Datatype recvtype, /* in */ int root, /* in */ MPI_Comm comm ); /* in */  Description – Collects individual messages from each process in communicator to the root process and store them in rank order Example of MPI_Gatherv (1) #include “mpi.h” int main( int argc, char* argv[] ) { int i; int rank, nproc; int isend[3], irecv[6]; int ircnt[3] = {1,2,3}, idisp[3] = {0,1,3}; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &nproc ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); Example of MPI_Gatherv (2) for(i=0; i<rank; i++) isend[i] = rank + 1; iscnt = rank + 1; MPI_Gatherv( isend, iscnt, MPI_INTEGER, irecv, ircnt, idisp, MPI_INTEGER, 0, MPI_COMM_WORLD); if(rank == 0) { for(i=0; i<6; i++) printf(“irecv = %d\n”, irecv[i]); } MPI_Finalize(); } MPI_Reduce (1)  Usage int MPI_Reduce( void* sendbuf, /* in */ void* recvbuf, /* out */ int count, /* in */ MPI_Datatype datatype, /* in */ MPI_Op op, /* in */ int root, /* in */ MPI_Comm comm); /* in */

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ