~ubuntu-branches/ubuntu/saucy/nwchem/saucy

« back to all changes in this revision

Viewing changes to src/tools/ga-4-3/examples/armci/perf/perf_aggr.c

  • Committer: Package Import Robot
  • Author(s): Michael Banck, Michael Banck, Daniel Leidert
  • Date: 2012-02-09 20:02:41 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20120209200241-jgk03qfsphal4ug2
Tags: 6.1-1
* New upstream release.

[ Michael Banck ]
* debian/patches/02_makefile_flags.patch: Updated.
* debian/patches/02_makefile_flags.patch: Use internal blas and lapack code.
* debian/patches/02_makefile_flags.patch: Define GCC4 for LINUX and LINUX64
  (Closes: #632611 and LP: #791308).
* debian/control (Build-Depends): Added openssh-client.
* debian/rules (USE_SCALAPACK, SCALAPACK): Removed variables (Closes:
  #654658).
* debian/rules (LIBDIR, USE_MPIF4, ARMCI_NETWORK): New variables.
* debian/TODO: New file.
* debian/control (Build-Depends): Removed libblas-dev, liblapack-dev and
  libscalapack-mpi-dev.
* debian/patches/04_show_testsuite_diff_output.patch: New patch, shows the
  diff output for failed tests.
* debian/patches/series: Adjusted.
* debian/testsuite: Optionally run all tests if "all" is passed as option.
* debian/rules: Run debian/testsuite with "all" if DEB_BUILD_OPTIONS
  contains "checkall".

[ Daniel Leidert ]
* debian/control: Used wrap-and-sort. Added Vcs-Svn and Vcs-Browser fields.
  (Priority): Moved to extra according to policy section 2.5.
  (Standards-Version): Bumped to 3.9.2.
  (Description): Fixed a typo.
* debian/watch: Added.
* debian/patches/03_hurd-i386_define_path_max.patch: Added.
  - Define MAX_PATH if not defines to fix FTBFS on hurd.
* debian/patches/series: Adjusted.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: perf_aggr.c,v 1.7 2004-07-21 00:23:06 manoj Exp $ */
 
2
#include <stdio.h>
 
3
#include <stdlib.h>
 
4
#include <assert.h>
 
5
 
 
6
#ifdef WIN32
 
7
#  include <windows.h>
 
8
#  define sleep(x) Sleep(1000*(x))
 
9
#else
 
10
#  include <unistd.h>
 
11
#endif
 
12
 
 
13
/* ARMCI is impartial to message-passing libs - we handle them with MP macros */
 
14
#if defined(PVM)
 
15
#   include <pvm3.h>
 
16
#   ifdef CRAY
 
17
#     define MPGROUP         (char *)NULL
 
18
#     define MP_INIT(arc,argv)
 
19
#   else
 
20
#     define MPGROUP           "mp_working_group"
 
21
#     define MP_INIT(arc,argv) pvm_init(arc, argv)
 
22
#   endif
 
23
#   define MP_FINALIZE()     pvm_exit()
 
24
#   define MP_TIMER          armci_timer
 
25
#   define MP_BARRIER()      pvm_barrier(MPGROUP,-1)
 
26
#   define MP_MYID(pid)      *(pid)   = pvm_getinst(MPGROUP,pvm_mytid())
 
27
#   define MP_PROCS(pproc)   *(pproc) = (int)pvm_gsize(MPGROUP)
 
28
    void pvm_init(int argc, char *argv[]);
 
29
#elif defined(TCGMSG)
 
30
#   include <sndrcv.h>
 
31
    long tcg_tag =30000;
 
32
#   define MP_BARRIER()      SYNCH_(&tcg_tag)
 
33
#   define MP_INIT(arc,argv) PBEGIN_((argc),(argv))
 
34
#   define MP_FINALIZE()     PEND_()
 
35
#   define MP_MYID(pid)      *(pid)   = (int)NODEID_()
 
36
#   define MP_PROCS(pproc)   *(pproc) = (int)NNODES_()
 
37
#   define MP_TIMER         TCGTIME_
 
38
#else
 
39
#   include <mpi.h>
 
40
#   define MP_BARRIER()      MPI_Barrier(MPI_COMM_WORLD)
 
41
#   define MP_FINALIZE()     MPI_Finalize()
 
42
#   define MP_INIT(arc,argv) MPI_Init(&(argc),&(argv))
 
43
#   define MP_MYID(pid)      MPI_Comm_rank(MPI_COMM_WORLD, (pid))
 
44
#   define MP_PROCS(pproc)   MPI_Comm_size(MPI_COMM_WORLD, (pproc));
 
45
#   define MP_TIMER         MPI_Wtime
 
46
#endif
 
47
 
 
48
#include "armci.h"
 
49
 
 
50
#define DIM1 5
 
51
#define DIM2 3
 
52
#ifdef __sun
 
53
/* Solaris has shared memory shortages in the default system configuration */
 
54
# define DIM3 6
 
55
# define DIM4 5
 
56
# define DIM5 4
 
57
#elif defined(__alpha__)
 
58
# define DIM3 8
 
59
# define DIM4 5
 
60
# define DIM5 6
 
61
#else
 
62
# define DIM3 8
 
63
# define DIM4 9
 
64
# define DIM5 7
 
65
#endif
 
66
#define DIM6 3
 
67
#define DIM7 2
 
68
 
 
69
 
 
70
#define OFF 1
 
71
#define EDIM1 (DIM1+OFF)
 
72
#define EDIM2 (DIM2+OFF)
 
73
#define EDIM3 (DIM3+OFF)
 
74
#define EDIM4 (DIM4+OFF)
 
75
#define EDIM5 (DIM5+OFF)
 
76
#define EDIM6 (DIM6+OFF)
 
77
#define EDIM7 (DIM7+OFF)
 
78
 
 
79
#define DIMS 4
 
80
#define MAXDIMS 7
 
81
#define MAX_DIM_VAL 50 
 
82
#define LOOP 200
 
83
 
 
84
#define BASE 100.
 
85
#define MAXPROC 128
 
86
#define TIMES 100
 
87
 
 
88
#ifdef CRAY
 
89
# define ELEMS 800
 
90
#else
 
91
# define ELEMS 200
 
92
#endif
 
93
 
 
94
 
 
95
/***************************** macros ************************/
 
96
#define COPY(src, dst, bytes) memcpy((dst),(src),(bytes))
 
97
#define MAX(a,b) (((a) >= (b)) ? (a) : (b))
 
98
#define MIN(a,b) (((a) <= (b)) ? (a) : (b))
 
99
#define ABS(a) (((a) <0) ? -(a) : (a))
 
100
 
 
101
/***************************** global data *******************/
 
102
int me, nproc;
 
103
void* work[MAXPROC]; /* work array for propagating addresses */
 
104
 
 
105
 
 
106
 
 
107
#ifdef PVM
 
108
void pvm_init(int argc, char *argv[])
 
109
{
 
110
    int mytid, mygid, ctid[MAXPROC];
 
111
    int np, i;
 
112
 
 
113
    mytid = pvm_mytid();
 
114
    if((argc != 2) && (argc != 1)) goto usage;
 
115
    if(argc == 1) np = 1;
 
116
    if(argc == 2)
 
117
        if((np = atoi(argv[1])) < 1) goto usage;
 
118
    if(np > MAXPROC) goto usage;
 
119
 
 
120
    mygid = pvm_joingroup(MPGROUP);
 
121
 
 
122
    if(np > 1)
 
123
        if (mygid == 0) 
 
124
            i = pvm_spawn(argv[0], argv+1, 0, "", np-1, ctid);
 
125
 
 
126
    while(pvm_gsize(MPGROUP) < np) sleep(1);
 
127
 
 
128
    /* sync */
 
129
    pvm_barrier(MPGROUP, np);
 
130
    
 
131
    printf("PVM initialization done!\n");
 
132
    
 
133
    return;
 
134
 
 
135
usage:
 
136
    fprintf(stderr, "usage: %s <nproc>\n", argv[0]);
 
137
    pvm_exit();
 
138
    exit(-1);
 
139
}
 
140
#endif
 
141
          
 
142
void create_array(void *a[], int elem_size, int ndim, int dims[])
 
143
{
 
144
     int bytes=elem_size, i, rc;
 
145
 
 
146
     assert(ndim<=MAXDIMS);
 
147
     for(i=0;i<ndim;i++)bytes*=dims[i];
 
148
 
 
149
     rc = ARMCI_Malloc(a, bytes);
 
150
     assert(rc==0);
 
151
     
 
152
     assert(a[me]);
 
153
     
 
154
}
 
155
 
 
156
void destroy_array(void *ptr[])
 
157
{
 
158
    MP_BARRIER();
 
159
 
 
160
    assert(!ARMCI_Free(ptr[me]));
 
161
}
 
162
 
 
163
#define MAXELEMS      1000
 
164
#define MAX_REQUESTS  MAXELEMS
 
165
 
 
166
void test_aggregate(int dryrun) {
 
167
  
 
168
    int i, j, rc, bytes, elems[2] = {MAXPROC, MAXELEMS};
 
169
    double *ddst_put[MAXPROC];
 
170
    double *ddst_get[MAXPROC];
 
171
    double *dsrc[MAXPROC];
 
172
    armci_hdl_t aggr_hdl_put[MAXPROC];
 
173
    armci_hdl_t aggr_hdl_get[MAXPROC];
 
174
    armci_hdl_t hdl_put[MAXELEMS];
 
175
    armci_hdl_t hdl_get[MAXELEMS];
 
176
    armci_giov_t darr;
 
177
    void *src_ptr[MAX_REQUESTS], *dst_ptr[MAX_REQUESTS];
 
178
    int start = 0, end = 0;
 
179
    double start_time;
 
180
        
 
181
    create_array((void**)ddst_put, sizeof(double),2, elems);
 
182
    create_array((void**)ddst_get, sizeof(double),2, elems);
 
183
    create_array((void**)dsrc, sizeof(double),1, &elems[1]);
 
184
    
 
185
    for(i=0; i<elems[1]; i++) dsrc[me][i]=i*1.001*(me+1);
 
186
    for(i=0; i<elems[0]*elems[1]; i++) {
 
187
      ddst_put[me][i]=0.0;
 
188
      ddst_get[me][i]=0.0;
 
189
    }
 
190
    
 
191
    MP_BARRIER();
 
192
 
 
193
    /* only proc 0 does the work */
 
194
    if(me == 0) {
 
195
      if(!dryrun)printf("Transferring %d doubles (Not an array of %d doubles)\n", MAXELEMS, MAXELEMS);
 
196
      
 
197
      /* initializing non-blocking handles */
 
198
      for(i=0; i<elems[1]; i++) ARMCI_INIT_HANDLE(&hdl_put[i]);
 
199
      for(i=0; i<elems[1]; i++) ARMCI_INIT_HANDLE(&hdl_get[i]);
 
200
      
 
201
      /* aggregate handles */
 
202
      for(i=0; i<nproc; i++) ARMCI_INIT_HANDLE(&aggr_hdl_put[i]);
 
203
      for(i=0; i<nproc; i++) ARMCI_INIT_HANDLE(&aggr_hdl_get[i]);
 
204
      for(i=0; i<nproc; i++) ARMCI_SET_AGGREGATE_HANDLE(&aggr_hdl_put[i]);
 
205
      for(i=0; i<nproc; i++) ARMCI_SET_AGGREGATE_HANDLE(&aggr_hdl_get[i]);    
 
206
      
 
207
      bytes = sizeof(double);
 
208
      
 
209
      /* **************** PUT **************** */    
 
210
      /* register put */
 
211
      start_time=MP_TIMER();
 
212
      start = 0; end = elems[1]; 
 
213
      for(i=1; i<nproc; i++) {
 
214
        for(j=start; j<end; j++) {  
 
215
          ARMCI_NbPutValueDouble(dsrc[me][j], &ddst_put[i][me*elems[1]+j], i, 
 
216
                                 &hdl_put[j]);
 
217
        }
 
218
        for(j=start; j<end; j++) ARMCI_Wait(&hdl_put[j]);
 
219
      }
 
220
      if(!dryrun)printf("%d: Value Put time      = %.2es\n", me, MP_TIMER()-start_time);
 
221
 
 
222
      /* vector put */
 
223
      start_time=MP_TIMER();
 
224
      for(i=1; i<nproc; i++) {
 
225
        for(j=start; j<end; j++) {
 
226
          src_ptr[j] = (void *)&dsrc[me][j];
 
227
          dst_ptr[j] = (void *)&ddst_put[i][me*elems[1]+j];
 
228
        }
 
229
        darr.src_ptr_array = src_ptr;
 
230
        darr.dst_ptr_array = dst_ptr;
 
231
        darr.bytes = sizeof(double);
 
232
        darr.ptr_array_len = elems[1];
 
233
        if((rc=ARMCI_NbPutV(&darr, 1, i, &hdl_put[i])))
 
234
          ARMCI_Error("armci_nbputv failed\n",rc);
 
235
      }
 
236
      for(i=1; i<nproc; i++) ARMCI_Wait(&hdl_put[i]);
 
237
      if(!dryrun)printf("%d: Vector Put time     = %.2es\n", me, MP_TIMER()-start_time);
 
238
      
 
239
      /* regular put */
 
240
      start_time=MP_TIMER();    
 
241
      for(i=1; i<nproc; i++) {
 
242
        for(j=start; j<end; j++) {  
 
243
          if((rc=ARMCI_NbPut(&dsrc[me][j], &ddst_put[i][me*elems[1]+j], bytes,
 
244
                             i, &hdl_put[j])))
 
245
            ARMCI_Error("armci_nbput failed\n",rc);
 
246
        }
 
247
        for(j=start; j<end; j++) ARMCI_Wait(&hdl_put[j]);
 
248
      }
 
249
      if(!dryrun)printf("%d: Regular Put time    = %.2es\n", me, MP_TIMER()-start_time);
 
250
      
 
251
      /* aggregate put */
 
252
      start_time=MP_TIMER();
 
253
      for(i=1; i<nproc; i++) {
 
254
        for(j=start; j<end; j++) {  
 
255
          if((rc=ARMCI_NbPut(&dsrc[me][j], &ddst_put[i][me*elems[1]+j], bytes,
 
256
                             i,  &aggr_hdl_put[i])))
 
257
            ARMCI_Error("armci_nbput failed\n",rc);
 
258
        }
 
259
      }
 
260
      for(i=1; i<nproc; i++) ARMCI_Wait(&aggr_hdl_put[i]);
 
261
      if(!dryrun)printf("%d: Aggregate Put time  = %.2es\n\n", me, MP_TIMER()-start_time);
 
262
      
 
263
      
 
264
      /* **************** GET **************** */    
 
265
      
 
266
      /* vector get */
 
267
      start_time=MP_TIMER();
 
268
      for(i=1; i<nproc; i++) {
 
269
        for(j=start; j<end; j++) {
 
270
          src_ptr[j] = (void *)&dsrc[i][j];
 
271
          dst_ptr[j] = (void *)&ddst_get[me][i*elems[1]+j];
 
272
        }
 
273
        darr.src_ptr_array = src_ptr;
 
274
        darr.dst_ptr_array = dst_ptr;
 
275
        darr.bytes = sizeof(double);
 
276
        darr.ptr_array_len = elems[1];
 
277
        if((rc=ARMCI_NbGetV(&darr, 1, i, &hdl_get[i])))
 
278
          ARMCI_Error("armci_nbgetv failed\n",rc);
 
279
        ARMCI_Wait(&hdl_get[i]);
 
280
      }
 
281
      if(!dryrun)printf("%d: Vector Get time     = %.2es\n", me, MP_TIMER()-start_time);
 
282
      
 
283
      /* regular get */
 
284
      start_time=MP_TIMER();    
 
285
      for(i=1; i<nproc; i++) {
 
286
        for(j=start; j<end; j++) {  
 
287
          if((rc=ARMCI_NbGet(&dsrc[i][j], &ddst_get[me][i*elems[1]+j], bytes,
 
288
                             i, &hdl_get[j])))
 
289
            ARMCI_Error("armci_nbget failed\n",rc);
 
290
        }
 
291
        for(j=start; j<end; j++) ARMCI_Wait(&hdl_get[j]);
 
292
      }
 
293
      if(!dryrun)printf("%d: Regular Get time    = %.2es\n", me, MP_TIMER()-start_time);
 
294
      
 
295
      /* aggregate get */
 
296
      start_time=MP_TIMER();
 
297
      for(i=1; i<nproc; i++) {
 
298
        for(j=start; j<end; j++) {  
 
299
          ARMCI_NbGet(&dsrc[i][j], &ddst_get[me][i*elems[1]+j], bytes,
 
300
                      i, &aggr_hdl_get[i]);
 
301
        }
 
302
      }
 
303
      for(i=1; i<nproc; i++) ARMCI_Wait(&aggr_hdl_get[i]);
 
304
      if(!dryrun)printf("%d: Aggregate Get time  = %.2es\n", me, MP_TIMER()-start_time);
 
305
    }
 
306
 
 
307
    MP_BARRIER();
 
308
    ARMCI_AllFence();
 
309
    MP_BARRIER();
 
310
 
 
311
    /* Verify */
 
312
    if(!(me==0))
 
313
      for(j=0; j<elems[1]; j++) {
 
314
        if( ABS(ddst_put[me][j]-j*1.001) > 0.1) {
 
315
          ARMCI_Error("aggregate put failed...1", 0);
 
316
        }
 
317
      }
 
318
    MP_BARRIER();
 
319
    if(!dryrun)if(me==0) printf("\n  aggregate put ..O.K.\n"); fflush(stdout);
 
320
 
 
321
    if(me==0) {
 
322
      for(i=1; i<nproc; i++) {
 
323
        for(j=0; j<elems[1]; j++) {
 
324
          if( ABS(ddst_get[me][i*elems[1]+j]-j*1.001*(i+1)) > 0.1) {
 
325
            ARMCI_Error("aggregate get failed...1", 0);
 
326
          }
 
327
        }
 
328
      }
 
329
    }
 
330
    MP_BARRIER();
 
331
    if(!dryrun)if(me==0) printf("  aggregate get ..O.K.\n"); fflush(stdout);
 
332
 
 
333
 
 
334
    ARMCI_AllFence();
 
335
    MP_BARRIER();
 
336
    
 
337
    if(!dryrun)if(me==0){printf("O.K.\n"); fflush(stdout);}
 
338
    destroy_array((void **)ddst_put);
 
339
    destroy_array((void **)ddst_get);
 
340
    destroy_array((void **)dsrc);
 
341
}
 
342
 
 
343
 
 
344
/* we need to rename main if linking with frt compiler */
 
345
#ifdef FUJITSU_FRT
 
346
#define main MAIN__
 
347
#endif
 
348
 
 
349
int main(int argc, char* argv[])
 
350
{
 
351
 
 
352
    MP_INIT(argc, argv);
 
353
    MP_PROCS(&nproc);
 
354
    MP_MYID(&me);
 
355
 
 
356
/*    printf("nproc = %d, me = %d\n", nproc, me);*/
 
357
    
 
358
    if(nproc>MAXPROC && me==0)
 
359
       ARMCI_Error("Test works for up to %d processors\n",MAXPROC);
 
360
 
 
361
    if(me==0){
 
362
       printf("ARMCI test program (%d processes)\n",nproc); 
 
363
       fflush(stdout);
 
364
       sleep(1);
 
365
    }
 
366
    
 
367
    ARMCI_Init();
 
368
 
 
369
    if(me==0){
 
370
      printf("\nAggregate put/get requests\n\n");
 
371
      fflush(stdout);
 
372
    }
 
373
    test_aggregate(1); /* cold start */
 
374
    test_aggregate(0); /* warm start */
 
375
    
 
376
    ARMCI_AllFence();
 
377
    MP_BARRIER();
 
378
    if(me==0){printf("\nSuccess!!\n"); fflush(stdout);}
 
379
    sleep(2);
 
380
        
 
381
    MP_BARRIER();
 
382
    ARMCI_Finalize();
 
383
    MP_FINALIZE();
 
384
    return(0);
 
385
}