freenode/#clasp - IRC Chatlog
Search
3:06:05
beach
Yes, you can use the same initarg for multiple slots. But I guess you figured that out.
3:07:18
Bike
(unrelatedly) what i'm trying to do is exotic enough that it doesn't fit in mop. i guess it works as an implementor-only thing, but it's still kind of disappointing
3:10:12
Bike
sbcl has these things called CTORs for optimizing make-instance that i'm trying to duplicate. the basic idea is that some generic functions are almost always called with constant arguments, such that any given call site only ever has one effective method. so you can compute the effective method beforehand, and put it in a cache at the call, and only update it whenever there are method redefinitions that would affect it.
3:10:51
Bike
but you don't want to just do the effective method, because we only need to do part of it - like, if the keys of the initargs of a make-instance call are constant, we can just check initargs beforehand too.
3:11:27
Bike
so i want something like an effective method but with the primary method swapped out. which is certainly exotic, but i could basically manage if i was able to call methods portably
3:12:49
Bike
mm, plus another hiccup is that if other methods do certain things with call-next-method i can't optimize, and i can't detect that situation completely reliably
3:13:39
beach
It sounds like two different issues to me, though. One is optimizing MAKE-INSTANCE and the other is more general, having to do with calls to any generic function.
3:14:47
Bike
but even with make-instance... i mean, someone could define an :after method on it or something. i'd like to do the optimized body and then call the after method.
3:16:12
Bike
i mean, you do something like a compiler macro so that (make-instance 'foo ...) becomes (funcall (load-time-value (compute-constructor-cell 'foo)) ...), so it keeps all the standard redefinition semantics and such
3:18:00
Bike
that part works fine. i mean, it all works really, except that i have (funcall (method-function method) args nil) which is wrong.
3:20:08
beach
Bike: In the case of make-instance, to what generic function does the method and the method-function in your example belong?
3:21:03
beach
Oh, right. It calls itself with the class metaobject when the first argument is a symbol, right?
3:27:21
beach
I guess I wasn't thinking of Clasp in particular. But I suppose there was a reason for someone to implement this thing in SBCL.
3:27:56
Bike
probably. it's kind of black magic there, i was hoping i could write something more comprehensible (which is partly why i'm annoyed at the method thing)
3:29:42
Bike
allocating a million empty objects in sbcl takes a little over six times as long with (notinline make-instance), once the cache is set up, so it at least works.
3:31:22
beach
Oh, I believe the mechanism works alright. But if it is almost never used, then there is no point. But I guess we have no information about the frequency of use in typical programs. Someone in the SBCL camp must have observed it I guess.
3:32:08
Bike
it's pretty rare that i call make-instance with a variable class or variable keywords (hell, anything with variable keywords)
3:35:10
Bike
honestly at some level i just think it would be neat to reduce make-instance to load-from-cache -> allocate block -> modify block with no calls, which would be possible in some situations, and without affecting safety or flexibility or anything
3:36:46
beach
It is certainly a nice exercise in using MOP-related stuff. If in addition it makes a difference to performance, that's even better.
3:39:05
beach
Personally, I would do things in a different order, but that's just me. I would first try to measure the fraction of time spent allocating and initializing objects in a typical program. Then I would make a decision as to whether it is worth optimizing (which it probably is). And if it is, I would have a very precise metric of the improvements the optimization would imply.
3:39:18
Bike
the other thing in that vein to do is array accesses, but i don't know whether i should alter cleavir for that (the rank thing)
3:39:50
Bike
it's not unreasonable. i think drmeister has something to count calls, maybe it counts time too. could just do that on make-instance during a compile.
3:41:35
beach
If you are clever with how arrays are represented, then computing the rank and length etc, is a loop-invariant calculation.
3:43:57
beach
Oh, and then it won't matter how the rank is represented, so you can use a list of dimensions, which will remove the special case of a vector.
3:44:52
beach
I am sorry, but I am paranoid about maintenance. I know drmeister is not. But whenever I see a special case, I see more code to maintain and more work for the manpower that we don't have.
3:47:27
Bike
aref is something like a big check to determine the element type, underlying array, underlying index, etc, and then a memory access. all but the memory access is loop invariant, but there's... a lot of it.
3:48:58
beach
So, again, my take would be to work on loop-invariant code motion in HIR. That way, array access would automatically be optimized, along with a host of other stuff.
3:49:14
Bike
well, maybe not a lot. tag check for the element type and rank, loop to get the underlying array and index.
3:49:34
Bike
well that's what i'm wondering about. i would think to inline aref as, essentially, a few dozen typeq branches
3:51:24
beach
Though, the sequence functions are not meant to be inlined, so code size is not that important.
3:52:47
beach
In the sequence functions? Yes, in fact I don't eliminate branches there. There is no need because they are not meant to be inlined.
3:54:20
beach
Tough one. I am inclined to just leave the duplicated loops in there, until someone detects a problem with code size.
3:55:39
Bike
i mean, say there are eight upgraded array types, and i have a loop that accesses three arrays. that's 512 copies
4:17:42
beach
You could suggest a policy to the programmer, so that if he or she has absolutely no idea about the type of the array, and doesn't want the loop to be replicated, then this policy will not attempt such an optimization.
4:21:34
Bike
if there's an idea about the type of the array it can just apply that without doing code motion, though, can't it?
4:23:46
beach
But there can be partial knowledge, such as knowing that the element type is float (but not which one) or that it is a simple array, etc.
4:31:24
Bike
just had a thought (only semi related, sorry): what if cleavir just didn't have array instructions? it seems like the only thing they're for is to be in implementation defined inline definitions for aref/(setf aref), and to be turned into memref2 in some implementation defined way
4:49:25
beach
The point of Cleavir is not only to do the implementation-independent parts, but also to offer services that many implementations might need.
4:53:14
Bike
right, but in this case the main services would be stuff like this loop motion, that doesn't depend directly on the representation of arrays (as you said)
4:58:14
Bike
i mean, what cleavir actually has to know about arrays is very little, before hir. type checks can be inserted with typeq instructions. result types annotated with the. the dynamic-extent properties are almost identical to car/rplaca
5:02:21
beach
But someone has to write the code for the AREF. So there must be a representation of that stuff in source code and AST.
5:03:05
Bike
yeah. i mean, that representation is with stuff like typeq, not the aref instruction itself.
5:05:17
Bike
yeah, and the implementor can subclass it if they want, and we'd have stuff in place to make defining the primop and stuff easier.
5:08:01
beach
That's certainly worth considering. What about things like whether an array of (say) characters contains the tagged objects or the machine representation? How does that get represented in case of a single AREF? I had imagined an implementation writing code that emits (or not) UNBOX/BOX instructions according to its representation of such arrays.
5:09:29
Bike
we could move box/unbox up to the AST level, or we could generalize the existing stuff for inserting box/unbox at aref