SIONlib  1.7.0
Scalable I/O library for parallel access to task-local files
sion_convert.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2016 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdarg.h>
23 #include <assert.h>
24 
25 #include "sion.h"
26 #include "sion_debug.h"
27 
28 
36 void sion_swap(void *target, void *source, int size, int n, int aflag)
37 {
38  int i, j;
39  char *iptr, *optr;
40 
41  optr = target;
42  iptr = source;
43 
44  if (iptr == optr) {
45  if (!aflag)
46  return;
47  /*
48  * in-place swapping
49  * unroll loop for the common cases 2,4,8 Byte
50  *
51  */
52  DPRINTF((4, "vtools_swap: swapping %d x %d Bytes in place =%ld\n", n, size, (sion_int32) *iptr));
53 
54  char tmp;
55  switch (size) {
56  case 1:
57  /* nothing to do */
58  break;
59  case 2:
60  for (i = 0; i < n; i++) {
61  tmp = iptr[0];
62  iptr[0] = iptr[1];
63  iptr[1] = tmp;
64  iptr += 2;
65  }
66  break;
67  case 4:
68  for (i = 0; i < n; i++) {
69  tmp = iptr[0];
70  iptr[0] = iptr[3];
71  iptr[3] = tmp;
72 
73  tmp = iptr[1];
74  iptr[1] = iptr[2];
75  iptr[2] = tmp;
76 
77  iptr += 4;
78  }
79  break;
80  case 8:
81  for (i = 0; i < n; i++) {
82  tmp = iptr[0];
83  iptr[0] = iptr[7];
84  iptr[7] = tmp;
85 
86  tmp = iptr[1];
87  iptr[1] = iptr[6];
88  iptr[6] = tmp;
89 
90  tmp = iptr[2];
91  iptr[2] = iptr[5];
92  iptr[5] = tmp;
93 
94  tmp = iptr[3];
95  iptr[3] = iptr[4];
96  iptr[4] = tmp;
97 
98  iptr += 8;
99  }
100  break;
101  default:
102  for (i = 0; i < n; i++) {
103  for (j = 0; j < size / 2; j++) {
104  tmp = iptr[j];
105  iptr[j] = iptr[size - j - 1];
106  iptr[size - j - 1] = tmp;
107  }
108  iptr += size;
109  }
110  }
111  DPRINTF((4, "vtools_swap: swapped %d x %d Bytes in place =%ld\n", n, size, *optr));
112 
113  }
114  else {
115  if (aflag) {
116  memcpy(optr, iptr, size * n);
117  return;
118  }
119  /*
120  * swap into a different non-overlapping buffer
121  * unroll common cases again
122  */
123  DPRINTF((4, "vtools_swap: swapping %d x %d Bytes\n", n, size));
124 
125  switch (size) {
126  case 1:
127  memcpy(optr, iptr, size * n);
128  break;
129  case 2:
130  for (i = 0; i < n; i++) {
131  optr[0] = iptr[1];
132  optr[1] = iptr[0];
133 
134  iptr += 2;
135  optr += 2;
136  }
137  break;
138  case 4:
139  for (i = 0; i < n; i++) {
140  optr[0] = iptr[3];
141  optr[1] = iptr[2];
142  optr[2] = iptr[1];
143  optr[3] = iptr[0];
144 
145  iptr += 4;
146  optr += 4;
147  }
148  break;
149  case 8:
150  for (i = 0; i < n; i++) {
151  optr[0] = iptr[7];
152  optr[1] = iptr[6];
153  optr[2] = iptr[5];
154  optr[3] = iptr[4];
155  optr[4] = iptr[3];
156  optr[5] = iptr[2];
157  optr[6] = iptr[1];
158  optr[7] = iptr[0];
159 
160  iptr += 8;
161  optr += 8;
162  }
163  break;
164  default:
165  for (i = 0; i < n; i++) {
166  for (j = 0; j < size; j++) {
167  optr[j] = iptr[size - j - 1];
168  }
169  iptr += size;
170  optr += size;
171  }
172  }
173  }
174 }
void sion_swap(void *target, void *source, int size, int n, int aflag)
Definition: sion_convert.c:36