main(int argc, char **argv)
{
    int i,j;
    int c;
    extern char *optarg;
    int ctrproc;
    int start;
    int proc_size;
    char name[32];

    /*********************************************************************
      Parse the command line
      ********************************************************************/
    collect_info = 1;
    MEMSYS_OFF;                             /* in the initialization phase */
    while ((c = getopt(argc, argv, "p:s:b:BdvH")) != -1) {
        switch(c) {
        case 'p':
            NUM_PROCS = atoi(optarg);
            if (NUM_PROCS < 1) {
                printf("P must be >= 1\n");
                exit(-1);
            }
            break;

        case 's':
            size = atoi(optarg);
            break;

        case 'b':
            BubbleThresh = atoi(optarg);
            break;

        case 'B':
            bubble = 1;
            break;
        case 'd':
            show_array = 1;
            break;
        case 'v':
            verify = 1;
            break;
        default:
            printf("Bad option : %s \n",optarg);
        case 'h':
            printf( "\t\t\tQS - OPTIONS\n");
            printf( "\tp - Number of processors\n");
            printf( "\ts - Size of array\n");
            printf( "\tb - Bubble threshold\n");
            printf( "\tB - Bubble\n");
            printf( "\td - Display output \n");
            printf( "\tv - Verify results \n");
            printf( "\tH - Help\n");
            exit(0);
        }
    }

    StatClearAll();         /* clear the stats */
    /**********************************************************************/
    /* Use shmalloc to allocate memory from the shared address space, also
       use AssociateAddrNode to determine the distribution of the shared
       memory among the various processors */
    /**********************************************************************/
    gMem = (GlobalMemory *) shmalloc(sizeof(GlobalMemory));
    ctrproc = NUM_PROCS/2  + (int)(sqrt((double)NUM_PROCS)/2);
    /* choose a "middle-point" in the mesh network */

    /* associate the task stack variables to a processor easily accessible */
#if !defined(SPATIAL)
    AssociateAddrNode((void *)&(gMem->TaskStackLock),
                      (void *)(&(gMem->NumWaiting)+1),
                      ctrproc>=NUM_PROCS-1? NUM_PROCS-1 :  ctrproc+1,"lock");
    AssociateAddrNode((void *)&(gMem->TaskStackTop),
                      (void *)(&(gMem->TaskStackTop)+1),
                      ctrproc>=NUM_PROCS-1 ? NUM_PROCS-1 : ctrproc,"top");
#endif

    /************** associate the task queue among all processors *********/
    chunk = MAX_TASK_QUEUE / NUM_PROCS;
    for (i=0; i< NUM_PROCS; i++)   {
#if !defined(SPATIAL)
        AssociateAddrNode(&gMem->tasks[i*chunk],
                          &gMem->tasks[(i+1)*chunk],
                          i,"tasks");
#endif
    }
    LocalStackTop = -1;
    FREELOCK(&gMem->TaskStackLock);
    proc_size = (size + NUM_PROCS)/NUM_PROCS;

    /*************** associate the array among all processors **************/
    start = 0;
    strcpy(name,"Array chunks");
    for(i=0; i<NUM_PROCS; i++) {
        printf("going to call Associate address node\n");
#if !defined(SPATIAL)&&!defined(DO_PREF)
        AssociateAddrNode(&gMem->A[start],
                          &gMem->A[start+ proc_size],
                          i, name);
#endif
        start = start+proc_size;
    }

    printf( "QS - OPTIONS\n");
    printf( "\tp - Number of processors \t%d\n", NUM_PROCS);
    printf( "\ts - Size of array\t\t%d\n",size);
    printf( "\tb - Bubble threshold \t\t%d\n",BubbleThresh);
    printf( "\tB - Bubble \t\t\t%d\n",bubble);
    printf( "\td - Display output\t\t%d\n",show_array);
    printf( "\tv - Verify results\t\t%d\n",verify);

    /* The work which the root process has to do */
    whoami=0;
    root_main();                  /* initialization by the root process */
    endphase(phase);              /* end of initialization phase */
    TreeBarInit(&tree,NUM_PROCS); /* initialize tree barrier */

    MEMSYS_ON;

    /********************************************************************/
    /* Forking processes :  Create a process for each of the processors */
    /********************************************************************/

    for(i=0; i<NUM_PROCS-1; i++) {
        if(fork() == 0)     {
            whoami =  getpid();
            LocalStackTop = -1;
            for (i = (whoami+1) * chunk -1; i > whoami * chunk; i--) {
                LocalTaskStack[++LocalStackTop] = i;
            }
            break;
        }
    }

    /******************* Barrier after initialization *******************/
    printf("Before barrier %d\n",whoami);
    TreeBarrier(&tree,whoami);
    printf("Starting Process %d\n",whoami);
    if (whoami == 0)     {
        StatReportAll();
        StatClearAll();
    }

    newphase(++phase);
    Worker();   /**** Call the main procedure which we have to execute ****/
    endphase(phase);

    /**************** Barrier after finishing the sort ******************/
    printf("Coming out of worker %d\n",whoami);
    TreeBarrier(&tree,whoami);
    MEMSYS_OFF;
    if (whoami == 0)     {
        StatReportAll();
        StatClearAll();
    }

    /*************************** Cleanup phase ***************************/
    newphase(++phase);
    if(whoami== 0)     do_cleanup();
    endphase(phase);
    if (whoami == 0)     {
        StatReportAll();
        StatClearAll();
    }
}
Beispiel #2
0
void calpolycoeff(int np,int nf,int si,float fov,float dt,float *wbuff1,float *wbuff0,float *a0,float *a,float *b,float *c, float *chisq, int nn)
  {
  double x, ia, sum_xy,sum_xx,sum_y,sum_x2y,sum_x4, sum_x3y, sum_x6;
  int   offset,off1,i,j;
  float  temp;
  char logfile[255];
  FILE *fp;

    offset = 2*np+2+2*(nf-1)*si+1; /*+2 for writing in imaginary part +1 for real part of spc*/   
    off1 = (2*nf-1)*(si/2);

    sum_xy = 0;
    sum_xx = 0;
    for (i = -np; i<np+1; i++) 
    {
      wbuff0[2*i-1+offset] = wbuff1[2*i+off1];
      wbuff0[2*i+offset] = wbuff1[2*i+off1+1];
    }
    i = 0;
    x = (1.0*i)/np;

fprintf(stderr,"Value of np : %d\n", np);

    sum_y = (double)wbuff0[2*i-1+offset];
    sum_xy = (double)(x*(wbuff0[2*i-1+offset]));
    sum_xx = (x*x);
    sum_x2y = x*sum_xy;
    sum_x4 = (sum_xx*sum_xx);
    sum_x6 = sum_xx*sum_x4;
    sum_x3y = x*sum_x2y;
    j=1;
    while ((j<np+1) && (wbuff0[2*j+offset]>0) && (wbuff0[-2*j+offset]>0))
    {
      i = j;
      x = (1.0*i)/np;
      wbuff0[2*i-1+offset] = newphase(wbuff0[2*(i-1)-1+offset],wbuff0[2*i-1+offset]);
      sum_y = (double)wbuff0[2*i-1+offset]+sum_y;
      sum_xy = (double)(x*(wbuff0[2*i-1+offset]))+sum_xy;
      sum_xx = x*x+sum_xx;
      sum_x2y = (double)(x*x*(wbuff0[2*i-1+offset]))+sum_x2y;
      sum_x4 = x*x*x*x+sum_x4;
      sum_x3y = (double)(x*x*x*wbuff0[2*i-1+offset])+sum_x3y;
      sum_x6 = x*x*x*x*x*x+sum_x6;
      i=-j;
      x = (1.0*i)/np;
      wbuff0[2*i-1+offset] = newphase(wbuff0[2*(i+1)-1+offset],wbuff0[2*i-1+offset]);
      sum_y = (double)wbuff0[2*i-1+offset]+sum_y;
      sum_xy = (double)(x*(wbuff0[2*i-1+offset]))+sum_xy;
      sum_xx = x*x+sum_xx;
      sum_x2y = (double)(x*x*(wbuff0[2*i-1+offset]))+sum_x2y;
      sum_x4 = x*x*x*x+sum_x4;
      sum_x3y = (double)(x*x*x*wbuff0[2*i-1+offset])+sum_x3y;
      sum_x6 = x*x*x*x*x*x+sum_x6;
      j=j+1;
    }
    np=j-1;
    *a0 = (float)((sum_y)/((2*np+1)));
    *a = 0.0;
    *b = 0.0;
    *c = 0.0;

    if (np<minpoints)
    {
      *chisq = 1000.0;
    }
    else
    {
    if (nn>1)
    {
    *a0 = (float)((sum_xx*sum_x2y-sum_y*sum_x4)/((sum_xx*sum_xx)-(2*np+1)*sum_x4));
    *b = (float)((sum_xx*sum_y-(2*np+1)*sum_x2y)/((sum_xx*sum_xx)-(2*np+1)*sum_x4));
     }
    if ((nn<3) && (nn>0))
    {
     *a = (float)(sum_xy)/(sum_xx);
    *c = 0.0;
     }
    if (nn>2) 
    {
     *a = (float)(sum_x3y*sum_x4-sum_xy*sum_x6)/(sum_x4*sum_x4-sum_xx*sum_x6);
     *c = (float)((sum_xy*sum_x4-sum_x3y*sum_xx)/(sum_x4*sum_x4-sum_x6*sum_xx));
    }
    *chisq=0.0;

    for (i = -np; i<np+1; i++) 
    {
      wbuff0[2*i-1+offset+si] = wbuff0[2*i-1+offset]-(*a0+i*(*a)/np+SQR(1.0*i/np)*(*b)+i*(*c)/np*SQR(1.0*i/np));
      *chisq = *chisq+(wbuff0[2*i-1+offset+si]*wbuff0[2*i-1+offset+si]);
/*wbuff0[2*i+offset+si] for writing in imaginary part wbuff0[2*i-1+offset+si] for real part of spc*/
    }
  /*Scaling:
    =======
    for x=-1..1; 
    x:  ((np/si)*SW/(1000*G)) for G = Gradient in [1000Hz/cm], e.g. 1
        i.e. (np*FOV/si)
    nu: 1/(360*T) for T = extra delay in [10ms], hence dt*1e2 e.g. 
  */

    *a = (*a)*(si/(2*fov*np*360e-6*dt*1.0e2));
    *b = (*b)*SQR(si/(2*fov*np))/(360e-6*dt*1.0e2);
    *c = (*c)*si/(2*fov*np*360e-6*dt*1.0e2)*SQR(si/(2*fov*np));
    *a0 = *a0/(360e-6*dt*1.0e2);
    *chisq = sqrt(*chisq)/((360e-6*dt*1.0e2)*(2.0*np+1));
    }

    strcpy(logfile,getenv("vnmruser"));
    strcat(logfile,"/shims/fastmap.log");
    fp = fopen(logfile,"a");
    fprintf(fp,"%+5.1f %+5.2f %+4.2f %+5.3f (%+3.2f) \n",*a0,*a,*b,*c,*chisq);
    fclose(fp);
    fprintf(stderr,"%+5.1f %+5.2f %+4.2f %+5.3f (%+3.2f) \n",*a0,*a,*b,*c,*chisq);
  }/*calpolycoeff*/