Changes between Version 20 and Version 21 of DRM4G/Tutorial


Ignore:
Timestamp:
Jun 26, 2016 7:43:28 PM (6 years ago)
Author:
carlos
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DRM4G/Tutorial

    v20 v21  
    186186= User Scenarios =
    187187
     188In this section it will be described how to take advantage of DRM4G to calculate the number Pi.
     189
    188190== Single Jobs ==
    189191
     192=== Code ===
     193{{{
     194  #include <stdio.h>
     195  #include <string.h>
     196 
     197  int main (int argc, char** args)
     198  {
     199    int task_id;
     200    int total_tasks;
     201    long long int n;
     202    long long int i;
     203 
     204    double l_sum, x, h;
     205 
     206    task_id = atoi(args[1]);
     207    total_tasks = atoi(args[2]);
     208    n = atoll(args[3]);
     209 
     210    fprintf(stderr, "task_id=%d total_tasks=%d n=%lld\n", task_id, total_tasks, n);
     211 
     212    h = 1.0/n;
     213 
     214    l_sum = 0.0;
     215 
     216    for (i = task_id; i < n; i += total_tasks)
     217    {
     218      x = (i + 0.5)*h;
     219      l_sum += 4.0/(1.0 + x*x);
     220    }
     221 
     222    l_sum *= h;
     223 
     224    printf("%0.12g\n", l_sum);
     225 
     226    return 0;
     227  }
     228}}}
     229
    190230== Array Jobs ==
    191231
    192232== MPI Jobs ==
    193233
     234=== Code ===
     235
     236{{{
     237  #include "mpi.h"
     238  #include <stdio.h>
     239  #include <math.h>
     240 
     241  int main( int argc, char *argv[])
     242  {
     243      int done = 0, n, myid, numprocs, i;
     244      double PI25DT = 3.141592653589793238462643;
     245      double mypi, pi, h, sum, x;
     246      double startwtime = 0.0, endwtime;
     247      int  namelen;
     248      char processor_name[MPI_MAX_PROCESSOR_NAME];
     249 
     250      MPI_Init(&argc,&argv);
     251      MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
     252      MPI_Comm_rank(MPI_COMM_WORLD,&myid);
     253      MPI_Get_processor_name(processor_name,&namelen);
     254 
     255      printf("Process %d on %s\n", myid, processor_name);
     256 
     257      n = 100000000;
     258 
     259      startwtime = MPI_Wtime();
     260 
     261      h   = 1.0 / (double) n;
     262      sum = 0.0;
     263      for (i = myid + 1; i <= n; i += numprocs)
     264      {
     265          x = h * ((double)i - 0.5);
     266          sum += 4.0 / (1.0 + x*x);
     267      }
     268      mypi = h * sum;
     269 
     270      MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
     271 
     272      if (myid == 0)
     273      {
     274          printf("pi is approximately %.16f, Error is %.16f\n",
     275                 pi, fabs(pi - PI25DT));
     276          endwtime = MPI_Wtime();
     277          printf("wall clock time = %f\n", endwtime-startwtime);
     278      }
     279 
     280      MPI_Finalize();
     281 
     282      return 0;
     283  }
     284}}}