Tensor evolution: A framework for fast tensor computations using recurrences
arxiv.org
arxiv.org
Oh no, I'm never not going to read this as "tera-electron Volts". I wish they picked a different acronym!
So much computation these days are done on tensors, mostly for easy parallelism reasons. But we can't get completely rid of recursion. Great to have work like this making them more computationally compatible!
in order to perform that kind of canonicalization/folding/cse you effectively need to embed a whole-ass tensor ops interpreter into your compiler. note this isn't so far-fetched
https://github.com/openxla/stablehlo/blob/main/docs/interpre...
the problem is it needs to be performant as well. so what some people do is jit these canonicalizations using the compiler (yo dawg i heard you like compiling...).
also FYI they're not magically calculating closed form solutions to recurrence relations here (that's not possible) - they're basically just iterating the loop arithmetic.
I’m guessing lots of people who are on HN. I’ll go with - me for one. Guessing I’m not alone.
Remember - it’s a big world. Lots of POVs.
For this case, you can actually calculate a closed form for many recurrences, in the same way that SCEV works. You don’t need to interpret the loop to do this. If you mark your induction variables and put the loop in the right form then it’s possible to do recurrence analysis in constant time. This isn’t particularly complex or novel (and, to be fair, the paper doesn’t do much other than go “hmm what if we did this for tensors”) so I suggest you look up how it’s done in traditional compilers.
SCEV does not compute closed forms ... because that's impossible. if you don't understand why it's impossible you can consult this same team's slides on SCEV in LLVM, a "traditional compiler":
https://llvm.org/devmtg/2018-04/slides/Absar-ScalarEvolution...
specifically pages 16-18
int foo = 0;
for (int i = 0; i < n; ++i) {
foo += 1;
}
Both foo and i have an addrec of {0, +, 1}. Given the loop iteration count n it is pretty clear that you can calculate the value at exit to be n without actually running the loop n times. In fact you don't even know n and can still convert it to a closed form at compile time. So what's the point of disagreement here?1. you have to prove monotonicity to make the inference you're implying is "pretty clear". recall that "prove" really does mean prove in compilers
2. even if you did prove motonicity, it's the simplest category of loop body behavior. recall control flow.
> without actually running the loop n times
this is not possible without an oracle because PSPACE \subseteq EXPTIME
https://en.wikipedia.org/wiki/PSPACE#Relation_among_other_cl...
> https://kristerw.blogspot.com/2019/04/how-llvm-optimizes-geo...
Literally not a single loop on that page has a conditional in it. They're all the same stupid "polynomial" example. Hint: how often do you think people are trying to optimize loops that compute polynomials....
> I assure you they can do this efficiently.
It's amazing you think your assurances mean anything. So let me assure you: I know exactly what I'm talking about. In the last month I landed basically SCEV in a production compiler. Except since our programs are real and not just goofy polynomial examples, my SCEV is actually an abstract interpreter.
Now, I will admit I don’t work on compilers like you do. But I have a great respect for them, as I work adjacent to them and have done so for each of the career switches I’ve done, and all of those have been far more different from each other than they were from your field. So I think you being smug about your day job doing like “halp my kernel no hit roofline bandwidth pls fix” support or whatever your employer has you do is actually incredibly rude and uncalled for. You can express your views like a normal person without assuming everyone else you talk to is an idiot with no knowledge of how compilers work. I honestly feel like you started down this path at the very start of this thread where assumed everyone here is like “wow AI cool” and when I actually tried to engage with you on something you tried to show you had some knowledge on and you continued to do this so now I’m really just upset because you were deeply unpleasant while I got nothing out of this.
friend we're not here now, we were here the entire time; in my literal first comment:
> they're basically just iterating the loop arithmetic.
then in my second response to you, in crystal clear, bulleted text:
> 2. even if you did prove motonicity, it's the simplest category of loop body behavior. recall control flow.
do you understand "if X then Y"? so again, i believe this is simply an issue of reading comprehension.
> “halp my kernel no hit roofline bandwidth pls fix” support or whatever your employer has you do
lol my guy - people that implement things like SCEV are not doing customer support. to wit: i know javed personally and my employer pays me to do literally the same exact things he does. but nice try trying to throw shade based on a weird misinformed notion of what compiler work is like.
> I’m really just upset because you were deeply unpleasant while I got nothing out of this.
well you could've gotten something out of it but you certainly worked really hard to insist on your misinformed notions so i guess i'm not surprised? but i'm definitely "sorry not sorry" because i definitely tried to explain something to you.