Chương trỡnh JOR tương tự như Jacobi nhưng khác phần cơng thức tính tốn do cĩ thêm tham số ω.
3.Thuật toỏn SOR
Chương trỡnh viết cho thuật toỏn SOR: #include<stdio.h>
#include<mpi.h> #include<stdlib.h>
#define w 1 /*khai bao tham so ω*/
#define n 256 /* sốđiểm trong của lưới */ #define epsilon 0.0000000001 /* sai số */
int main(int argc, char **argv) {
int rank,size,i,j,k,N,myn;
double *x,*y,*subxnew,*subx,sum,temp,total; MPI_Status status;
KILOBOOKS.COM MPI_Init(&argc,&argv); /* Khởi tạo MPI */ /* Lấy hạng của cỏc tiến trỡnh */ MPI_Comm_rank(MPI_COMM_WORLD,&rank); /* Lấy số cỏc tiến trỡnh */ MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank==0) { N=n*n; /* số phần tử của véc tơ cột x */ x=(double*)malloc(N*sizeof(double));/* x(k+1) */ y=(double*)malloc(N*sizeof(double)); /* x(k) */ myn=N/size; /* số phần tử x trong mỗi bộ xử lớ */ } MPI_Bcast(&myn,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD); /* myn+n phần tử x(k+1) trong cỏc bộ xử lớ khởi tạo giỏ trị =0*/ subx=(double*)malloc((myn+n)*sizeof(double)); for(i=0;i<myn;i++) subx[i]=0; /* myn phần tử x(k+1) trong cỏc bộ xử lớ*/ subxnew=(double*)malloc((myn)*sizeof(double)); do {
/* bộ xử lớ hạng rank gửi n phần tử cho bộ xử lớ hạng rank-1 */ if(rank>0)
KILOBOOKS.COM
/* bộ xử lớ hạng rank nhận n phần tử từ bộ xử lớ hạng rank+1 */ if(rank<size-1)
MPI_Recv(subx+myn+n,n,MPI_DOUBLE,rank+1,rank+1,MPI_COMM_W ORLD,&status);
/* tính subxnew từ subx sử dụng bước 1 thuật tốn */
MPI_Gather(subxnew,myn,MPI_DOUBLE,y,myn,MPI_DOUBLE,0, MPI_COMM_WORLD);
if(rank==0)
/* tớnh x(k+1) từ y theo bước 2 của thuật tốn */ MPI_Scatter(x,myn,MPI_DOUBLE,subxnew,myn,MPI_DOUBLE,0, MPI_COMM_WORLD); /* tớnh sai số */ MPI_Allreduce(&sum,&total,1,MPI_DOUBLE,MPI_SUM, MPI_COMM_WORLD); }
while (total>epsilon); /* lặp khi chưa thoả mĩn sai số */ MPI_Finalize(); /* đĩng mơi trường MPI */
return 0; }
KILOBOOKS.COM
BẢNG CÁC CHỮ VIẾT TẮT
SISD Single Instruction Single Data SIMD Single Instruction Multiple Data MISD Multiple Instruction Single Data MIMD Multiple Instruction Multiple Data CPU Central Processing Unit
UMA Uniform Memory Access NUMA NonUniform Memory Access RAM Random Access Memory
PRAM Parallel Random Access Memory CR Concurent Read
CW Concurent Write ER Exclusive Read EW Exclusive Write
COMA Cache – Only Memory Access
WS Workstation
WSC Workstation Cluster
HPC High Performance Computing TCP Transmission Control Protocol UDP User Datagram Protocol
MPI Message Passing Interface JOR Jacobi Overrelaxation SOR Successive Overrelaxation