1
1
#include "atlas_misc.h"
4
int FAx=0, MAx=0, FAy=0, MAy=0;
12
struct FA_allocs *next;
15
struct FA_allocs *NewAlloc(size_t size, struct FA_allocs *next,
16
int align, int misalign)
18
* Allocates size allocation that is aligned to [align], but not aligned
19
* to [misalign]. Therefore, misalign > align. Align must minimally be sizeof
20
* while misalign may be 0 if we don't need to avoid a particular alignment.
27
const int malign = align >= misalign ? align : misalign;
29
n = size + align + malign;
33
cp = malloc(n + sizeof(struct FA_allocs));
35
ap = (struct FA_allocs *) (cp + n);
38
* Align to min alignment
40
ap->memA = align ? (void*) ((((size_t) cp)/align)*align + align) : cp;
42
* Misalign to misalign
46
if (((size_t)ap->memA)%misalign == 0)
47
ap->memA = ((char*)ap->memA) + align;
54
* no-align malloc free retaining system default behavior
56
void *NA_malloc(size_t size)
60
void *NA_calloc(size_t n, size_t size)
62
return(calloc(n, size));
64
void NA_free(void *ptr)
71
* malloc/free pair that aligns data to align, but not to misalign
73
void *FA_malloc(size_t size, int align, int misalign)
75
if ((!misalign && align <= 8) || !size)
79
allocQ = NewAlloc(size, allocQ, align, misalign);
83
void *FA_calloc(size_t n, size_t size, int align, int misalign)
91
cp = FA_malloc(tsize, align, misalign);
92
if (size == sizeof(int))
93
for (ip=(int*)cp,i=0; i < n; i++)
95
else if (size == sizeof(double))
96
for (dp=(double*)cp,i=0; i < n; i++)
99
for (i=0; i < tsize; i++)
104
void FA_free(void *ptr, int align, int misalign)
106
* Part of malloc/free pair that aligns data to FALIGN
109
struct FA_allocs *ap, *prev;
112
if ((!misalign && align <= 8))
116
for (ap=allocQ; ap && ap->memA != ptr; ap = ap->next) prev = ap;
119
fprintf(stderr, "Couldn't find mem=%ld\nmemQ=\n", ptr);
120
for (ap=allocQ; ap; ap = ap->next)
121
fprintf(stderr, " %ld, %ld\n", ap->memA, ap->mem);
125
allocQ = allocQ->next;
127
prev->next = ap->next;
4
133
#define dumb_seed(iseed_) srand(iseed_)
5
134
#ifndef RAND_MAX /* rather dangerous non-ansi workaround */
6
135
#define RAND_MAX ((unsigned long)(1<<30))
98
static TYPE *dupvec(int npad, int N, TYPE *X, int incX)
227
static TYPE *dupvec(int npad, int N, TYPE *X, int incX, int FA, int MA)
103
232
incX = Mabs(incX);
104
233
n = 1+(N-1)*incX + 2*npad;
105
y = malloc(ATL_sizeof*n);
234
y = FA_malloc(ATL_sizeof*n, FA, MA);
114
243
static TYPE *gen_dupvec(int N, TYPE padval, int npadX, TYPE *X, int incX,
244
int npadY, int incY, int FA, int MA)
118
247
TYPE *y, *yy, *xx=X+(npadX SHIFT);
120
y = getvec(npadY, padval, N, incY);
249
y = getvec(npadY, padval, N, incY, FA, MA);
121
250
yy = y + (npadY SHIFT);
122
251
if (incY < 1) yy -= ((N-1)SHIFT) * incY;
123
252
if (incX < 1) xx -= ((N-1)SHIFT) * incX;
139
268
TYPE Mjoin(PATL, epsilon)(void);
140
269
eps = Mjoin(PATL,epsilon)();
142
x = X = getvec(0, padval, N, incX);
143
y = Y = getvec(0, padval, N, incY);
271
x = X = getvec(0, padval, N, incX, FAx, MAx);
272
y = Y = getvec(0, padval, N, incY, FAy, MAy);
144
273
if (incX < 1) x -= ((N-1)SHIFT) * incX;
145
274
if (incY < 1) y -= ((N-1)SHIFT) * incY;
277
dotT = TEST_DOT(N, x, incX, y, incY);
148
278
dotG = good_dot(N, x, incX, y, incY);
149
dotT = TEST_DOT(N, x, incX, y, incY);
150
279
diff = dotG - dotT;
151
280
diff = Mabs(diff);
152
if (diff > 2*N*eps) /* could be double this, but shouldn't in practice */
281
if (diff > 2*N*eps || dotT != dotT)
282
{ /* diff could 4*N*eps, but isn't in practice */
155
284
" DOT ERROR: N=%d, correct=%e, computed=%e, diff=%e!!\n",
156
285
N, dotG, dotT, diff);