Skip to content

Commit 3b56eb3

Browse files
committed
blas C codes- for raising to linalg
1 parent 7e3f0d0 commit 3b56eb3

File tree

7 files changed

+611
-0
lines changed

7 files changed

+611
-0
lines changed

blas/dasum.c

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <math.h>
4+
5+
// DASUM: Sum of absolute values
6+
// result = sum(|x[i]|)
7+
// x: vector of length N with stride incx
8+
double dasum(int N, const double* x, int incx) {
9+
double result = 0.0;
10+
11+
for (int i = 0; i < N; i++) {
12+
result += fabs(x[i * incx]);
13+
}
14+
15+
return result;
16+
}
17+
18+
// Simple version (stride = 1)
19+
double simple_dasum(int N, const double* x) {
20+
double result = 0.0;
21+
22+
for (int i = 0; i < N; i++) {
23+
result += fabs(x[i]);
24+
}
25+
26+
return result;
27+
}
28+
29+
// Single precision version
30+
float sasum(int N, const float* x, int incx) {
31+
float result = 0.0f;
32+
33+
for (int i = 0; i < N; i++) {
34+
result += fabsf(x[i * incx]);
35+
}
36+
37+
return result;
38+
}
39+
40+
void print_vector(const double* x, int N, const char* name) {
41+
printf("%s: [", name);
42+
for (int i = 0; i < N; i++) {
43+
printf("%.1f", x[i]);
44+
if (i < N - 1) printf(", ");
45+
}
46+
printf("]\n");
47+
}
48+
49+
int main() {
50+
const int N = 6;
51+
52+
double x[] = {1.0, -2.0, 3.0, -4.0, 5.0, -6.0};
53+
54+
printf("ASUM Test: sum of absolute values\n");
55+
print_vector(x, N, "x");
56+
57+
double result = simple_dasum(N, x);
58+
59+
printf("\nasum(x) = %.1f\n", result);
60+
61+
printf("\nManual verification:\n");
62+
printf("|1.0| + |-2.0| + |3.0| + |-4.0| + |5.0| + |-6.0|\n");
63+
printf("= 1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0\n");
64+
printf("= 21.0\n");
65+
66+
// Test with stride
67+
printf("\n\nTesting with stride=2 (every other element):\n");
68+
double result_stride = dasum(3, x, 2);
69+
printf("asum(x[::2]) = %.1f\n", result_stride);
70+
printf("Manual: |%.1f| + |%.1f| + |%.1f| = %.1f\n",
71+
x[0], x[2], x[4], fabs(x[0]) + fabs(x[2]) + fabs(x[4]));
72+
73+
return 0;
74+
}

blas/daxpy.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
// DAXPY: Constant times a vector plus a vector
5+
// y = alpha * x + y
6+
// x: vector of length N with stride incx
7+
// y: vector of length N with stride incy (modified in place)
8+
// alpha: scaling factor
9+
void daxpy(int N, double alpha, const double* x, int incx, double* y, int incy) {
10+
for (int i = 0; i < N; i++) {
11+
y[i * incy] += alpha * x[i * incx];
12+
}
13+
}
14+
15+
// Simple version (stride = 1)
16+
void simple_daxpy(int N, double alpha, const double* x, double* y) {
17+
for (int i = 0; i < N; i++) {
18+
y[i] += alpha * x[i];
19+
}
20+
}
21+
22+
// Single precision version
23+
void saxpy(int N, float alpha, const float* x, int incx, float* y, int incy) {
24+
for (int i = 0; i < N; i++) {
25+
y[i * incy] += alpha * x[i * incx];
26+
}
27+
}
28+
29+
void print_vector(const double* x, int N, const char* name) {
30+
printf("%s: [", name);
31+
for (int i = 0; i < N; i++) {
32+
printf("%.2f", x[i]);
33+
if (i < N - 1) printf(", ");
34+
}
35+
printf("]\n");
36+
}
37+
38+
int main() {
39+
const int N = 5;
40+
const double alpha = 2.0;
41+
42+
double x[] = {1.0, 2.0, 3.0, 4.0, 5.0};
43+
double y[] = {10.0, 20.0, 30.0, 40.0, 50.0};
44+
45+
printf("AXPY Test: y = alpha * x + y\n");
46+
printf("alpha = %.2f\n", alpha);
47+
print_vector(x, N, "x");
48+
print_vector(y, N, "y (before)");
49+
50+
// Apply axpy
51+
simple_daxpy(N, alpha, x, y);
52+
53+
print_vector(y, N, "y (after)");
54+
55+
printf("\nManual verification:\n");
56+
printf("y[0] = 2.0*1.0 + 10.0 = 12.00\n");
57+
printf("y[1] = 2.0*2.0 + 20.0 = 24.00\n");
58+
printf("y[2] = 2.0*3.0 + 30.0 = 36.00\n");
59+
printf("y[3] = 2.0*4.0 + 40.0 = 48.00\n");
60+
printf("y[4] = 2.0*5.0 + 50.0 = 60.00\n");
61+
62+
// Test with stride
63+
printf("\n\nTesting with stride=2:\n");
64+
double x2[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
65+
double y2[] = {100.0, 200.0, 300.0, 400.0, 500.0, 600.0};
66+
67+
printf("x: [1, 2, 3, 4, 5, 6]\n");
68+
printf("y (before): [100, 200, 300, 400, 500, 600]\n");
69+
printf("Computing: y[::2] += 10.0 * x[::2]\n");
70+
71+
daxpy(3, 10.0, x2, 2, y2, 2); // y[0,2,4] += 10*x[0,2,4]
72+
73+
printf("y (after): [%.1f, %.1f, %.1f, %.1f, %.1f, %.1f]\n",
74+
y2[0], y2[1], y2[2], y2[3], y2[4], y2[5]);
75+
printf("Expected: [110.0, 200.0, 330.0, 400.0, 550.0, 600.0]\n");
76+
77+
return 0;
78+
}

blas/dcopy.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
// DCOPY: Copy vector x to vector y
5+
// y = x
6+
// x: source vector of length N with stride incx
7+
// y: destination vector of length N with stride incy
8+
void dcopy(int N, const double* x, int incx, double* y, int incy) {
9+
for (int i = 0; i < N; i++) {
10+
y[i * incy] = x[i * incx];
11+
}
12+
}
13+
14+
// Simple version (stride = 1)
15+
void simple_dcopy(int N, const double* x, double* y) {
16+
for (int i = 0; i < N; i++) {
17+
y[i] = x[i];
18+
}
19+
}
20+
21+
// Single precision version
22+
void scopy(int N, const float* x, int incx, float* y, int incy) {
23+
for (int i = 0; i < N; i++) {
24+
y[i * incy] = x[i * incx];
25+
}
26+
}
27+
28+
void print_vector(const double* x, int N, const char* name) {
29+
printf("%s: [", name);
30+
for (int i = 0; i < N; i++) {
31+
printf("%.1f", x[i]);
32+
if (i < N - 1) printf(", ");
33+
}
34+
printf("]\n");
35+
}
36+
37+
int main() {
38+
const int N = 5;
39+
40+
double x[] = {1.0, 2.0, 3.0, 4.0, 5.0};
41+
double y[5] = {0.0, 0.0, 0.0, 0.0, 0.0};
42+
43+
printf("COPY Test\n");
44+
print_vector(x, N, "x (source)");
45+
print_vector(y, N, "y (before)");
46+
47+
// Copy x to y
48+
simple_dcopy(N, x, y);
49+
50+
print_vector(y, N, "y (after)");
51+
52+
// Verify
53+
printf("\nVerification: ");
54+
int correct = 1;
55+
for (int i = 0; i < N; i++) {
56+
if (x[i] != y[i]) {
57+
correct = 0;
58+
break;
59+
}
60+
}
61+
printf("%s\n", correct ? "PASS" : "FAIL");
62+
63+
// Test with stride
64+
printf("\n\nTesting with stride:\n");
65+
double src[] = {10.0, 20.0, 30.0, 40.0, 50.0, 60.0};
66+
double dst[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
67+
68+
printf("Source: [10, 20, 30, 40, 50, 60]\n");
69+
printf("Copying every other element (incx=2) to every position (incy=1):\n");
70+
dcopy(3, src, 2, dst, 1); // Copy src[0,2,4] to dst[0,1,2]
71+
printf("Result: [%.1f, %.1f, %.1f, %.1f, %.1f, %.1f]\n",
72+
dst[0], dst[1], dst[2], dst[3], dst[4], dst[5]);
73+
printf("Expected: [10.0, 30.0, 50.0, 0.0, 0.0, 0.0]\n");
74+
75+
return 0;
76+
}

blas/ddot.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
// DDOT: Compute dot product of two vectors
5+
// result = sum(x[i] * y[i])
6+
// x: vector of length N with stride incx
7+
// y: vector of length N with stride incy
8+
double ddot(int N, const double* x, int incx, const double* y, int incy) {
9+
double result = 0.0;
10+
11+
for (int i = 0; i < N; i++) {
12+
result += x[i * incx] * y[i * incy];
13+
}
14+
15+
return result;
16+
}
17+
18+
// Simple version (stride = 1)
19+
double simple_ddot(int N, const double* x, const double* y) {
20+
double result = 0.0;
21+
22+
for (int i = 0; i < N; i++) {
23+
result += x[i] * y[i];
24+
}
25+
26+
return result;
27+
}
28+
29+
// Single precision version
30+
float sdot(int N, const float* x, int incx, const float* y, int incy) {
31+
float result = 0.0f;
32+
33+
for (int i = 0; i < N; i++) {
34+
result += x[i * incx] * y[i * incy];
35+
}
36+
37+
return result;
38+
}
39+
40+
int main() {
41+
const int N = 5;
42+
double x[] = {1.0, 2.0, 3.0, 4.0, 5.0};
43+
double y[] = {2.0, 3.0, 4.0, 5.0, 6.0};
44+
45+
printf("DOT Product Test\n");
46+
printf("x: [");
47+
for (int i = 0; i < N; i++) {
48+
printf("%.1f ", x[i]);
49+
}
50+
printf("]\n");
51+
52+
printf("y: [");
53+
for (int i = 0; i < N; i++) {
54+
printf("%.1f ", y[i]);
55+
}
56+
printf("]\n\n");
57+
58+
// Test simple version
59+
double result = simple_ddot(N, x, y);
60+
printf("dot(x, y) = %.1f\n", result);
61+
62+
// Manual verification
63+
double manual = 0.0;
64+
for (int i = 0; i < N; i++) {
65+
manual += x[i] * y[i];
66+
printf(" %.1f * %.1f = %.1f\n", x[i], y[i], x[i] * y[i]);
67+
}
68+
printf("Expected: %.1f, Actual: %.1f\n\n", manual, result);
69+
70+
// Test with stride
71+
printf("Testing with stride=2 (every other element):\n");
72+
double result_stride = ddot(3, x, 2, y, 2);
73+
printf("dot(x[::2], y[::2]) = %.1f\n", result_stride);
74+
printf("Manual: %.1f*%.1f + %.1f*%.1f + %.1f*%.1f = %.1f\n",
75+
x[0], y[0], x[2], y[2], x[4], y[4],
76+
x[0]*y[0] + x[2]*y[2] + x[4]*y[4]);
77+
78+
return 0;
79+
}

0 commit comments

Comments
 (0)