From 5f7a81acc7f75415d62dac86c5b50c848ab15341 Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Sun, 23 Feb 2025 21:44:23 +0100 Subject: Optimise by backpropagating scalar computation in C --- cbits/backprop.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 cbits/backprop.c (limited to 'cbits') diff --git a/cbits/backprop.c b/cbits/backprop.c new file mode 100644 index 0000000..0ca62e3 --- /dev/null +++ b/cbits/backprop.c @@ -0,0 +1,25 @@ +// #include +#include +// #include + +struct Contrib { + int64_t i1; + double dx; + int64_t i2; + double dy; +}; + +void ad_dual_hs_backpropagate_double( + double *accums, + int64_t id_base, int64_t topid, const void *contribs_buf +) { + // fprintf(stderr, "< ci0=%" PRIi64 " topid=%" PRIi64 " >\n", id_base, topid); + const struct Contrib *contribs = (const struct Contrib*)contribs_buf; + + for (int64_t i = topid - id_base; i >= 0; i--) { + double d = accums[id_base + i]; + // fprintf(stderr, "ACC i=%" PRIi64 " d=%g C={%" PRIi64 ", %g, %" PRIi64 ", %g}\n", id_base + i, d, contribs[i].i1, contribs[i].dx, contribs[i].i2, contribs[i].dy); + if (contribs[i].i1 != -1) accums[contribs[i].i1] += d * contribs[i].dx; + if (contribs[i].i2 != -1) accums[contribs[i].i2] += d * contribs[i].dy; + } +} -- cgit v1.2.3-70-g09d2