/* !-------------------------------------------------------------------------! ! ! ! N A S P A R A L L E L B E N C H M A R K S 3.0 ! ! ! ! J A V A V E R S I O N ! ! ! ! R e s i d ! ! ! !-------------------------------------------------------------------------! ! ! ! Resid implements thread for Resid subroutine of MG benchmark. ! ! ! ! Permission to use, copy, distribute and modify this software ! ! for any purpose with or without fee is hereby granted. We ! ! request, however, that all derived work reference the NAS ! ! Parallel Benchmarks 3.0. This software is provided "as is" ! ! without express or implied warranty. ! ! ! ! Information on NPB 3.0, including the Technical Report NAS-02-008 ! ! "Implementation of the NAS Parallel Benchmarks in Java", ! ! original specifications, source code, results and information ! ! on how to submit new results, is available at: ! ! ! ! http://www.nas.nasa.gov/Software/NPB/ ! ! ! ! Send comments or suggestions to npb@nas.nasa.gov ! ! ! ! NAS Parallel Benchmarks Group ! ! NASA Ames Research Center ! ! Mail Stop: T27A-1 ! ! Moffett Field, CA 94035-1000 ! ! ! ! E-mail: npb@nas.nasa.gov ! ! Fax: (650) 604-3957 ! ! ! !-------------------------------------------------------------------------! ! Translation to Java and MultiThreaded Code ! ! M. Frumkin ! ! M. Schultz ! !-------------------------------------------------------------------------! */ package NPB_JAV.MGThreads; import NPB_JAV.MG; public class Resid extends MGBase{ public int id; public boolean visr; public boolean done=true; public int n1, n2, n3; public int off; int state=0; int start,end,work; double u1[],u2[]; public Resid(MG mg){ Init(mg); u1=new double[nm+1]; u2=new double[nm+1]; setPriority(Thread.MAX_PRIORITY); setDaemon(true); master=mg; } void Init(MG mg){ //initialize shared data num_threads=mg.num_threads; r=mg.r; v=mg.v; u=mg.u; a=mg.a; nm=mg.nm; } public void run(){ for(;;){ synchronized(this){ while(done==true){ try{ wait(); synchronized(master){master.notify();} }catch(InterruptedException ie){} } GetWork(); step(); synchronized(master){done=true; master.notify();} } } } public void step(){ int i3, i2, i1; if(work==0) return; double tmp[]=v; if(visr) tmp=r; for(i3=start;i3<=end;i3++) for(i2=1;i2 - a[1] * ( u(i1-1,i2,i3) + u(i1+1,i2,i3) //c > + u1(i1) ) //c--------------------------------------------------------------------- - a[2] * ( u2[i1] + u1[i1-1] + u1[i1+1] ) - a[3] * ( u2[i1-1] + u2[i1+1] ); } } //c--------------------------------------------------------------------- //c exchange boundary data //c--------------------------------------------------------------------- for(i3=start;i3<=end;i3++) for(i2=1;i2