From: Mark Shinwell <mshinwell@janestreet.com>
To: Gerd Stolpmann <info@gerd-stolpmann.de>
Cc: Pierre Chambart <pierre.chambart@laposte.net>,
Markus Mottl <markus.mottl@gmail.com>,
OCaml List <caml-list@inria.fr>
Subject: Re: [Caml-list] <DKIM> Re: Status of Flambda in OCaml 4.03
Date: Fri, 11 Mar 2016 09:05:41 +0000 [thread overview]
Message-ID: <CAM3Ki75_3eNfMCh0Xuw3-SpRkEgB=garxBDB+t93c_a96AfDJA@mail.gmail.com> (raw)
In-Reply-To: <CAM3Ki76Fe-A2+nxaZeZt3rQ8P3m-wh9FmAsyoQ2Qp7WedUcoRA@mail.gmail.com>
(Sorry, I meant: "the large expression and <cond> can be eliminated")
On 11 March 2016 at 08:59, Mark Shinwell <mshinwell@janestreet.com> wrote:
> Markus: I think we should at least consider whether package management
> can help with multiple installations of libraries at different
> optimisation levels. As regards multiple files, I suppose it could be
> configurable, but I worry that for large source trees the overhead of
> having that many more compilation artifacts may be non-negligible.
> Perhaps another option would be to arrange the .cmx files so that they
> could be read without importing the full information for optimisation
> unless requested.
>
> Gerd: Unless you have unlimited source files, there shouldn't be
> unlimited code size blowup, because there are parameters that restrict
> inlining. In particular (unless the user forces behaviour via an
> attribute) there is always a calculation that weighs up the change in
> code size resulting from a proposed inlining against the expected
> runtime performance benefit based on which operations will be
> simplified away as a result of doing such inlining.
>
> Also, for a function like the one you gave containing:
>
> if <cond> then <small expr> else <big expr>
>
> one of the reasons this should be kept in the .cmx files is because,
> when the compiler comes to examine whether to inline it, it may be
> able to fully evaluate <cond>. In particular when it's true then the
> large expression can be eliminated completely (so long as <cond> is
> not side-effecting). Another example is functions containing a large
> match, where we may end up knowing which case is to be taken.
>
> Mark
>
> On 10 March 2016 at 22:51, Gerd Stolpmann <info@gerd-stolpmann.de> wrote:
>> Am Donnerstag, den 10.03.2016, 21:12 +0100 schrieb Pierre Chambart:
>>> It is realistic when using the -Oclassic option that Mark mentioned.
>>> By default the flambda inlining heuristic is decided at call site. Hence
>>> all the information about a function needs to be available to correctly
>>> decide. That means that the size of the cmx file is approximatively
>>> linearly related to the .o file size. It is not easy to decide that some
>>> function will never be inlined, so the information is always kept,
>>> even on function annotated with [@inline never].
>>
>> This assumes that the user is fine with an unlimited code size blow-up.
>> So, to make an example, when you have
>>
>> let f() =
>> if <expr1> then <short-expr2> else <very-long-expr3>
>>
>> there is the chance that the "if-then" part can be inlined and leads to
>> a speed-up at the price that the unproductive "else" part is also
>> inlined. In total, there is a good chance that you see some
>> acceleration. However, the question is whether the code duplication is
>> acceptable or not. I guess, you need to also draw a line at the callee
>> site, and disregard functions that are too large in total (though this
>> limit can be way higher than the limit for "classic" inlining).
>>
>> Surely this will also limit the cmx size somewhat.
>>
>> Gerd
>>
>>> But I wouldn't
>>> expect that to benefit that much. But for the -Oclassic mode where
>>> the decision is made at the definition, it is possible to decide not
>>> to include some information in the cmx. This is what happens in
>>> non-flambda mode, and in flambda mode it also reduce a bit the
>>> cmx size, but not as much as it could. This will probably improve
>>> in 4.04 if there is sufficient interest in this -Oclassic mode.
>>> --
>>> Pierre
>>>
>>> On 10/03/2016 16:32, Markus Mottl wrote:
>>> > Ok, that explains things. Is it realistic to assume that the size of
>>> > .cmx files can be substantially reduced? It seems there is a natural
>>> > tradeoff between "optimize well" and "compile fast". I suspect it may
>>> > be inevitable to add more compilation files. We actually already have
>>> > that situation with native code libraries: the .cmxa file is enough to
>>> > compile a project, but if the .cmx files of contained modules are
>>> > visible in the path, too, then, and only then, the compiler can and
>>> > will do cross-module inlining - which takes longer, of course.
>>> >
>>> > What about the following approach? - There is one "minimal" set of
>>> > compilation files that always allows you to quickly obtain a running
>>> > (albeit slow / large) executable. Additional compilation files then
>>> > monotonically augment this information and can be produced and
>>> > consumed optionally depending on compilation flags. The nice thing
>>> > about this approach is that you don't necessarily have to recompile
>>> > the whole project with different flags whenever you need a different
>>> > compile time / performance tradeoff. E.g. if Flambda information is
>>> > available for an unchanged file, you don't have to rebuild it when
>>> > needed. If you just want to compile quickly, you don't have to read
>>> > data you don't need. Separate compilation files would also integrate
>>> > much better with build tools (timestamping, etc.).
>>> >
>>> > I guess we would already be looking at OCaml version 5 for such a change :)
>>> >
>>> > On Thu, Mar 10, 2016 at 2:20 AM, Mark Shinwell <mshinwell@janestreet.com> wrote:
>>> >> By "enabled at configure time" I mean that you need to pass the
>>> >> "-flambda" option to the configure script when building the compiler.
>>> >>
>>> >> The main reason Flambda isn't enabled by default is because we need to
>>> >> do further work to improve compile-time performance. There are also
>>> >> concerns about .cmx file size. Flambda produces larger .cmx files: it
>>> >> stores the entire intermediate representation of the compilation unit
>>> >> so that no subsequent cross-module inlining decision is compromised.
>>> >>
>>> >> There is a mode, -Oclassic, which uses Flambda but mimics the
>>> >> behaviour of the existing compiler; unfortunately this isn't really
>>> >> fast enough yet either and .cmx sizes aren't small enough.
>>> >>
>>> >> When we manage to address some of these issues further, hopefully for
>>> >> 4.04, we will revisit whether Flambda should be enabled by default.
>>> >>
>>> >> One of the main reasons there is a configure option rather than a
>>> >> runtime switch is to avoid having to re-engineer the compiler's build
>>> >> system to permit multiple builds of the various libraries (the stdlib,
>>> >> for example) with differing options that affect what appears in the
>>> >> .cmx files (e.g. with and without Flambda). Even if code were used to
>>> >> allow Flambda to read non-Flambda .cmx files, performance degradation
>>> >> would result.
>>> >>
>>> >> Mark
>>> >>
>>> >> On 10 March 2016 at 01:43, Markus Mottl <markus.mottl@gmail.com> wrote:
>>> >>> I agree with Yotam. Assuming that Flambda produces correct code and
>>> >>> doesn't cause any serious performance issues either with the generated
>>> >>> code or with excessive compile times, I'd prefer building it into the
>>> >>> compiler by default. I'd be fine if I had to pass an extra flag at
>>> >>> compile time to actually run Flambda optimizers, but it should at
>>> >>> least be available. It doesn't have to be perfect to be useful.
>>> >>>
>>> >>> On Wed, Mar 9, 2016 at 8:32 PM, Yotam Barnoy <yotambarnoy@gmail.com> wrote:
>>> >>>> While we await the manual, can you explain what you mean by 'enabled at
>>> >>>> configure time'? Will a -flambda -O-something argument passed to the normal
>>> >>>> 4.03 compiler enable flambda optimizations? Flambda is clearly the star of
>>> >>>> the 4.03 release, so not enabling it using command line options seems
>>> >>>> counter-intuitive (if this is the case).
>>> >>>>
>>> >>>> -Yotam
>>> >>>>
>>> >>>> On Wed, Mar 9, 2016 at 7:59 PM, Markus Mottl <markus.mottl@gmail.com> wrote:
>>> >>>>> I've just tested Flambda, and it seems to already be doing a pretty
>>> >>>>> decent job on some non-trivial examples (e.g. inlining combinations of
>>> >>>>> functors and first class functions). I hope there will be a stable
>>> >>>>> 4.03 OPAM switch that enables it. I'm looking forward to being able
>>> >>>>> to write more elegant, abstract code that's still efficient.
>>> >>>>>
>>> >>>>> Regards,
>>> >>>>> Markus
>>> >>>>>
>>> >>>>> On Wed, Mar 9, 2016 at 2:14 AM, Mark Shinwell <mshinwell@janestreet.com>
>>> >>>>> wrote:
>>> >>>>>> It will not be enabled by default in 4.03. For the majority of
>>> >>>>>> programs, in the current state, it should improve performance (mainly
>>> >>>>>> by lowering allocation). It should never generate wrong code.
>>> >>>>>> However we know of examples that don't improve as much as we would
>>> >>>>>> like, which we will try to address for 4.04.
>>> >>>>>>
>>> >>>>>> There will be a draft version of the new Flambda manual chapter
>>> >>>>>> available shortly (hopefully this week). Amongst other things this
>>> >>>>>> documents what you found about the configure options and the flags'
>>> >>>>>> operation.
>>> >>>>>>
>>> >>>>>> Mark
>>> >>>>>>
>>> >>>>>> On 9 March 2016 at 03:55, Markus Mottl <markus.mottl@gmail.com> wrote:
>>> >>>>>>> Hi Alain,
>>> >>>>>>>
>>> >>>>>>> I see, thanks. It was a little confusing, because the command line
>>> >>>>>>> options for tuning flambda were still available even without Flambda
>>> >>>>>>> being enabled.
>>> >>>>>>>
>>> >>>>>>> Will Flambda be enabled by default in OCaml 4.03 or is it still
>>> >>>>>>> considered to be too experimental? It could turn out to become one of
>>> >>>>>>> the most impactful new features in terms of how I write code.
>>> >>>>>>>
>>> >>>>>>> Regards,
>>> >>>>>>> Markus
>>> >>>>>>>
>>> >>>>>>> On Tue, Mar 8, 2016 at 5:53 PM, Alain Frisch <alain.frisch@lexifi.com>
>>> >>>>>>> wrote:
>>> >>>>>>>> Hi Markus,
>>> >>>>>>>>
>>> >>>>>>>> flambda needs to be enabled explicitly at configure time with the
>>> >>>>>>>> "-flambda"
>>> >>>>>>>> flag. The new optimizer will then be used unconditionally, and you
>>> >>>>>>>> can
>>> >>>>>>>> tweak it using command-line parameters passed to ocamlopt (see
>>> >>>>>>>> "ocamlopt
>>> >>>>>>>> -h").
>>> >>>>>>>>
>>> >>>>>>>>
>>> >>>>>>>> Alain
>>> >>>>>>>>
>>> >>>>>>>>
>>> >>>>>>>> On 08/03/2016 23:10, Markus Mottl wrote:
>>> >>>>>>>>> Hi,
>>> >>>>>>>>>
>>> >>>>>>>>> I'm trying out OCaml 4.03.0+beta1 right now and wanted to test
>>> >>>>>>>>> Flambda
>>> >>>>>>>>> optimizations. But looking at the generated assembly, it doesn't
>>> >>>>>>>>> seem
>>> >>>>>>>>> to be doing much if anything on the simple test examples that I
>>> >>>>>>>>> thought would benefit.
>>> >>>>>>>>>
>>> >>>>>>>>> To give an example of what I expected to see, lets consider this
>>> >>>>>>>>> code:
>>> >>>>>>>>>
>>> >>>>>>>>> -----
>>> >>>>>>>>> let map_pair f (x, y) = f x, f y
>>> >>>>>>>>>
>>> >>>>>>>>> let succ x = x + 1
>>> >>>>>>>>> let map_pair_succ1 pair = map_pair succ pair
>>> >>>>>>>>> let map_pair_succ2 (x, y) = succ x, succ y
>>> >>>>>>>>> -----
>>> >>>>>>>>>
>>> >>>>>>>>> I would have thought that the "succ" function would be inlined in
>>> >>>>>>>>> "map_pair_succ1" as the compiler would do for "map_pair_succ2".
>>> >>>>>>>>> But the generated code looks like this:
>>> >>>>>>>>>
>>> >>>>>>>>> -----
>>> >>>>>>>>> L101:
>>> >>>>>>>>> movq %rax, %rdi
>>> >>>>>>>>> movq %rdi, 8(%rsp)
>>> >>>>>>>>> movq %rbx, (%rsp)
>>> >>>>>>>>> movq 8(%rbx), %rax
>>> >>>>>>>>> movq (%rdi), %rsi
>>> >>>>>>>>> movq %rdi, %rbx
>>> >>>>>>>>> call *%rsi
>>> >>>>>>>>> L102:
>>> >>>>>>>>> movq %rax, 16(%rsp)
>>> >>>>>>>>> movq (%rsp), %rax
>>> >>>>>>>>> movq (%rax), %rax
>>> >>>>>>>>> movq 8(%rsp), %rbx
>>> >>>>>>>>> movq (%rbx), %rdi
>>> >>>>>>>>> call *%rdi
>>> >>>>>>>>> -----
>>> >>>>>>>>>
>>> >>>>>>>>> Is Flambda supposed to work out of the box with the current beta?
>>> >>>>>>>>> What flags or annotations should I use for testing? Any showcase
>>> >>>>>>>>> examples I should try out that are expected to be improved?
>>> >>>>>>>>>
>>> >>>>>>>>> Regards,
>>> >>>>>>>>> Markus
>>> >>>>>>>>>
>>> >>>>>>>
>>> >>>>>>>
>>> >>>>>>> --
>>> >>>>>>> Markus Mottl http://www.ocaml.info markus.mottl@gmail.com
>>> >>>>>>>
>>> >>>>>>> --
>>> >>>>>>> Caml-list mailing list. Subscription management and archives:
>>> >>>>>>> https://sympa.inria.fr/sympa/arc/caml-list
>>> >>>>>>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>>> >>>>>>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>>> >>>>>
>>> >>>>>
>>> >>>>> --
>>> >>>>> Markus Mottl http://www.ocaml.info markus.mottl@gmail.com
>>> >>>>>
>>> >>>>> --
>>> >>>>> Caml-list mailing list. Subscription management and archives:
>>> >>>>> https://sympa.inria.fr/sympa/arc/caml-list
>>> >>>>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>>> >>>>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>>> >>>>
>>> >>>
>>> >>>
>>> >>> --
>>> >>> Markus Mottl http://www.ocaml.info markus.mottl@gmail.com
>>> >
>>> >
>>>
>>>
>>
>> --
>> ------------------------------------------------------------
>> Gerd Stolpmann, Darmstadt, Germany gerd@gerd-stolpmann.de
>> My OCaml site: http://www.camlcity.org
>> Contact details: http://www.camlcity.org/contact.html
>> Company homepage: http://www.gerd-stolpmann.de
>> ------------------------------------------------------------
>>
next prev parent reply other threads:[~2016-03-11 9:05 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-08 22:10 [Caml-list] " Markus Mottl
2016-03-08 22:53 ` Alain Frisch
2016-03-09 3:55 ` Markus Mottl
2016-03-09 7:14 ` Mark Shinwell
2016-03-10 0:59 ` Markus Mottl
2016-03-10 1:32 ` Yotam Barnoy
2016-03-10 1:43 ` Markus Mottl
2016-03-10 7:20 ` Mark Shinwell
2016-03-10 15:32 ` Markus Mottl
2016-03-10 15:49 ` Gabriel Scherer
2016-04-17 8:43 ` Jesper Louis Andersen
2016-04-17 8:59 ` Mohamed Iguernlala
2016-04-17 15:43 ` Markus Mottl
2016-03-10 20:12 ` [Caml-list] <DKIM> " Pierre Chambart
2016-03-10 21:08 ` Markus Mottl
2016-03-10 22:51 ` Gerd Stolpmann
2016-03-11 8:59 ` Mark Shinwell
2016-03-11 9:05 ` Mark Shinwell [this message]
2016-03-11 9:09 ` Alain Frisch
2016-03-11 9:26 ` Mark Shinwell
2016-03-11 14:48 ` Yotam Barnoy
2016-03-11 15:09 ` Jesper Louis Andersen
2016-03-11 16:58 ` Markus Mottl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAM3Ki75_3eNfMCh0Xuw3-SpRkEgB=garxBDB+t93c_a96AfDJA@mail.gmail.com' \
--to=mshinwell@janestreet.com \
--cc=caml-list@inria.fr \
--cc=info@gerd-stolpmann.de \
--cc=markus.mottl@gmail.com \
--cc=pierre.chambart@laposte.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox