111 lines
1.9 KiB
C

/*
How to use blas and lapack with the standard
interfaces provided by their respective projects, repectively through
`cblas.h` and `lapacke.h`
*/
#include <assert.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <cblas.h>
#include <lapacke.h>
/**
* assert two integers are equal
* if not, print them to stderr and assert false
*/
void assert_eqi(int i1, int i2) {
if (i1 != i2) {
fprintf(stderr, "%d\n%d\n\n\n", i1, i2);
assert(false);
}
}
/**
* assert two doubles are equal within err precision
* if not, print them to stderr
*/
void assert_eqd(double d1, double d2, double err) {
if (fabs(d1 - d2) > err) {
fprintf(stderr, "%f\n%f\n\n\n", d1, d2);
assert(false);
}
}
/** print an array of doubles to stderr */
void print_vecd(int n, double * v) {
int i;
for (i=0; i<n; i++) {
fprintf(stderr, "%.2f ", v[i]);
}
printf("\n");
}
/*
bool eq_vecd2(int n, double * v1, double * v2, double err)
{
if(fabs(d1 - d2) > err)
return false
return true;
}
void assert_eqvd(int n, double * v1, double * v2, double err){
if(eq_vecd(n, v1, v2, err) != true){
print_vecd(n, v1);
print_vecd(n, v2);
}
}
*/
int main(void) {
int info, ipiv2[2];
float err = 1e-6;
float x2[2], b2[2], c2[2];
float a2x2[2][2];
/* cblas */
{
x2[0] = 1.0;
x2[1] = -2.0;
assert_eqd(cblas_snrm2(2, x2, 1), sqrt(5.0), err);
}
/* lapacke */
{
/*
sgesv
Matrix vector multiply.
*/
{
a2x2[0][0] = 1.0;
a2x2[1][0] = 2.0;
a2x2[0][1] = 3.0;
a2x2[1][1] = 4.0;
b2[0] = 5.;
b2[1] = 11.;
info = LAPACKE_sgesv(
LAPACK_COL_MAJOR,
2,
1,
&a2x2[0][0],
2,
&ipiv2[0],
&b2[0],
2
);
c2[0] = 1.0;
c2[1] = 2.0;
assert_eqi(info, 0);
assert_eqd(b2[0], c2[0], err);
assert_eqd(b2[1], c2[1], err);
}
}
return EXIT_SUCCESS;
}