> I would be glad, if later we'll combine our experience and work on
JIT/AOT together.

This is obviously something I look forward too :)

Cheers
Joe

On Mon, Feb 16, 2015 at 8:00 AM, Joe Watkins <pthre...@pthreads.org> wrote:

> It's Monday morning, maybe I'm misunderstanding ...
>
> > we must already know where it's called from, so we should also know the
> types of passed arguments, then we may eliminate checks at all
>
> We'll always know the types of arguments at the call site surely ? It's
> knowing the types at the location being called that is important,
> and needed in order to eliminate checks, isn't it ?
>
> Cheers
> Joe
>
> On Mon, Feb 16, 2015 at 7:55 AM, Netroby <hufeng1...@gmail.com> wrote:
>
>> I guess we can gave a try. PHP 7 is fine well enough. let's working
>> hard to make it published.
>>
>> The talk about other things should be early . let's see PHP 7 released
>> and see how it will change our world.
>>
>> Code it , ship it. Let's see the result.
>>
>> Appreciate your time.
>> ----------------------------
>> Netroby
>>
>>
>> 2015-02-16 15:32 GMT+08:00 Dmitry Stogov <dmi...@zend.com>:
>> > On Mon, Feb 16, 2015 at 10:16 AM, Joe Watkins <pthre...@pthreads.org>
>> wrote:
>> >
>> >> Morning,
>> >>
>> >> I'm not sure where this conversation started ...
>> >>
>> >
>> > it's a fork from "Salar Type Hints"...
>> >
>> >
>> >>
>> >> > where in non-strict mode you still need
>> >> > to generation runtime conversion logic. That runtime conversion logic
>> >> > then requires the ability to hook into Zend's error handling
>> >> > mechanism, vastly complicating the generated code (and the generating
>> >> > code).
>> >>
>> >> Why do you need to generate conversion logic, why can't you call Zend
>> API
>> >> functions ?
>> >>
>> >
>> > Even VM just calls a conversion function.
>> >
>> > Alternatively, possibly preferably, wouldn't a guard to tell if the
>> >> function is being called in strict mode
>> >> be a good idea here ?
>> >>
>> >
>> > If we know what function is called in strict mode, we must already know
>> > where it's called from, so we should also know the types of passed
>> > arguments, then we may eliminate checks at all (independently on
>> > strictness). If we don't know the types we will need to check them
>> anyway.
>> >
>> >
>> >> If the generated code is really complicated and that sucks away the
>> >> performance
>> >> then why not just avoid it, and only enter machine code when a
>> function is
>> >> called in strict mode ?
>> >>
>> >> I see the assembly generated by your JIT, but it doesn't really tell us
>> >> much, it tells us a little,
>> >> what would be really useful is seeing your research, with the
>> >> understanding that it is just research.
>> >> Please think about that again.
>> >>
>> >
>> > Yeah, we will need to open it, even if it doesn't make gain for real
>> life.
>> > but lets make all the PHP7 related work first.
>> > I would be glad, if later we'll combine our experience and work on
>> JIT/AOT
>> > together.
>> >
>> > Thanks. Dmitry.
>> >
>> >
>> >>
>> >> Cheers
>> >> Joe
>> >>
>> >> On Mon, Feb 16, 2015 at 6:59 AM, Dmitry Stogov <dmi...@zend.com>
>> wrote:
>> >>
>> >>> On Mon, Feb 16, 2015 at 12:45 AM, Anthony Ferrara <
>> ircmax...@gmail.com>
>> >>> wrote:
>> >>>
>> >>> > Dmitry,
>> >>> >
>> >>> > On Sun, Feb 15, 2015 at 1:43 PM, Dmitry Stogov <dmi...@zend.com>
>> wrote:
>> >>> > > Hi Anthony,
>> >>> > >
>> >>> > > If you are working on JIT, you should understand that declare()
>> >>> switch to
>> >>> > > strict typing can't improve anything, because it works on caller
>> side
>> >>> > and in
>> >>> > > each function you now will have to generate code for both weak and
>> >>> strict
>> >>> > > checks.
>> >>> >
>> >>> > Well, if you know the destination function at compile time, you
>> don't
>> >>> > need to generate generic code. you can generate a direct dispatch
>> >>> > (asm-level function call).
>> >>>
>> >>>
>> >>> Right, but in real life app you almost never know what function or
>> method
>> >>> you are really call. At function you also can't be sure that it always
>> >>> called with proper arguments. This work well only for plain function
>> >>> placed
>> >>> into a single PHP file.
>> >>>
>> >>>
>> >>> >   In this case, strict lets you push type
>> >>> > checks back to compile time, where in non-strict mode you still need
>> >>> > to generation runtime conversion logic. That runtime conversion
>> logic
>> >>> > then requires the ability to hook into Zend's error handling
>> >>> > mechanism, vastly complicating the generated code (and the
>> generating
>> >>> > code).
>> >>> >
>> >>>
>> >>> For cases when you know the called function and all passed and
>> expected
>> >>> types, it's possible to use more efficient calling convention passing
>> real
>> >>> arguments in CPU registers.
>> >>>
>> >>> The type checks in PHP7 is quite cheap (2-3 CPU instructions). Strict
>> or
>> >>> weak check doesn't make any difference for "fast path" (the same 2-3
>> >>> instructions). The slow patch for weak checks is going to be a bit
>> more
>> >>> expensive.
>> >>>
>> >>>
>> >>> >
>> >>> > In fact, the research I have been doing is precisely around that
>> >>> > (where I know for a fact that all remaining function calls are going
>> >>> > to be typed, and compile the entire block at one time with direct
>> >>> > calls). So that way I never need to actually do even as much as a
>> FCC
>> >>> > to call a userland function. Which then lets me avoid generating
>> >>> > typing code (since I know the types). Which is why I'm advocating
>> for
>> >>> > strict, since that way we can treat an entire graph of function
>> calls
>> >>> > as strict and compile them all in one go (no need to even JIT at
>> >>> > runtime, just compile AOT).
>> >>> >
>> >>> > If your research has shown something different, care to share?
>> >>> >
>> >>>
>> >>> Very similar :), but in cases when we know the called function the
>> effect
>> >>> from type hinting is negligible. It's almost always possible to
>> generate
>> >>> optimal code without any hints.
>> >>>
>> >>> See code for fibo_r() from bench.php generated by our old JIT for
>> PHP-5.5
>> >>> (without type hinting):
>> >>> https://gist.github.com/dstogov/5f71d23f387332e9d77c
>> >>>
>> >>> Unfortunately, we didn't make the same for PHP7 yet.
>> >>> More important, in our experiments we saw improvements only on small
>> >>> benchmarks (e.g. 25 times on mandelbrot), but nothing on real-life
>> apps.
>> >>>
>> >>> So a some point, looking into ASM code that endlessly allocates and
>> frees
>> >>> zvals, we switched to engine re-factoring.
>> >>>
>> >>>
>> >>> >
>> >>> > > According to mandel() and integer to float conversion in the loop,
>> >>> it's
>> >>> > > possible to perform a backward data-propagation pass to catch this
>> >>> case
>> >>> > and
>> >>> > > replace integer by float in first place. We did it in our old JIT
>> >>> > prototypes
>> >>> > > without any type hinting. Also, don't use "fild", use SSE2 and/or
>> AVX.
>> >>> >
>> >>> > I did wind up doing a few passes to back-propagate the cast (among
>> >>> > other optimizations). But it's still a point that the conversions
>> >>> > aren't exactly cheap. But as I said before, that was a side-note and
>> >>> > not really an argument for/against strict typing. So worth
>> mentioning,
>> >>> > but shouldn't affect anyone's decision.
>> >>> >
>> >>> > Re fild vs SSE/AVX: that was up to the backend code generator we
>> were
>> >>> > using (libjit). It may be an open req against that lib to generate
>> the
>> >>> > different instruction, or perhaps it just failed a heuristic. We
>> were
>> >>> > working a level higher than the generated ASM, so not really 100%
>> sure
>> >>> > why it made that decision.
>> >>> >
>> >>>
>> >>> I saw a big speed difference between FPU and SSE2/AVX code on
>> bench.php,
>> >>> so
>> >>> if you may tell libjit to use SSE2/AVX - do it.
>> >>>
>> >>> Thanks. Dmitry.
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> >
>> >>> > Anthony
>> >>> >
>> >>>
>> >>
>> >>
>>
>
>

Reply via email to