|
4 | 4 | #include "forward.h" |
5 | 5 | #include <math.h> |
6 | 6 | #include <string.h> |
| 7 | +#include <Accelerate/Accelerate.h> |
7 | 8 |
|
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] |
9 | 10 | 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); |
14 | 14 | } |
15 | 15 |
|
16 | 16 | // dx = W^T @ dy — W: [out_dim, in_dim], dy: [S, out_dim] → dx: [S, in_dim] |
17 | 17 | static void cpu_matmul_backward_dx(const float *W, const float *dy, float *dx, |
18 | 18 | 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); |
26 | 22 | } |
27 | 23 |
|
28 | 24 | static void cpu_rmsnorm_backward(float *dx, const float *dy, const float *x, const float *w, |
|
0 commit comments