Hi Matt,

On Wed, Aug 19, 2015 at 4:05 PM, Matt Wilmas <php_li...@realplain.com>
wrote:

> Hi Dmitry,
>
> ----- Original Message -----
> From: "Dmitry Stogov"
> Sent: Monday, August 17, 2015
>
> This is good idea.
>> Some times ago I played with "hot" attribute, and didn't get any
>> improvement, but we really may get something with "cold".
>>
>
> It was cool to hear that. :-)  I just noticed the changes you commited,
> http://git.php.net/?p=php-src.git;a=commitdiff;h=71af54e5f6656af070e4dccd1470bb1376c89568


yeah, I got some time to try your idea :)


>
> What were your findings if you investigated deeper?  I later checked with
> Cachegrind, and after I first only tried "cold" on php_error_docref0, there
> were 85,000 more branch mispredicts on bench.php (hmm, and I didn't think
> it really used PHP functions much).  But when I also did
> zend_error[_noreturn], there was 20,000 fewer instructions (?) and 300,000
> fewer mispredicts (0.16%), so a distinct improvement. :-)
>

This doesn't make visible speed improvement for me, but even code size
reduction is good.


> So what about php_error_docref* stuff...?  Or any non-Zend functions.
>

Ut may make sense to add COLD attribute for some other function.


>
> I had only applied cold to the function declaration (not definition),
> since that's what the docs said about function attributes [1]...
>

For some internal functions we just don't have declarations. Anyway, the
patch works as expected.


>
> The macros: I noticed you made HOT cold and wondered about typo. :-)  Your
> fix only fixed it for the *non-GCC* #define, and I was going to mention
> that those should be empty anyway!  OK, see you just fixed that. ;-)
>
> BTW, the ZEND_ATTRIBUTE_UNUSED[_LABEL] ones aren't used anywhere --
> leftover from the initial FAST_ZPP patch.
>

yeah. it may be useful anyway.


>
> And speaking of typos: line 80 of zend.h has "#ifdef ZEND_NORETRUN_ALIAS"
> instead of NORETURN.
>

ops. thanks. I'll fix it.

Thanks. Dmitry.


>
> [1] https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
>
> Thanks. Dmitry.
>>
>
> Thanks,
> Matt
>
>
> On Mon, Aug 17, 2015 at 1:26 PM, Matt Wilmas <php_li...@realplain.com>
>> wrote:
>>
>> Hi Dmitry, all,
>>>
>>> Has it been considered to use __attribute__((cold)) on, for example,
>>> error-type functions?  I happened to notice this part about it in the GCC
>>> docs [1] a couple days ago: "The paths leading to calls of cold functions
>>> within code are marked as unlikely by the branch prediction mechanism."
>>>
>>> A while ago I figured that, technically, many if () conditions for errors
>>> could use UNEXPECTED(), but that would be overkill for each possible tiny
>>> advantage.  But that sort of happens automatically for conditions leading
>>> to "cold" functions! :^)
>>>
>>> I was thinking of widely-used functions like php_error_docref*,
>>> zend_error
>>> (and related); also noticed exception/throwing functions, or even
>>> zend_accel_error in opcache.
>>>
>>> I didn't do any profiling, just simply tried marking *only*
>>> php_error_docref0 cold.  With GCC 4.8, it reduced the size by almost 4 KB
>>> (-O2, --disable-all CLI).  And checking through the code, it did indeed
>>> move the calls around (e.g. out of fast path) in many cases compared to
>>> default (some cases didn't optimize more).
>>>
>>> Looks like more zend_error calls in VM that aren't already part of
>>> UNEXPECTED() conditions could be moved "out of the way" if marked cold...
>>>
>>> [1] https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
>>>
>>> Thoughts?
>>>
>>>
>>> Thanks,
>>> Matt
>>>
>>
>

Reply via email to