SURFEX v8.1
General documentation of Surfex
linux_bind.c
Go to the documentation of this file.
1 #if defined(LINUX) && !defined(DARWIN) && !defined(_CRAYC) && !defined(ECMWF)
2 
3 #define _GNU_SOURCE
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <string.h>
9 #include <ctype.h>
10 
11 #ifdef _OPENMP
12 #include <omp.h>
13 #endif
14 
15 #include <sched.h>
16 
17 static char * getcpumask (char *buffer, size_t size)
18 {
19  cpu_set_t mask;
20  unsigned int ncpu;
21  int icpu;
22 
23  ncpu = sysconf (_SC_NPROCESSORS_CONF);
24 
25  sched_getaffinity (0, sizeof (mask), &mask);
26 
27  for (icpu = 0; icpu < ncpu; icpu++)
28  buffer[icpu] = CPU_ISSET (icpu, &mask) ? '1' : '0';
29 
30  buffer[ncpu] = '\0';
31 
32  return buffer;
33 }
34 
35 void linux_bind_dump_ (int * prank, int * psize)
36 {
37  int rank = *prank;
38  int size = *psize;
39  int icpu;
40  unsigned int ncpu;
41  FILE * fp = NULL;
42  char f[256];
43  char host[255];
44  int nomp =
45 #ifdef _OPENMP
46  omp_get_max_threads ()
47 #else
48  1
49 #endif
50  ;
51 
52  ncpu = sysconf (_SC_NPROCESSORS_CONF);
53 
54  sprintf (f, "linux_bind.%6.6d.txt", rank);
55  fp = fopen (f, "w");
56 
57  if (gethostname (host, 255) != 0)
58  strcpy (host, "unknown");
59 
60  fprintf (fp, " rank = %6d", rank);
61  fprintf (fp, " host = %9s", host);
62  fprintf (fp, " ncpu = %2d", ncpu);
63  fprintf (fp, " nomp = %2d", nomp);
64 
65  {
66  char buffer[1024];
67  fprintf (fp, " mask = %s", getcpumask (buffer, sizeof (buffer)));
68  }
69 
70 #ifdef _OPENMP
71 #pragma omp parallel
72 #endif
73  {
74  char buffer[1024];
75  int iomp =
76 #ifdef _OPENMP
77  omp_get_thread_num ()
78 #else
79  1
80 #endif
81  ;
82  int i;
83  for (i = 0; i < nomp; i++)
84  {
85  if (i == iomp)
86  {
87 #ifdef _OPENMP
88 #pragma omp critical
89 #endif
90  fprintf (fp, "\n mask = %s iomp = %2d",
91  getcpumask (buffer, sizeof (buffer)), iomp);
92  }
93 #ifdef _OPENMP
94 #pragma omp barrier
95 #endif
96  }
97 #ifdef _OPENMP
98 #pragma omp barrier
99 #endif
100  }
101 
102  fprintf (fp, "\n");
103 
104  fclose (fp);
105 
106 }
107 
108 #define LINUX_BIND_TXT "linux_bind.txt"
109 
110 void linux_bind_ (int * prank, int * psize)
111 {
112  int rank = *prank;
113  int size = *psize;
114  FILE * fp;
115  int i;
116  size_t len = 256;
117  char * buf = (char*)malloc (len);
118  const char * EC_LINUX_BIND;
119 
120  EC_LINUX_BIND = getenv ("EC_LINUX_BIND");
121 
122  if (EC_LINUX_BIND == NULL)
123  EC_LINUX_BIND = LINUX_BIND_TXT;
124 
125  fp = fopen (EC_LINUX_BIND, "r");
126 
127  if (fp == NULL)
128  {
129  // Willem Deconinck: Comment out as this pollutes logs
130  // fprintf (stderr, "`%s' was not found\n", EC_LINUX_BIND);
131  goto end;
132  }
133 
134  for (i = 0; i < rank+1; i++)
135  {
136  if (getline (&buf, &len, fp) == -1)
137  {
138  fprintf (stderr, "Unexpected EOF while reading `" LINUX_BIND_TXT "'\n");
139  goto end;
140  }
141  }
142 
143 #ifdef _OPENMP
144 #pragma omp parallel
145 #endif
146  {
147  char * c;
148  cpu_set_t mask;
149  int iomp =
150 #ifdef _OPENMP
151  omp_get_thread_num ()
152 #else
153  1
154 #endif
155  ;
156  int jomp, icpu;
157 
158  for (jomp = 0, c = buf; jomp < iomp; jomp++)
159  {
160  while (*c && isdigit (*c))
161  c++;
162  while (*c && (! isdigit (*c)))
163  c++;
164  if (*c == '\0')
165  {
166  fprintf (stderr, "Unexpected end of line while reading `" LINUX_BIND_TXT "'\n");
167  goto end_parallel;
168  }
169  }
170 
171  CPU_ZERO (&mask);
172 
173  for (icpu = 0; isdigit (*c); icpu++, c++)
174  if (*c != '0')
175  CPU_SET (icpu, &mask);
176 
177  sched_setaffinity (0, sizeof (mask), &mask);
178 
179 end_parallel:
180 
181  c = NULL;
182 
183  }
184 
185 end:
186 
187  if (fp != NULL)
188  fclose (fp);
189 
190  free (buf);
191 }
192 
193 #else
194 
195 void linux_bind_ () { }
196 void linux_bind_dump_ () { }
197 
198 #endif
199 
static long size
Definition: bytes_io.c:262
static char * getcpumask(char *buffer, size_t size)
Definition: linux_bind.c:17
FILE * fp
Definition: opfla_perfmon.c:24
void linux_bind_(int *prank, int *psize)
Definition: linux_bind.c:110
static int mask
Definition: ifssig.c:38
void linux_bind_dump_(int *prank, int *psize)
Definition: linux_bind.c:35
quick &counting sorts only inumt inumt nomp
int rank
Definition: opfla_perfmon.c:19