/
ficlblas.c
101 lines (88 loc) · 1.88 KB
/
ficlblas.c
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
93
94
95
96
97
98
99
100
101
#include <stdio.h>
#include <stdlib.h>
#include "ficlmath.h"
#include "ficlblas.h"
#define REAL ficlFloat
void ficlFAXPY(unsigned n,REAL da,REAL *dx,unsigned incx,REAL *dy,unsigned incy)
{
unsigned i;
if (1 == incx && 1 == incy)
{
for (i = 0; i < n; i++) {
dy[i] += da * dx[i];
}
}
else if (1 == incx)
{
for (i = 0; i < n; i++) {
*dy += da * dx[i];
dy += incy;
}
}
else if (1 == incy)
{
for (i = 0; i < n; i++) {
dy[i] += da * *dx;
dx += incx;
}
}
else
{
for (i = 0; i < n; i++) {
*dy += da * *dx;
dx += incx; dy += incy;
}
}
}
REAL ficlFDOT(unsigned n, REAL *x, unsigned incx, REAL *y, unsigned incy)
{
unsigned i;
REAL dot = 0.0;
if (1 == incx && 1 == incy)
{
for (i = 0; i < n; i++)
{
dot += x[i] * y[i];
}
}
else if (1 == incx)
{
for (i = 0; i < n; i++)
{
dot += x[i] * *y;
y += incy;
}
}
else if (1 == incy)
{
for (i = 0; i < n; i++)
{
dot += *x * y[i];
x += incx;
}
}
else
{
for (i = 0; i < n; i++)
{
dot += *x * *y;
x += incx; y += incy;
}
}
return dot;
}
void ficlFMM(unsigned m, unsigned n, unsigned k,
REAL *a, REAL *b, REAL *c)
{
REAL *ci, *ai, *bj;
unsigned i, j;
ci = c; ai = a;
for (i = 0; i < m; i++) {
bj = b;
for (j = 0; j < k; j++) {
ficlFAXPY(n, ai[j], bj, 1, ci, 1);
bj += n;
}
ci += n; ai += k;
}
}