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) ...))