GIDForums  

Go Back   GIDForums > Computer Programming Forums > C++ Forum
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

 
 
Thread Tools Search this Thread Rate Thread
  #1  
Old 03-May-2006, 05:03
eclipt eclipt is offline
New Member
 
Join Date: Dec 2005
Posts: 5
eclipt is on a distinguished road
Question

MPI - linear pipeline solution for jacobi iteration


hello

i have a problem on how to write 2 parallel code by using MPI programming with c/c++ to solve a system of linear equation by using jacobi and gauss-seidel iteration method. and it is using pipelining.

here is sample code of an equation solve by using pipeline:



F = a0x0 + a1x1 + a2x2 …….+ k + an-1xn-1


CPP / C++ / C Code:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#define n 100

void main(int argc,char** argv) {

int my_id,i,data[n],a,p,F,x,Tx;

MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&my_id);
MPI_Comm_size(MPI_COMM_WORLD,&p);

if (my_id==0) {
x=rand()%5;
	
for (i=0;i<p;i++) {
		data[i]=rand()%5;
		MPI_Send(&data[i],1,MPI_INT,I,0,MPI_COMM_WORLD);
		MPI_Send(&x,1,MPI_INT,i,0,MPI_COMM_WORLD);
	}
	
}
	
MPI_Recv(&a,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
MPI_Recv(&x,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);

if (my_id==0) {
F=a;
x=1;

MPI_Send(&F,1,MPI_INT,1,0,MPI_COMM_WORLD);
MPI_Send(&x,1,MPI_INT,1,0,MPI_COMM_WORLD);

}

if (my_id>0) {
MPI_Recv(&F,1,MPI_INT,my_id-1,0,MPI_COMM_WORLD,&status);
MPI_Recv(&Tx,1,MPI_INT,my_id-1,0,MPI_COMM_WORLD,&status);


x=Tx*x;
F=F+a*x;

MPI_Send(&F,1,MPI_INT,(my_id+1)%p,0,MPI_COMM_WORLD);
MPI_Send(&x,1,MPI_INT,(my_id+1)%p,0,MPI_COMM_WORLD);
}

if (my_id==0) {
MPI_Recv(&F,1,MPI_INT,p-1,0,MPI_COMM_WORLD,&status);
printf("F= %d\n",F);
}

MPI_Finalize();

}


so how can i modified this code so that
i can do the pipeline jacobi iteration and pipeline gauss-seidel iteration

assuming the equation is like

a11x1 + a12x2 + … + a1nxn = b1;
a21x1 + a22x2 + … + a2nxn = b2;
. .
. .
. .
an1x1 + an2x2 + … + annxn = bn



for the jacobi iteration :

suppose that one process is allocated for each unknown ( p=n)
and each process iterate the same number of time.on each iteration the newly computed values of the unknow will need to be broadcast to all other process.
the parallel algorithm should be like this

CPP / C++ / C Code:
x[i] = b [i]    /*initialize unknown
for (iteration =0; iteration<limit; iteration++){ 
    sum = -a[i][i] * x[i];
    for (j = 0; j < n; j++)   /* compute summation */
           sum = sum + a[i][j] * x[j];
    new_x[i] = (b[i] - sum) / a[i][i];   /*compute unknown*/
    broadcast_receive (xnew[i]);   /*broadcast value*/
    global_barrier ();     /* wait for all process */
}

an alternative simple solution is to return to basic send() and recv() , for broadcast_receive(); that is process i might have:

CPP / C++ / C Code:
for (j=0; j<n; j++) if (i !=j) send (&x[i], Pj);
           for (j=0; j<n; j++) if (i !=j) send (&x[j], Pj); 



i need to modify this sequential code for gauss-seidel so that in can be done in parallel

CPP / C++ / C Code:
for (i = 0; i < n -1; i++) /*for each row except last*/
                  for (j = i+1; j<n; j++){ /* step through subsequent row*/
                     m = a[j] [i]/a[i][i]; /*compute multiplier*/
                     for (k= i; k<n; k++) /*modify last n-i-1 element of row j */
                            a [j][k] = a[j][k] - a[i][k] * m ;
                     b[j] = b[j] - b[i] *m; /* modify right side */ 



The master process (rank 0) accepts the size of the system and reads the coefficients a’s
and b’s. Then, it will distribute them to the corresponding slave processes. The master
process should collect the final solution from the slave processes and display

i wish if there is a solution for this problem
Last edited by LuciWiz : 03-May-2006 at 05:15. Reason: Please insert your C++ code between [c++] & [/c++] tags
 
 

Recent GIDBlogAccepted for Ph.D. program by crystalattice

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Network Sites: GIDNetwork · GIDWebHosts · GIDSearch · Learning Journal by J de Silva, The

All times are GMT -6. The time now is 21:07.


vBulletin, Copyright © 2000 - 2009, Jelsoft Enterprises Ltd.