David Tweed
2012-Mar-12 12:28 UTC
[LLVMdev] LLVM for automatic differentiation or linear algebra?
Hi, no-one else has said anything more pertinent so here's my two-pence. I have been thinking for a while about LLVM in the context of simulating _small_ stochastic systems by which I mean very much non-trivial stochastic transition functions, but still small enough that if compiled carefully down to machine code via LLVM with a good chance that they'll be faster. (With even "moderate sized" transition functions I suspect that things are going to be spilled from registers enough that the speed advantage carefully optimised "generic" code is going to be pretty insignificant.) I thought about generating a complete block of LLVM code and then applying automatic differentiation to it, and decided that, at least for an initial prototype, it made looked like a better bet to do the automatic differentiation on a pre-LLVM form before generating final instructions. This was primarily because it's easier for the code to know which instructions could contribute to numerical results and which ones are "infrastructure" (eg, computing array indices to load data from) and so don't even need consideration. In contrast, once things have become LLVM I've either got to attach metadata expressing that high-level knowledge before applying auto-diff or just blindly auto-diff everything and rely on quite intelligent and agressive constant-propagation and dead-code elimination to remove all the pointless instructions. So the basic approach I've been working on is lowering to LLVM IR, adding any necessary instructions to track the derivatives implicit in a higher level instruction at the same time as the instruction itself. (This also has the advantage that at the higher level it's easier to know that certain conditions are mutually exclusive, rather than needing to do some intricate inference on groups of LLVM conditional branches and blocks.) However, that was in my personal problem context, and I would be very interested in a more "generic" auto-diff directly on LLVM. (Indeed, maybe after prototyping I'll have a better handle on whether doing it generically on LLVM would actually work quite well.) Anyway, hope this is of interest, David Tweed