Skip to content

Commit 26062d3

Browse files
committed
[feat] Replace backward pass loops with cblas_sgemm for AMX acceleration (adapted from upstream PR maderix#32)
1 parent 46319e9 commit 26062d3

2 files changed

Lines changed: 9 additions & 13 deletions

File tree

‎training/Makefile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ HEADERS_LARGE = stories_config.h stories_io.h stories_mil.h stories_cpu_ops.h da
1515
HEADERS_ANE = $(HEADERS_LARGE) ane_rmsnorm_bwd.h ane_classifier.h
1616

1717
train: train.m ane_runtime.h ane_mil_gen.h model.h forward.h backward.h
18-
$(CC) $(CFLAGS) -o $@ train.m $(LDFLAGS)
18+
$(CC) $(CFLAGS) -o $@ train.m $(LDFLAGS) -framework Accelerate
1919

2020
train_large: train_large.m $(HEADERS_LARGE)
2121
$(CC) $(CFLAGS) -o $@ train_large.m $(LDFLAGS) -framework Accelerate

‎training/backward.h‎

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,21 @@
44
#include "forward.h"
55
#include <math.h>
66
#include <string.h>
7+
#include <Accelerate/Accelerate.h>
78

8-
// dW += dy @ x^T — dy: [S, out_dim], x: [S, in_dim], dW: [out_dim, in_dim]
9+
// dW += dy^T @ x — dy: [S, out_dim], x: [S, in_dim], dW: [out_dim, in_dim]
910
static void cpu_accum_dW(float *dW, const float *dy, const float *x, int S, int out_dim, int in_dim) {
10-
for (int t = 0; t < S; t++)
11-
for (int i = 0; i < out_dim; i++)
12-
for (int j = 0; j < in_dim; j++)
13-
dW[i*in_dim+j] += dy[t*out_dim+i] * x[t*in_dim+j];
11+
cblas_sgemm(CblasRowMajor, CblasTrans, CblasNoTrans,
12+
out_dim, in_dim, S, 1.0f,
13+
dy, out_dim, x, in_dim, 1.0f, dW, in_dim);
1414
}
1515

1616
// dx = W^T @ dy — W: [out_dim, in_dim], dy: [S, out_dim] → dx: [S, in_dim]
1717
static void cpu_matmul_backward_dx(const float *W, const float *dy, float *dx,
1818
int S, int out_dim, int in_dim) {
19-
for (int t = 0; t < S; t++)
20-
for (int j = 0; j < in_dim; j++) {
21-
float sum = 0;
22-
for (int i = 0; i < out_dim; i++)
23-
sum += W[i*in_dim+j] * dy[t*out_dim+i];
24-
dx[t*in_dim+j] = sum;
25-
}
19+
cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,
20+
S, in_dim, out_dim, 1.0f,
21+
dy, out_dim, W, in_dim, 0.0f, dx, in_dim);
2622
}
2723

2824
static void cpu_rmsnorm_backward(float *dx, const float *dy, const float *x, const float *w,

0 commit comments

Comments
 (0)