forked from arrayfire/arrayfire
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcblas.cpp
More file actions
68 lines (61 loc) · 3.11 KB
/
cblas.cpp
File metadata and controls
68 lines (61 loc) · 3.11 KB
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
/*******************************************************
* Copyright (c) 2014, ArrayFire
* All rights reserved.
*
* This file is distributed under 3-clause BSD license.
* The complete license agreement can be obtained at:
* http://arrayfire.com/licenses/BSD-3-Clause
********************************************************/
#ifdef USE_F77_BLAS
#include <common/blas_headers.hpp>
#define ADD_
#include <cblas.h>
#include <cblas_f77.h>
static char transChar(CBLAS_TRANSPOSE Trans) {
switch (Trans) {
case CblasNoTrans: return 'N';
case CblasTrans: return 'T';
case CblasConjTrans: return 'C';
default: return '\0';
}
}
#define GEMM_F77(X, TS, TV, TY) \
void cblas_##X##gemm( \
const CBLAS_ORDER Order, const CBLAS_TRANSPOSE TransA, \
const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, \
const TS alpha, const TV *A, const int lda, const TV *B, \
const int ldb, const TS beta, TV *C, const int ldc) { \
char aT = transChar(TransA); \
char bT = transChar(TransB); \
X##gemm_(&aT, &bT, &M, &N, &K, (const TY *)ADDR(alpha), (const TY *)A, \
&lda, (const TY *)B, &ldb, (const TY *)ADDR(beta), (TY *)C, \
&ldc); \
} \
void cblas_##X##gemv( \
const CBLAS_ORDER order, const CBLAS_TRANSPOSE TransA, const int M, \
const int N, const TS alpha, const TV *A, const int lda, const TV *X, \
const int incX, const TS beta, TV *Y, const int incY) { \
char aT = transChar(TransA); \
X##gemv_(&aT, &M, &N, (const TY *)ADDR(alpha), (const TY *)A, &lda, \
(const TY *)X, &incX, (const TY *)ADDR(beta), (TY *)Y, \
&incY); \
} \
void cblas_##X##axpy(const int N, const TS alpha, const TV *X, \
const int incX, TV *Y, const int incY) { \
X##axpy_(&N, (const TY *)ADDR(alpha), (const TY *)X, &incX, (TY *)Y, \
&incY); \
} \
void cblas_##X##scal(const int N, const TS alpha, TV *X, const int incX) { \
X##scal_(&N, (const TY *)ADDR(alpha), (TY *)X, &incX); \
}
#define ADDR(val) &val
GEMM_F77(s, float, float, float)
GEMM_F77(d, double, double, double)
#undef ADDR
#define ADDR(val) val
GEMM_F77(c, void *, void, float)
GEMM_F77(z, void *, void, double)
#undef ADDR
#else
#include <blas.hpp>
#endif