freenode/#clasp - IRC Chatlog
Search
20:51:07
drmeister
::notify kpoeck No - nobody is running the regression tests yet - we need to get them into the build-bot.
20:52:06
drmeister
cracauer: Can we get the 'waf suppresses output ..." output into the output stream?
21:02:29
drmeister
https://gitlab.common-lisp.net/kpoeck/ansi-test/-/wikis/How-to-run-the-tests-for-clasp
21:21:41
drmeister
compile-file-parallel failures are very interesting to me. The MPS doesn't work with compile-file-parallel. I'm hoping these problems are interrelated.
21:30:45
drmeister
I'm getting a lot of tests failing. The one that I just focused on has an obvious reason:
21:31:20
drmeister
This fails because our sxhash of symbols includes hashing the package. So in the package vs not in the package produces different hash values.
21:34:05
drmeister
We should just hash on the symbol name. But I read the sxhash CLHS page and I don't see what in the standard says that what we do is wrong.
21:39:50
Bike
"The hash-code for an object is always the same within a single session provided that the object is not visibly modified with regard to the equivalence test equal."
21:42:23
drmeister
When I get home tonight I'll build clasp and run the tests with compile-file-serial and compile-file-parallel side-by-side and compare the results.
21:45:54
drmeister
There are test failures - but I don't have a basis of comparison until I compare it side by side with compile-file-serial.
21:54:05
drmeister
(= (sxhash x) (sxhash y)) cannot hash on the address of the symbol - right? Because it could move.
21:55:07
drmeister
So that test fails because first it's interned in the package and then the package becomes NIL
21:56:13
drmeister
I'm inclined to store a random 64 bit value in each symbol and use that as the hash value. Sort of like the pre-calculated hash in SBCL.
21:57:17
Bike
i don't think we could use a random number for sxhash since sxhash requires similar objects are hashed the same in different images
21:59:15
drmeister
kpoeck is absolutely right though - we need to integrate the ansi tests into our CI system.
22:06:27
Bike
well i suppose it would mean keeping the ansi tests around, and they're a separate codebase...
22:06:29
drmeister
Time real(3061.709 secs) run(3061.665 secs) consed(95670960016 bytes) interps(219)
22:17:47
drmeister
It looks like compile-file-parallel is slowing quicklisp compilation down on linux by quite a lot.
22:19:58
Bike
oh, but since atomics are basically working now i can try using a lockless queue for it
22:21:57
Bike
but the implicit C++ exception stuff is still a little mysterious to me, so maybe it does
23:11:26
drmeister
Did we have a better solution to that - one that lets us use longjmp if we can guarantee that there is no C++ between the start and end points?
23:14:50
Bike
we could write a custom unwinder that could skip some redundant steps, but that's pretty unusual territory
23:53:58
Bike
our use of exceptions is basically inefficient, i'm pretty sure. the ABI should be more forgiving if we can actually use it at that level
23:56:53
Bike
i mean, as is, it's like we have a try catch in any function that can be unwound to, so whenever you unwind you'll go through a bunch of those and rethrowing
0:27:46
drmeister
With C++ try/catch/throw you throw an exception of a certain class and it unwinds to the corresponding catch for that class.
0:29:24
drmeister
In clasp we have one exception class and we throw it and catch it and rethrow it and recatch it and so on and so on until it finds the right level.
0:31:28
Bike
well you know how when you look at an llvm disassembly every function is marked with a "personality" that's like uhhh __gxx_v0_something?
0:32:21
Bike
that's a "personality function". the unwinder calls the personality function of each frame up the stack
0:32:34
Bike
the personality function is language-specific, and the C++ one checks the C++ type of the exception
0:32:44
Bike
and if it matches returns a value ot the unwinder indicating that it should stop there.
0:34:29
drmeister
Where does C++ store the C++ type - it's gotta be a unique 64bit word that represents the type - right?
0:38:56
drmeister
So - in C++ when you throw an exception - it knows that std::type_info pointer value and it calls this chain of personality functions until it finds one that handles that std::type_info pointer value.
0:39:23
Bike
well i mean the exception object itself has the std::type_info*, and the personality function is passed a pointer to the exception
0:40:37
drmeister
But basically - the personality function at each level has a special ticket number and the throw knows the ticket number and searches through the personality functions for the matching ticket number.
0:41:19
Bike
the unwinder just calls the personality function and the personality function returns whether that's the right frame
0:43:25
drmeister
If we could assign each personality function a unique number and tell the throw what the number is - it could use the C++ exception handling machinery more efficiently.
0:45:04
drmeister
Can I call you? - I'm on the cusp of understanding something and an idea is developing in my head of how to make this much more efficient.
1:04:12
Bike
https://github.com/clasp-developers/clasp/blob/dev/src/core/debugger.cc#L1049-L1065 @drmeister this is the code that does the frame search
1:16:42
Bike
https://github.com/clasp-developers/clasp/blob/dev/src/lisp/kernel/cleavir/translate-instruction.lisp#L242-L247
1:32:29
Bike
we do actually do basically "throw;" instead of making a new exception, that may or may not be important
2:14:17
drmeister
meister@CST14042 unwind$ ./unwind -> fdur = 37 milliseconds ... gdur = 103 milliseconds
2:22:34
Bike
well then you just need to like... replicate the structure of allocating an exception higher up, i guess?
3:09:17
drmeister
Any function we call within a BLOCK we close over a variable that identifies the BLOCK for RETURN-FROM - correct?
3:29:09
drmeister
So would there be a lot of cases where we have intermediate hops as we unwind the stack?
3:30:03
Bike
i say "usually isn't" but since unwind-protect and special variable bindings involve function boundaries it might be more common
3:38:33
drmeister
::notify kpoeck I ran the ansi-test per your instructions twice - once with compile-file-parallel and another with compile-file-serial. In each case I get 267 out of 21840 total tests failed. What failures do you see? One interesting thing is there are a couple of tests that fail in serial and not in parallel and vice-versa to give the same total! eg: in parallel FBOUNDP.8 fails and in serial FBOUNDP.ERROR.3
3:39:05
drmeister
::notify kpoeck Also in parallel mode FUNCALL.ERROR.3 fails and in serial mode FUNCALL.ERROR.1 fails.
3:40:33
Bike
functions return a pair {n, T} where n is the number of return values and T is the primary value.
3:40:57
drmeister
housel: Sure. We return the first value and the number of values in two registers and the second value on in a thread local vector.
3:43:00
drmeister
We can also return a {i8*,i8} to a variable that is only {i8*} and it gets sliced as C++ does slicing.