[Agda] Type-checker evaluator performance
Jacques Carette
carette at mcmaster.ca
Wed Feb 3 15:34:56 CET 2016
Where can one read more about "no-eta-equality" ? I believe that some
of my work could benefit from this as well.
Similarly, I sought to learn from the changes you did
https://github.com/UlfNorell/me-em/commit/5930ad6b155244a1ba85abc36a0e79c1333ca7f4
but while I can "read the code", I can't quite understand how this
matches your high-level description. Could you comment a bit about
this? I believe that this would be well worth it, and may indeed help
achieve a reduction in Agda-blame, as outlined in the first paragraph.
Jacques
On 2016-02-03 04:31 , Ulf Norell wrote:
> I think it's unfortunate, if perhaps not completely undeserved, that
> Agda gets blamed every time a program is slow or uses a lot of memory.
> When people are writing slow Haskell programs their first thoughts are
> "maybe I should try to optimise my program", not "maybe someone should
> optimise GHC" and I wish we could have a little more of that for Agda
> programs. There are certainly performance problems in Agda's compile
> time evaluator (call-by-name, interpretation overhead, etc) but that
> doesn't mean that you can't write programs that perform reasonably well.
>
> I had a look at your code and the main performance problem seems to be
> that you are too strict in the proof objects produced by the model
> checker. In your example the correctness proof of Peterson's algorithm
> consists of four (I think) complete state graphs (with ~14k states)
> decorated with proofs that you build up eagerly before deciding that
> you have a valid proof. If you instead separate the decision procedure
> from the construction of the proof object you only need to run the
> former to be sure that you have a proof, and can evaluate the latter
> lazily as you need it. I forked [1] your repo and tried this out. The
> Examples module checks in 26s and uses 900M memory on my machine.
> Another thing I tried is to use a pair type without eta equality for
> the models (in my experience eta equality and call-by-name is a major
> source of inefficiency). This saves you another 30% time and space.
>
> / Ulf
>
> [1] https://github.com/UlfNorell/me-em
>
>
> On Mon, Feb 1, 2016 at 9:46 AM, Liam O'Connor <liamoc at cse.unsw.edu.au
> <mailto:liamoc at cse.unsw.edu.au>> wrote:
>
> Hi all,
>
> I’m currently using the development version of Agda, and I’ve been
> working on using the evaluation in type checking to embed proof
> search procedures inside Agda.
>
> https://github.com/liamoc/me-em
>
> Now, one of the applications of this technique is a model checker
> for a fragment of CTL on the guarded command language (*).
>
> Here is an example, where I use the model checker to verify
> peterson’s synchronisation algorithm.
>
> https://github.com/liamoc/me-em/blob/master/GCL/Examples.agda#L91
>
> Before I cleaned this code up and put it on GitHub, it was all in
> one file. I can affirm that I was able to type check the code
> then. Today, after splitting it into multiple files, and cleaning
> it up a little bit, I found that Agda would just get OOM killed
> before finishing, and it would take at least 10 minutes before
> getting OOM-killed, using all 8GB of my RAM and 4GB of my swap.
>
> Going back to the original, single-file version, it now also fails
> to finish checking and gets OOM-killed, so perhaps the
> multiple-files thing isn’t causing the issue.
>
> (Perhaps I just used a bit of disk space and now it’s running out
> of swap).
>
> Anyway, I’ll try this on a machine with more memory (RAM and swap)
> later, but is there any plan to improve performance (both in time
> and space) of the type-checker evaluator? I appreciate that what
> I’m trying to do is not something which it was designed to handle,
> but it _was working_ at some point.
>
> BTW, it seems to make no difference whether I use sharing or not,
> but when I got it to successfully check yesterday it was using
> sharing.
>
> (*) If you’ve seen the paper I wrote on this, note that the model
> checker is substantially different now.
>
> (*) Also note that originally the definition for petersons-search
> read:
>
> petersons-search
> = search $
> and′ mutex? (and′ sf? termination?)
> (model petersons initialState)
>
> but I gave it a fixed depth of 25 just to stop it doing any
> unnecessary searching.
>
> Liam
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se <mailto:Agda at lists.chalmers.se>
> https://lists.chalmers.se/mailman/listinfo/agda
>
>
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.chalmers.se/pipermail/agda/attachments/20160203/0659c48d/attachment.html
More information about the Agda
mailing list