Nek5000
SEM for Incompressible NS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sarray_transfer.c
Go to the documentation of this file.
1 #include <stddef.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "c99.h"
5 #include "name.h"
6 #include "fail.h"
7 #include "types.h"
8 #include "comm.h"
9 #include "mem.h"
10 #include "crystal.h"
11 #include "sort.h"
12 
13 #define sarray_transfer_many PREFIXED_NAME(sarray_transfer_many)
14 #define sarray_transfer_ PREFIXED_NAME(sarray_transfer_ )
15 #define sarray_transfer_ext_ PREFIXED_NAME(sarray_transfer_ext_)
16 
17 static void pack_int(
18  buffer *const data, const unsigned row_size, const uint id,
19  const char *const restrict input, const uint n, const unsigned size,
20  const unsigned p_off, const uint *const restrict perm)
21 {
22  const unsigned after = p_off + sizeof(uint), after_len = size-after;
23 
24 #define GET_P() memcpy(&p,row+p_off,sizeof(uint))
25 #define COPY_ROW() memcpy(out,row,p_off), \
26  memcpy((char*)out + p_off,row+after,after_len)
27 
28 #define PACK_BODY() do { \
29  uint dummy, *len_ptr=&dummy; \
30  uint i, p,lp = -(uint)1, len=0; \
31  uint *restrict out = buffer_reserve(data, n*(row_size+3)*sizeof(uint)); \
32  for(i=0;i<n;++i) { \
33  const char *row = input + size*perm[i]; \
34  GET_P(); \
35  if(p!=lp) { \
36  lp = p; \
37  *len_ptr = len; /* previous message length */ \
38  *out++ = p; /* target */ \
39  *out++ = id; /* source */ \
40  len_ptr=out++; len=0; /* length (t.b.d.) */ \
41  } \
42  COPY_ROW(); \
43  out += row_size, len += row_size; \
44  } \
45  *len_ptr = len; /* last message length */ \
46  data->n = out - (uint*)data->ptr; \
47 } while(0)
48  PACK_BODY();
49 #undef COPY_ROW
50 #undef GET_P
51 }
52 
53 static void pack_ext(
54  buffer *const data, const unsigned row_size, const uint id,
55  const char *const restrict input, const uint n, const unsigned size,
56  const uint *const restrict proc, const unsigned proc_stride,
57  const uint *const restrict perm)
58 {
59  #define GET_P() p=*(const uint*)((const char*)proc+proc_stride*perm[i])
60  #define COPY_ROW() memcpy(out,row,size)
61  PACK_BODY();
62  #undef PACK_BODY
63  #undef COPY_ROW
64  #undef GET_P
65 }
66 
67 static void pack_more(
68  buffer *const data, const unsigned off, const unsigned row_size,
69  const char *const restrict input, const unsigned size,
70  const uint *restrict perm)
71 {
72  uint *restrict buf = data->ptr, *buf_end = buf+data->n;
73  while(buf!=buf_end) {
74  uint *msg_end = buf+3+buf[2]; buf+=3;
75  while(buf!=msg_end)
76  memcpy((char*)buf+off, input+size*(*perm++), size), buf+=row_size;
77  }
78 }
79 
80 static void unpack_more(
81  char *restrict out, const unsigned size,
82  const buffer *const data, const unsigned off, const unsigned row_size)
83 {
84  const uint *restrict buf = data->ptr, *buf_end = buf+data->n;
85  while(buf!=buf_end) {
86  const uint *msg_end = buf+3+buf[2]; buf+=3;
87  while(buf!=msg_end)
88  memcpy(out, (char*)buf+off, size), out+=size, buf+=row_size;
89  }
90 }
91 
92 static void unpack_int(
93  char *restrict out, const unsigned size, const unsigned p_off,
94  const buffer *const data, const unsigned row_size, int set_src)
95 {
96  const unsigned after = p_off + sizeof(uint), after_len = size-after;
97  const uint *restrict buf = data->ptr, *buf_end = buf+data->n;
98  const unsigned pi = set_src ? 1:0;
99  while(buf!=buf_end) {
100  const uint p=buf[pi], *msg_end = buf+3+buf[2]; buf+=3;
101  while(buf!=msg_end) {
102  memcpy(out,buf,p_off);
103  memcpy(out+p_off,&p,sizeof(uint));
104  memcpy(out+after,(const char *)buf+p_off,after_len);
105  out+=size, buf+=row_size;
106  }
107  }
108 }
109 
110 static uint num_rows(const buffer *const data, const unsigned row_size)
111 {
112  const uint *buf = data->ptr, *buf_end = buf + data->n;
113  uint n=0;
114  while(buf!=buf_end) { uint len=buf[2]; n+=len, buf+=len+3; }
115  return n/row_size;
116 }
117 
118 static uint cap_rows(buffer *const data, const unsigned row_size,const uint max)
119 {
120  uint *buf = data->ptr, *buf_end = buf + data->n;
121  const uint maxn = max*row_size;
122  uint n=0;
123  while(buf!=buf_end) {
124  uint len=buf[2]; n+=len;
125  if(n<maxn) buf+=len+3;
126  else {
127  buf[2]-=(maxn-n); data->n = (buf-(uint*)data->ptr)+3+buf[2];
128  buf+=len+3;
129  while(buf!=buf_end) { uint len=buf[2]; n+=len, buf+=len+3; }
130  break;
131  }
132  }
133  return n/row_size;
134 }
135 
136 /* An must be >= 1 */
138  struct array *const *const A, const unsigned *const size, const unsigned An,
139  const int fixed, const int ext, const int set_src, const unsigned p_off,
140  const uint *const restrict proc, const unsigned proc_stride,
141  struct crystal *const cr)
142 {
143  uint n, *perm;
144  unsigned i,row_size,off,off1;
145 
146  off1 = size[0];
147  if(!ext) off1 -= sizeof(uint);
148  row_size=off1; for(i=1;i<An;++i) row_size += size[i];
149  row_size = (row_size+sizeof(uint)-1)/sizeof(uint);
150 
151  perm = sortp(&cr->work,0, proc,A[0]->n,proc_stride);
152 
153  if(!ext) pack_int(&cr->data, row_size, cr->comm.id, A[0]->ptr,A[0]->n,size[0],
154  p_off, perm);
155  else pack_ext(&cr->data, row_size, cr->comm.id, A[0]->ptr,A[0]->n,size[0],
156  proc,proc_stride, perm);
157  for(off=off1,i=1;i<An;++i) if(size[i])
158  pack_more(&cr->data,off,row_size, A[i]->ptr,size[i], perm),off+=size[i];
159 
160  crystal_router(cr);
161 
162  if(!fixed) {
163  n = num_rows(&cr->data,row_size);
164  for(i=0;i<An;++i)
165  array_reserve_(A[i],n,size[i],__FILE__,__LINE__), A[i]->n=n;
166  } else {
167  uint max=A[0]->max, an;
168  for(i=1;i<An;++i) if(A[i]->max<max) max=A[i]->max;
169  n = cap_rows(&cr->data,row_size, max);
170  an = n>max?max:n;
171  for(i=0;i<An;++i) A[i]->n=an;
172  }
173 
174  if(!ext) unpack_int (A[0]->ptr,size[0],p_off, &cr->data, row_size, set_src);
175  else unpack_more(A[0]->ptr,size[0], &cr->data,0,row_size);
176  for(off=off1,i=1;i<An;++i) if(size[i])
177  unpack_more(A[i]->ptr,size[i], &cr->data,off,row_size),off+=size[i];
178 
179  return n;
180 }
181 
182 
183 void sarray_transfer_(struct array *const A, const unsigned size,
184  const unsigned p_off, const int set_src,
185  struct crystal *const cr)
186 {
187  sarray_transfer_many(&A,&size,1, 0,0,set_src,p_off,
188  (uint*)((char*)A->ptr+p_off),size, cr);
189 }
190 
191 void sarray_transfer_ext_(struct array *const A, const unsigned size,
192  const uint *const proc, const unsigned proc_stride,
193  struct crystal *const cr)
194 {
195  sarray_transfer_many(&A,&size,1, 0,1,0,0, proc,proc_stride, cr);
196 }
197 
#define uint
Definition: types.h:70
static void * array_reserve_(struct array *a, size_t min, size_t size, const char *file, unsigned line)
Definition: mem.h:123
static uint cap_rows(buffer *const data, const unsigned row_size, const uint max)
size_t n
Definition: mem.h:111
buffer work
Definition: crystal.c:52
n
Definition: xxt_test.m:73
#define crystal_router
Definition: crystal.c:48
double max
Definition: lob_bnd.c:21
static void pack_int(buffer *const data, const unsigned row_size, const uint id, const char *const restrict input, const uint n, const unsigned size, const unsigned p_off, const uint *const restrict perm)
static void pack_ext(buffer *const data, const unsigned row_size, const uint id, const char *const restrict input, const uint n, const unsigned size, const uint *const restrict proc, const unsigned proc_stride, const uint *const restrict perm)
ulong A[NUM][SI]
Definition: sort_test.c:17
buffer data
Definition: crystal.c:52
static uint num_rows(const buffer *const data, const unsigned row_size)
static struct crystal cr
Definition: findpts_test.c:75
p
Definition: xxt_test2.m:1
Definition: mem.h:111
size_t max
Definition: mem.h:111
#define PACK_BODY()
#define sarray_transfer_many
#define restrict
Definition: c99.h:11
uint * sortp(buffer *restrict buf, int start_perm, const T *restrict A, uint n, unsigned stride)
Definition: sort_imp.h:477
for i
Definition: xxt_test.m:74
void * ptr
Definition: mem.h:111
#define sarray_transfer_
uint id
Definition: comm.h:86
ulong out[N]
Definition: sort_test2.c:20
static void unpack_more(char *restrict out, const unsigned size, const buffer *const data, const unsigned off, const unsigned row_size)
static void unpack_int(char *restrict out, const unsigned size, const unsigned p_off, const buffer *const data, const unsigned row_size, int set_src)
establishes some macros to establish naming conventions
struct comm comm
Definition: crystal.c:51
#define sarray_transfer_ext_
static void pack_more(buffer *const data, const unsigned off, const unsigned row_size, const char *const restrict input, const unsigned size, const uint *restrict perm)