Skip to content

Commit 99246e9

Browse files
kjbartelcdrnet
authored andcommitted
Initial version of OpenBLAS wrapper project based off the MKL wrapper. It compiles, but may not work.
1 parent 14ec5a3 commit 99246e9

File tree

5 files changed

+1116
-0
lines changed

5 files changed

+1116
-0
lines changed

MathNet.Numerics.NativeProviders.sln

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Numerics", "src\Numerics\Nu
2020
EndProject
2121
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests-MKL", "src\UnitTests\UnitTests-MKL.csproj", "{3515A344-AB5F-41C7-A14C-04A79B3FFAB1}"
2222
EndProject
23+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenBLAS", "src\NativeProviders\Windows\OpenBLAS\OpenBLASWrapper.vcxproj", "{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}"
24+
EndProject
2325
Global
2426
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2527
Debug|Any CPU = Debug|Any CPU
@@ -111,6 +113,27 @@ Global
111113
{3515A344-AB5F-41C7-A14C-04A79B3FFAB1}.Release-Signed|Mixed Platforms.Build.0 = Release|Any CPU
112114
{3515A344-AB5F-41C7-A14C-04A79B3FFAB1}.Release-Signed|Win32.ActiveCfg = Release|Any CPU
113115
{3515A344-AB5F-41C7-A14C-04A79B3FFAB1}.Release-Signed|x64.ActiveCfg = Release|Any CPU
116+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Debug|Any CPU.ActiveCfg = Debug|Win32
117+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
118+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Debug|Mixed Platforms.Build.0 = Debug|Win32
119+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Debug|Win32.ActiveCfg = Debug|Win32
120+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Debug|Win32.Build.0 = Debug|Win32
121+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Debug|x64.ActiveCfg = Debug|x64
122+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Debug|x64.Build.0 = Debug|x64
123+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release|Any CPU.ActiveCfg = Release|Win32
124+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release|Mixed Platforms.ActiveCfg = Release|Win32
125+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release|Mixed Platforms.Build.0 = Release|Win32
126+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release|Win32.ActiveCfg = Release|Win32
127+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release|Win32.Build.0 = Release|Win32
128+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release|x64.ActiveCfg = Release|x64
129+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release|x64.Build.0 = Release|x64
130+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release-Signed|Any CPU.ActiveCfg = Release|Win32
131+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release-Signed|Mixed Platforms.ActiveCfg = Release|Win32
132+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release-Signed|Mixed Platforms.Build.0 = Release|Win32
133+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release-Signed|Win32.ActiveCfg = Release|Win32
134+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release-Signed|Win32.Build.0 = Release|Win32
135+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release-Signed|x64.ActiveCfg = Release|x64
136+
{CB4011B6-E9A7-480B-A7B1-8492039DAAD1}.Release-Signed|x64.Build.0 = Release|x64
114137
EndGlobalSection
115138
GlobalSection(SolutionProperties) = preSolution
116139
HideSolutionNode = FALSE

src/NativeProviders/OpenBLAS/blas.c

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include "cblas.h"
2+
#include "wrapper_common.h"
3+
4+
#if GCC
5+
extern "C" {
6+
#endif
7+
DLLEXPORT void s_axpy(const blasint n, const float alpha, const float x[], float y[]){
8+
cblas_saxpy(n, alpha, x, 1, y, 1);
9+
}
10+
11+
DLLEXPORT void d_axpy(const blasint n, const double alpha, const double x[], double y[]){
12+
cblas_daxpy(n, alpha, x, 1, y, 1);
13+
}
14+
15+
DLLEXPORT void c_axpy(const blasint n, const openblas_complex_float alpha, const openblas_complex_float x[], openblas_complex_float y[]){
16+
cblas_caxpy(n, &(alpha.real), &(x->real), 1, &(y->real), 1);
17+
}
18+
19+
DLLEXPORT void z_axpy(const blasint n, const openblas_complex_double alpha, const openblas_complex_double x[], openblas_complex_double y[]){
20+
cblas_zaxpy(n, &(alpha.real), &(x->real), 1, &(y->real), 1);
21+
}
22+
23+
DLLEXPORT void s_scale(const blasint n, const float alpha, float x[]){
24+
cblas_sscal(n, alpha, x, 1);
25+
}
26+
27+
DLLEXPORT void d_scale(const blasint n, const double alpha, double x[]){
28+
cblas_dscal(n, alpha, x, 1);
29+
}
30+
31+
DLLEXPORT void c_scale(const blasint n, const openblas_complex_float alpha, openblas_complex_float x[]){
32+
cblas_cscal(n, &(alpha.real), &(x->real), 1);
33+
}
34+
35+
DLLEXPORT void z_scale(const blasint n, const openblas_complex_double alpha, openblas_complex_double x[]){
36+
cblas_zscal(n, &(alpha.real), &(x->real), 1);
37+
}
38+
39+
DLLEXPORT float s_dot_product(const blasint n, const float x[], const float y[]){
40+
return cblas_sdot(n, x, 1, y, 1);
41+
}
42+
43+
DLLEXPORT double d_dot_product(const blasint n, const double x[], const double y[]){
44+
return cblas_ddot(n, x, 1, y, 1);
45+
}
46+
47+
DLLEXPORT openblas_complex_float c_dot_product(const blasint n, const openblas_complex_float x[], const openblas_complex_float y[]){
48+
openblas_complex_float ret;
49+
cblas_cdotu_sub(n, &(x->real), 1, &(y->real), 1, &ret);
50+
return ret;
51+
}
52+
53+
DLLEXPORT openblas_complex_double z_dot_product(const blasint n, const openblas_complex_double x[], const openblas_complex_double y[]){
54+
openblas_complex_double ret;
55+
cblas_zdotu_sub(n, &(x->real), 1, &(y->real), 1, &ret);
56+
return ret;
57+
}
58+
59+
DLLEXPORT void s_matrix_multiply(CBLAS_TRANSPOSE transA, CBLAS_TRANSPOSE transB, const blasint m, const blasint n, const blasint k, const float alpha, const float x[], const float y[], const float beta, float c[]){
60+
blasint lda = transA == CblasNoTrans ? m : k;
61+
blasint ldb = transB == CblasNoTrans ? k : n;
62+
63+
cblas_sgemm(CblasColMajor, transA, transB, m, n, k, alpha, x, lda, y, ldb, beta, c, m);
64+
}
65+
66+
DLLEXPORT void d_matrix_multiply(CBLAS_TRANSPOSE transA, CBLAS_TRANSPOSE transB, const blasint m, const blasint n, const blasint k, const double alpha, const double x[], const double y[], const double beta, double c[]){
67+
blasint lda = transA == CblasNoTrans ? m : k;
68+
blasint ldb = transB == CblasNoTrans ? k : n;
69+
70+
cblas_dgemm(CblasColMajor, transA, transB, m, n, k, alpha, x, lda, y, ldb, beta, c, m);
71+
}
72+
73+
DLLEXPORT void c_matrix_multiply(CBLAS_TRANSPOSE transA, CBLAS_TRANSPOSE transB, const blasint m, const blasint n, const blasint k, const openblas_complex_float alpha, const openblas_complex_float x[], const openblas_complex_float y[], const openblas_complex_float beta, openblas_complex_float c[]){
74+
blasint lda = transA == CblasNoTrans ? m : k;
75+
blasint ldb = transB == CblasNoTrans ? k : n;
76+
77+
cblas_cgemm(CblasColMajor, transA, transB, m, n, k, &(alpha.real), &(x->real), lda, &(y->real), ldb, &(beta.real), &(c->real), m);
78+
}
79+
80+
DLLEXPORT void z_matrix_multiply(CBLAS_TRANSPOSE transA, CBLAS_TRANSPOSE transB, const blasint m, const blasint n, const blasint k, const openblas_complex_double alpha, const openblas_complex_double x[], const openblas_complex_double y[], const openblas_complex_double beta, openblas_complex_double c[]){
81+
blasint lda = transA == CblasNoTrans ? m : k;
82+
blasint ldb = transB == CblasNoTrans ? k : n;
83+
84+
cblas_zgemm(CblasColMajor, transA, transB, m, n, k, &(alpha.real), &(x->real), lda, &(y->real), ldb, &(beta.real), &(c->real), m);
85+
}
86+
87+
#if GCC
88+
}
89+
#endif

0 commit comments

Comments
 (0)