code example
PVM parallel virtual machine
RapidMind Multi-Core Development Platform

#include "pvm3.h"
#include <rapidmind/platform.hpp>
using namespace rapidmind;


int main(int argc, char *argv[]) {
  int n = ...;
  if (pvm_parent() == PvmNoParent) {
  #define N (4)
  int tid[N];
  pvm_spawn("program", argv, PvmTaskDefault, (char*)0, N, &tid[0]);
  } else {
  int mytid = pvm_mytid();
  int *tids, me = -1;
  int ntids = pvm_siblings(&tids);
  for (int i=0; i<ntids; ++i)
   if ( tids[i] == mytid) {
    me = i;
    break;
   }
  int p_left = -1, p_right = -1;
  if (me > 0)
    p_left = tids[me-1];
  if (me < ntids-1)
    p_right = tids[me+1];
  int n_local0 = 1 + (me * (n-1)) / ntids;
  int n_local1 = 1 + ((me+1) * (n-1)) / ntids;
  pvm_joingroup("worker");   rapidmind::init();
  // allocate only local part + ghost zone of the arrays x,y
  float *x, *y;
  Array<1, Value1f> xr(n_local1 - n_local0 + 2);
  Array<1, Value1f> yr(n_local1 - n_local0 + 2);
  x = xr.write_data();
  y = yr.write_data();
  x -= (n_local0 - 1);
  y -= (n_local0 - 1);

  ... // fill x, y

  // fill ghost zone
  if (p_left != -1) {
   pvm_initsend(PvmDataDefault);
   pvm_pkfloat(&y[n_local0], 1, 1);
   int msgtag = 1;
   pvm_send(p_left, msgtag);
  }
  if (p_right != -1) {
   int msgtag = 1;
   pvm_recv(p_right, msgtag);
   pvm_upkfloat(&y[n_local1], 1, 1);
   pvm_initsend(PvmDataDefault);
   pvm_pkfloat(&y[n_local1-1], 1, 1);
   msgtag = 2;
   pvm_send(p_right, msgtag);
  }
  if (p_left != -1) {
   int msgtag = 2;
   pvm_recv(p_left, msgtag);
   pvm_upkfloat(&y[n_local0-1], 1, 1);
  }

  Program add3 = RM_BEGIN {
   In<Value1f> a;
   In<Value1f> b;
   In<Value1f> c;
   Out<Value1f> d;
   d = a + (b + c) * .5;
  } RM_END;
 
  Program add2 = RM_BEGIN {
   In<Value1f> a;
   In<Value1f> b;
   Out<Value1f> c;
   c = a + b;
  } RM_END;
 
  Program sqr = RM_BEGIN {
   In<Value1f> a;
   Out<Value1f> b;
   b = a * a;
  } RM_END;
 
  Array<1, Value1f> x0 = add3(slice(xr,1,n_local1-n_local0),
   offset(yr,2), take(yr,n_local1-n_local0));
  xr = x0;
  Array<1, Value1f> er = reduce(add2,
   sqr(slice(yr,1,n_local1-n_local0));
  float e = *er.read_data();

  int msgtag = 3;
  pvm_reduce(PvmSum, &e, 1, PVM_FLOAT, msgtag, "worker", tids[0]);
  msgtag = 4;
  if (me==0) {
   pvm_initsend(PvmDataDefault);
   pvm_pkfloat(&e, 1, 1);
   pvm_bcast("worker", msgtag);
  } else {
   pvm_recv(tids[0], msgtag);
   pvm_upkfloat(&e, 1, 1);
  }

  ... // output x, e

  x += (n_local0 - 1);
  y += (n_local0 - 1);
  }
  pvm_exit();
  return 0;
}

[start] [references] [download] [install]