File: test_count.c

package info (click to toggle)
atlas 3.10.3-13
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 38,316 kB
  • sloc: ansic: 486,789; fortran: 66,209; asm: 7,267; makefile: 1,466; sh: 604
file content (92 lines) | stat: -rw-r--r-- 1,866 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "atlas_threads.h"
#include "atlas_misc.h"
#include "assert.h"

static volatile char *checkin;

void PrintUsage(char *name)
{
   fprintf(stderr, "USAGE: %s [-r <reps>] [-c <cnt>]\n", name);
   exit(-1);
}

int GetFlags(int nargs, char **args, int *nreps)
{
   int i, cnt=16384;

   *nreps = 20;
   for (i=1; i < nargs; i++)
   {
      if (args[i][0] != '-')
         PrintUsage(args[0]);
      switch(args[i][1])
      {
      case 'r':
         if (++i == nargs)
            PrintUsage(args[0]);
         *nreps = atoi(args[i]);
         break;
      case 'c':
         if (++i == nargs)
            PrintUsage(args[0]);
         cnt = atoi(args[i]);
         break;
      default:
         PrintUsage(args[0]);
      }
   }
   return(cnt);
}

void TestDoWork(ATL_LAUNCHSTRUCT_t *lp, void *vp)
{
   int i;
   ATL_thread_t *tp = vp;
   void *acnt = lp->opstruct;
   #ifdef ATL_GLOBAL
      const int iam = tp->rank;
   #endif
   do
   {
      #ifdef ATL_GLOBAL
         i = ATL_DecGlobalAtomicCount(acnt, iam);
      #else
         i = ATL_DecAtomicCount(acnt);
      #endif
      if (i < 1)
         break;
      checkin[i-1]++;
   }
   while(1);
}

int main(int nargs, char **args)
{
   int cnt, nreps, i, k;
   void *vp;

   cnt = GetFlags(nargs, args, &nreps);

   checkin = malloc(cnt*sizeof(char));
   assert(checkin);
   for (i=0; i < nreps; i++)
   {
      #ifdef ATL_GLOBAL
         vp = ATL_SetGlobalAtomicCount(ATL_NTHREADS, cnt, 0);
      #else
         vp = ATL_SetAtomicCount(cnt);
      #endif
      for (k=0; k < cnt; k++)
         checkin[k] = 0;
      ATL_goparallel(ATL_NTHREADS, TestDoWork, vp, NULL);
      for (k=0; k < cnt; k++)
         assert(checkin[k] == 1);
      #ifdef ATL_GLOBAL
         ATL_FreeGlobalAtomicCount(vp);
      #else
         ATL_FreeAtomicCount(vp);
      #endif
   }
   printf("TEST PASSED\n");
   return(0);
}