freenode/#clasp - IRC Chatlog
Search
14:30:38
Bike
array-row-major-index is a little weird to optimize. i guess i can just expand it into "if the array is a vector and there's only one argument, return the argument, otherwise full call"
14:37:52
Bike
i'd like to expand aref into row-major-aref of array-row-major-index, and not call the latter
14:41:12
Bike
we also have a lisp definition of array-row-major-index in addition to a C++ one, and the lisp one is uniformly slower
14:41:48
beach
I would think the array reference would most often be in a loop, and part or all of the computation for row-major index would be loop invariant.
14:46:56
Bike
since array-row-major-index can take any number of indices, the full version basically has to be a loop over them (or from 0 upto the array rank).
14:49:21
Bike
and i think with inlining we could only pick off a few specific cases, because we can't expand into an infinite number of "is the rank 0? is the rank 1? is the rank 2?" etc
14:51:24
Bike
well, as currently written in clasp the loop is actually over the indices as a list, so we'd need to know the length of the list is constant to do it that way.
14:53:22
Bike
okay, then to do that we need to put in some branch we can resolve at compile time, like a type check.
14:54:58
Bike
or do you mean that we would rewrite a-r-m-i so that it would do different things based on the, oh, okay.
14:55:33
Bike
so i was thinking you meant you'd have like (defun array-rank (array) (typecase array ((array * 0) 0) ((array * 1) 1) ...))
14:59:18
beach
I don't think that would be necessary. It would typically be a loop-invariant value anyway.
14:59:47
Bike
okay, i mean, i understand overall that it should work for any rank and that we should unroll the loop and all, but i don't understand how to actually write this with how cleavir usually does things.
15:00:26
Bike
for one, we presently ignore type declarations of rank. of course we can change that, but then what do we do with it? our only tool right now is typeq, which we cannot do infinitely.