Benoit,

Always a pleasure working with you :)  If you have any questions or need
assistance you can IM me or talk on #jruby on irc.  Concurrency in
Ruby+Truffle is a pretty big missing item; so it will be great to see this
implemented.

-Tom


On Thu, Oct 2, 2014 at 7:26 AM, Benoit Daloze <erego...@gmail.com> wrote:

> Hello Charles and Thomas,
>
> On 31 August 2014 00:04, Thomas Wuerthinger <thomas.wuerthin...@oracle.com
> > wrote:
>
>> Thanks a lot, Charlie, for this very detailed feedback! In fact, this is
>> probably the most comprehensive feedback we’ve received for Truffle so far
>> :).
>>
>> There are some valid points, some points where I’d like to add a comment,
>> and some where Graal and Truffle may have been misunderstood. I’ll try to
>> address them in a similarly structured form:
>>
>> Regarding disadvantage 1 “AST is not enough”:
>> A. Yes, you need to provide specialisations for your operations for
>> better performance. This makes it harder to implement a Truffle AST
>> interpreter than a simple AST interpreter. It has however the advantage
>> that it gives you more predictable performance for the different usages of
>> your dynamic language operation. We are currently working on source code
>> visualisations for Truffle ASTs so that users can see what nodes are
>> specialised and to what types.
>> B. Yes, it is necessary to store your local variables in a Truffle frame
>> object. This object can however contain pointers to arbitrary extra data
>> necessary for your guest language.
>> C. We did a lot of improvements to Truffle, Graal, and also TruffleRuby
>> since January. Inlining works without any problems and independent of the
>> guest language, also in TruffleRuby.
>>
>> Regarding disadvantage 2 “Long startup and warmup times”:
>> The benefit of the system is absolutely *not* lost when the compiler
>> (Graal) and the Truffle guest language interpreter are AOT compiled. It
>> gives you decent startup and high peak. The interpreter is immediately
>> available in highly optimized machine code. Hot guest language methods are
>> dynamically compiled to machine code by the precompiled Graal.
>>
>> Regarding disadvantage 3 “Limited concurrency”:
>> There is no deeper reason why TruffleRuby is single threaded right now.
>> For sure none that has to do with the fundamentals of the Truffle approach.
>> We are planning to support 100% multi-threading also in TruffleRuby. One of
>> the explorations we are currently doing is to support guest language level
>> safepoints such that guest language developers themselves can easier deal
>> with concurrency without compromising any peak performance.
>>
>
> I plan to work on concurrency in Truffle during my PhD in Linz.
> Making Truffle thread-safe is a priority and some work is already done for
> AST replacements.
> I am also interested in supporting different concurrency primitives such
> as threads and fibers for the guest languages.
>
> Benoit
>
> Regarding disadvantage 4 “Limited availability”:
>> Yes, this is indeed a chicken and egg problem. Truffle is however not as
>> closely tied to Graal as you suggest here. I believe that it is fairly
>> straightforward to create a Truffle front-end for C2 (or any other compiler
>> supporting deoptimization). There are only 3k LOC in Graal that are
>> specific to Truffle. I think that they could be ported in a reasonable time
>> frame. The Truffle interpreters themselves run on any Java system even if
>> it has only very limited features - this is actually an advantage over a
>> pure bytecode generation approach. They can also be AOT compiled for
>> devices that do not support a full JVM and have strong footprint
>> requirements. This would of course be slower execution than in a full
>> fledged VM, but it would at least run correctly. I furthermore think that
>> it is possible to do the Truffle partial evaluation via bytecode generation
>> for backwards compatibility.
>>
>> Regarding disadvantage 5 "Unclear benefits for real-world applications”:
>> This kind of argument can hardly be countered before a system is 100%
>> finished and shipped. The term “real world” is also somewhat loosely
>> defined. I would very much support the development of a JRuby benchmark
>> suite that tries to reflect “real world” as close as possible.
>> There is absolutely no reason to believe that a Truffle-based Ruby
>> implementation would not have benefits for “real-world applications”. Or
>> that it would not be able to run a large application for a long time. It is
>> clear that the TruffleRuby prototype needs more completeness work both at
>> the language and the library level. We are very happy with the results we
>> got so far with Chris working for about a year. We are planning to increase
>> the number of people working on this, and would also be grateful for any
>> help we can get from the Ruby community.
>>
>> Regarding Graal:  Did you ever try to benchmark JRuby without Truffle
>> with the latest Graal binaries available at
>> http://lafo.ssw.uni-linz.ac.at/builds/? We would be looking forward to
>> see the peak performance results on a couple of workloads. We are not
>> speculating about Graal becoming part of a particular OpenJDK release (as
>> experimental or regular option). This is the sovereign decision of the
>> OpenJDK community. All we can do is to demonstrate and inform about Graal’s
>> performance and stability.
>>
>> We recognise that there is a long road ahead. But in particular in this
>> context, I would like to emphasize that we are looking for more people to
>> support this effort for a new language implementation platform. I strongly
>> believe that Truffle is the best currently available vehicle to make Ruby
>> competitive in terms of performance with node.js. We are happy to try to
>> *prove* you wrong - even happier about support of any kind along the road
>> ;). I am also looking forward to continue this discussion at JavaOne (as
>> part of the TruffleRuby session or elsewhere).
>>
>> Regards, thomas
>>
>> On 30 Aug 2014, at 21:21, Charles Oliver Nutter <head...@headius.com>
>> wrote:
>>
>> > Removing all context, so it's clear this is just my opinions and
>> thoughts...
>> >
>> > As most of you know, we've opened up our codebase and incorporated the
>> > graciously-donated RubyTruffle directly into JRuby. It's available on
>> > JRuby master and we are planning to ship Truffle support with JRuby
>> > 9000, our next major version (due out in the next couple months).
>> >
>> > At the same time, we have been developing our own next-gen IR-based
>> > compiler, which will run unmodified on any JVM (with or without
>> > invokedynamic, though I still have to implement the "without" side).
>> > Why are we doing this when Truffle shows such promise?
>> >
>> > I'll try to enumerate the benefits and problems of Truffle here.
>> >
>> > * Benefits of using Truffle
>> >
>> > 1. Simpler implementation.
>> >
>> > From day 1, the most obvious benefit of Truffle is that you just have
>> > to write an AST interpreter. Anyone who has implemented a programming
>> > language can do this easily. This specific benefit doesn't help us
>> > implement JRuby, since we already have an AST interpreter, but it did
>> > make Chris Seaton's job easier building RubyTruffle initially. This
>> > also means a Truffle-based language is more approachable than one with
>> > a complicated compiler pipeline of its own.
>> >
>> > 2. Better communication with the JIT.
>> >
>> > Truffle, via Graal, has potential to pass much more information on to
>> > the JIT. Things like type shape, escaped references, frame access,
>> > type specialization, and so on can be communicated directly, rather
>> > than hoping and praying they'll be inferred by the shape of bytecodes.
>> > This is probably the largest benefit; much of my time optimizing JRuby
>> > has been spend trying to "trick" C2 into doing the right thing, since
>> > I don't have a direct way to communicate intent.
>> >
>> > The peak performance numbers for Truffle-based languages have been
>> > extremely impressive. If it's possible to get those numbers reasonably
>> > quickly and with predictable steady-state behavior in large,
>> > heterogeneous codebases, this is definitely the quickest path (on any
>> > runtime) to a high-performance language implementation.
>> >
>> > 3. OSS and pure Java
>> >
>> > Truffle and Graal are just OpenJDK projects under OpenJDK licenses,
>> > and anyone can build, hack, or distribute them. In addition, both
>> > Truffle and Graal are 100% Java, so for the first time a plain old
>> > Java developer can see (and manipulate) exactly how the JIT works
>> > without getting lost in a sea of plus plus.
>> >
>> > * Problems with Truffle
>> >
>> > I want to emphasize that regardless of its warts, we love Truffle and
>> > Graal and we see great potential here. But we need a dose of reality
>> > once in a while, too.
>> >
>> > 1. AST is not enough.
>> >
>> > In order to make that AST fly, you can't just implement a dumb generic
>> > interpreter. You need to know about (and generously annotate your AST
>> > for) many advanced compiler optimization techniques:
>> >
>> > A. Type specialization plus guarded fallbacks: Truffle will NOT
>> > specialize your code for you. You must provide every specialized path
>> > in your AST nodes as well as annotating "slow path", "transfer to
>> > interpreter", etc.
>> >
>> > B. Frame access and reification: In order to have cross-call access to
>> > frames or to squash frames created for multiple inlined calls, you
>> > must use Truffle's representation of a frame. This means loads/stores
>> > within your AST must be done against a Truffle object, not against an
>> > arbitrary object of your own creation.
>> >
>> > C. Method invocation and inlining: Up until fairly recently, if you
>> > wanted to inline methods you had to essentially build your own call
>> > site logic, profiling, deopt paths within your Truffle AST. When I did
>> > a little hacking on RubyTruffle around OSS time (December/January) it
>> > did *no* inlining of Ruby-to-Ruby calls. I hacked in inlining using
>> > existing classes and managed to get it to work, but I was doing all
>> > the plumbing myself. I know this has improved in the Truffle codebase
>> > since then, but I have my concerns about production readiness when the
>> > inlining call site parts of Truffle were just recently added and are
>> > still in flux.
>> >
>> > And there's plenty of other cases. Building a basic language for
>> > Truffle is pretty easy (I did a micro-language in about two hours at
>> > JVMLS last year), but building a high-performance language for Truffle
>> > still takes a fair investment of effort and working knowledge of
>> > dynamic compiler optimizations.
>> >
>> > 2. Long startup and warmup times.
>> >
>> > As Thomas pointed out in the other thread, because Truffle and Graal
>> > are normally run as plain Java libraries, they can actually aggravate
>> > startup time issues. Now, not only would all of JRuby have to warm up,
>> > but the eventual native code JIT has to warm up too. This is not
>> > surprising, really. It is possible to mitigate this by doing some form
>> > of AOT against Graal, but for every case I have seen the Truffle/Graal
>> > approach makes startup time much, much worse compared to just running
>> > atop JVM.
>> >
>> > Warmup time is also worsened significantly.
>> >
>> > The AST you create for Truffle must be heavily mutated while running
>> > in order to produce a specialized version of that AST. This must
>> > happen before the AST is eventually fed into Graal, which means you
>> > have a self-modifying interpreter spinning AST objects like mad while
>> > executing the early phases of your application. Compare to a dumb
>> > interpreter as in JRuby's old AST, where interpreting the AST produces
>> > no additional objects other than those necessary for execution of the
>> > code.
>> >
>> > The Truffle approach itself adds overhead too. Until optimized, the
>> > fully-reified frame objects, specialization markup (which triggers AST
>> > rewriting), deoptimization guards, and so on are all done manually
>> > against heap-level data structures. This is in addition to the
>> > JVM-level overhead of executing an AST (native frame-per-node, boxing
>> > and type-widening, poor inlining profile).
>> >
>> > Some amount of AOT *might* be applicable here, but the benefit of
>> > Truffle and Graal is lost in the AOT case if we're not getting
>> > real-world profile information. The Substrate VM has ben brought up to
>> > aid startup and warmup too...but that direction produces a
>> > closed-world executable based on optimizing all code up front...not
>> > exactly what we're looking for in a general-purpose language runtime.
>> >
>> > 3. Limited concurrency
>> >
>> > The RubyTruffle runtime currently has to execute code under the
>> > watchful eye of a global lock. Yes, you read that right...RubyTruffle
>> > is single-threaded right now.
>> >
>> > I would like to know if there's a deeper reason for this, but the
>> > obvious shallow reason is that you can't have multiple threads
>> > executing at the same time if they're making thread-unsafe mutations
>> > to the executing code. This is similar to the major stumbling block
>> > for e.g. Pypy, which rewrites currently-executing assembly
>> > instructions at deopt/reopt safe points.
>> >
>> > I believe once the code has transitioned to native, you can execute
>> > that safely across threads...but this is opaque to your Truffle-based
>> > language, and it's unclear how you'd manage re-acquiring some sort of
>> > lock when transferring back to the interpreter.
>> >
>> > The fact that concurrency has so far been hand-waved (or so it seems
>> > to me from the outside) scares the living hell out of me, especially
>> > when there's talk about rolling this stuff into Java 9.
>> >
>> > Obviously some of this could be mitigated with an immutable AST
>> > structure or other thread-friendly tree-transformation algorithm, but
>> > making the Truffle AST thread-safe may also make it even more
>> > object-heavy during interpretation, aggravating startup time further.
>> >
>> > 4. Limited availability
>> >
>> > This is the chicken-and-egg issue. Truffle is just a library, so we
>> > can ignore that for the moment (given any JVM, you can run a Truffle
>> > language).
>> >
>> > Graal is required for Truffle to perform well at all. The Truffle
>> > interpreter is without a doubt the slowest interpreter we've ever had
>> > for JRuby, and that's saying something (there could be startup/warmup
>> > effects in play here too). In order for us to go 100% Truffle, we'd
>> > need a Graal VM. That limits us to either pre-release or hand-made
>> > builds of Graal/OpenJDK. Even if Graal somehow did get into Java 9,
>> > we'd still have legions of users on 8, 7, ... even 6 in some cases,
>> > though we're probably leaving them behind with JRuby 9000. Ignoring
>> > other platforms (non-OpenJDK, Android) and assuming Graal in Java 9,
>> > I'd conservatively estimate JRuby could still not go 100% Truffle
>> > until 2017 or later.
>> >
>> > And it gets worse. Graal will probably never exist on other JVMs.
>> > Graal will probably never exist in an Android VM. Graal may not even
>> > be available in other non-Oracle OpenJDK derivatives for a very long
>> > time. We have users on dozens of different platform/JVM combinations,
>> > so there's really no practical way for us to abandon our JVM bytecode
>> > runtimes in the near future.
>> >
>> > Now of course if Graal became essential to users, it would be
>> > available in more places. We recognize the potential of Truffle and
>> > Graal, which is why we've been thrilled to work with Oracle on a
>> > RubyTruffle that's part of JRuby. We also recognize that the
>> > Truffle/Graal approach has some very compelling features for our
>> > users, and that our users may often be comfortable running custom
>> > JVMs. We're allowing all flowers to bloom and our users will pick the
>> > ones that work for them.
>> >
>> > 5. Unclear benefits for real-world applications
>> >
>> > There have been many published microbenchmarks for Truffle-based
>> > languages, but very few benchmarks of real-world applications
>> > performing significantly better than custom-made VMs (JS versus V8).
>> > There have been practically no studies of a Truffle-based language
>> > running a large application for a long period of time...and by long I
>> > mean server-scale.
>> >
>> > Chris Seaton has pushed this forward recently for Ruby, getting
>> > general-purpose, numeric-heavy libraries to run and optimize very well
>> > (a png library and a psd library). Going deeper requires having more
>> > of the language's standard libraries to be available, and I believe
>> > this is where Chris has spent much of his time (RubyTruffle currently
>> > requires mostly-custom versions of JRuby's core classes...versions
>> > that Truffle can recognize, specialize, and escape-analyze away).
>> >
>> > * Conclusion
>> >
>> > I again want to emphasize that we think Truffle and Graal are really
>> > awesome technology. I spent years with my nose smooshed against the
>> > glass, watching the Pypy guys add optimizations I wanted and make good
>> > on their promise of "just implement an interpreter...we'll do the
>> > rest". Finally we have what I wanted: a Pypy for JVM (in Truffle) and
>> > an LLVM for JVM (in Graal). These are exciting times indeed.
>> >
>> > But reality steps in. There's a long road ahead.
>> >
>> > I think we need to separate the questions about Truffle from questions
>> > about Graal. Truffle is ultimately just a library that uses Graal.
>> >
>> > Graal is promising JIT technology. Graal is simpler than C2 and may be
>> > able to match or beat its performance. Graal provides a better way to
>> > communicate intent to the JIT. These facts are not in question.
>> >
>> > However, Graal is not (other than when used as the JVM's JIT) a JVM.
>> > Targeting Graal directly acts against the promise of a standard,
>> > platform-and-VM-agnostic bytecode -- and that's the promise that
>> > brought most of us here. Graal is not yet ready to replace C2, which
>> > would mean adding to the size and complexity of Java 9. And Graal is
>> > almost completely untested in large production settings.
>> >
>> > I personally would love to see Graal get into a Java release soon as
>> > an experimental feature, but Java 9 seems ambitious but any standard.
>> > It *might* be possible/reasonable to include Graal as experimental in
>> > 9. Java 10 is certainly feasible for experimental, and may be feasible
>> > for product. But even if Graal got into mainstream OpenJDK and Java,
>> > there's a very long adoption tail ahead.
>> >
>> > I'd like to hear more from folks on the Graal and Truffle teams. Prove
>> > me wrong :-)
>> >
>> > - Charlie
>> > _______________________________________________
>> > mlvm-dev mailing list
>> > mlvm-dev@openjdk.java.net
>> > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>>
>>
>
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev@openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>
>


-- 
blog: http://blog.enebo.com       twitter: tom_enebo
mail: tom.en...@gmail.com
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to