Stop using precompiled headers for Linux?
Ioi Lam
ioi.lam at oracle.com
Thu Nov 1 23:53:32 UTC 2018
Maybe precompiled.hpp can be periodically (weekly?) updated by a robot,
which parses the dependencies files generated by gcc, and pick the most
popular N files?
- Ioi
On 11/1/18 4:38 PM, David Holmes wrote:
> It's not at all obvious to me that the way we use PCH is the
> right/best way to use it. We dump every header we think it would be
> good to precompile into precompiled.hpp and then only ask gcc to
> precompile it. That results in a ~250MB file that has to be read into
> and processed for every source file! That doesn't seem very efficient
> to me.
>
> Cheers,
> David
>
> On 2/11/2018 3:18 AM, Erik Joelsson wrote:
>> Hello,
>>
>> My point here, which wasn't very clear, is that Mac and Linux seem to
>> lose just as much real compile time. The big difference in these
>> tests was rather the number of cpus in the machine (32 threads in the
>> linux box vs 8 on the mac). The total amount of work done was
>> increased when PCH was disabled, that's the user time. Here is my
>> theory on why the real (wall clock) time was not consistent with user
>> time between these experiments can be explained:
>>
>> With pch the time line (simplified) looks like this:
>>
>> 1. Single thread creating PCH
>> 2. All cores compiling C++ files
>>
>> When disabling pch it's just:
>>
>> 1. All cores compiling C++ files
>>
>> To gain speed with PCH, the time spent in 1 much be less than the
>> time saved in 2. The potential time saved in 2 goes down as the
>> number of cpus go up. I'm pretty sure that if I repeated the
>> experiment on Linux on a smaller box (typically one we use in CI),
>> the results would look similar to Macosx, and similarly, if I had
>> access to a much bigger mac, it would behave like the big Linux box.
>> This is why I'm saying this should be done for both or none of these
>> platforms.
>>
>> In addition to this, the experiment only built hotspot. If you we
>> would instead build the whole JDK, then the time wasted in 1 in the
>> PCH case would be negated to a large extent by other build targets
>> running concurrently, so for a full build, PCH is still providing value.
>>
>> The question here is that if the value of PCH isn't very big, perhaps
>> it's not worth it if it's also creating as much grief as described
>> here. There is no doubt that there is value however. And given the
>> examination done by Magnus, it seems this value could be increased.
>>
>> The main reason why we haven't disabled PCH in CI before this. We
>> really really want to get CI builds fast. We don't have a ton of over
>> capacity to just throw at it. PCH made builds faster, so we used
>> them. My other reason is consistency between builds. Supporting
>> multiple different modes of building creates the potential for
>> inconsistencies. For that reason I would definitely not support
>> having PCH on by default, but turned off in our CI/dev-submit. We
>> pick one or the other as the official build configuration, and we
>> stick with the official build configuration for all builds of any
>> official capacity (which includes CI).
>>
>> In the current CI setup, we have a bunch of tiers that execute one
>> after the other. The jdk-submit currently only runs tier1. In tier2
>> I've put slowdebug builds with PCH disabled, just to help verify a
>> common developer configuration. These builds are not meant to be used
>> for testing or anything like that, they are just run for
>> verification, which is why this is ok. We could argue that it would
>> make sense to move the linux-x64-slowdebug without pch build to tier1
>> so that it's included in dev-submit.
>>
>> /Erik
>>
>> On 2018-11-01 03:38, Magnus Ihse Bursie wrote:
>>>
>>>
>>> On 2018-10-31 00:54, Erik Joelsson wrote:
>>>> Below are the corresponding numbers from a Mac, (Mac Pro (Late
>>>> 2013), 3.7 GHz, Quad-Core Intel Xeon E5, 16 GB). To be clear, the
>>>> -npch is without precompiled headers. Here we see a slight
>>>> degradation when disabling on both user time and wall clock time.
>>>> My guess is that the user time increase is about the same, but
>>>> because of a lower cpu count, the extra load is not as easily covered.
>>>>
>>>> These tests were run with just building hotspot. This means that
>>>> the precompiled header is generated alone on one core while nothing
>>>> else is happening, which would explain this degradation in build
>>>> speed. If we were instead building the whole product, we would see
>>>> a better correlation between user and real time.
>>>>
>>>> Given the very small benefit here, it could make sense to disable
>>>> precompiled headers by default for Linux and Mac, just as we did
>>>> with ccache.
>>>>
>>>> I do know that the benefit is huge on Windows though, so we cannot
>>>> remove the feature completely. Any other comments?
>>>
>>> Well, if you show that it is a loss in time on macosx to disable
>>> precompiled headers, and no-one (as far as I've seen) has complained
>>> about PCH on mac, then why not keep them on as default there? That
>>> the gain is small is no argument to lose it. (I remember a time when
>>> you were hunting seconds in the build time ;-))
>>>
>>> On linux, the story seems different, though. People experience PCH
>>> as a problem, and there is a net loss of time, at least on selected
>>> testing machines. It makes sense to turn it off as default, then.
>>>
>>> /Magnus
>>>
>>>>
>>>> /Erik
>>>>
>>>> macosx-x64
>>>> real 4m13.658s
>>>> user 27m17.595s
>>>> sys 2m11.306s
>>>>
>>>> macosx-x64-npch
>>>> real 4m27.823s
>>>> user 30m0.434s
>>>> sys 2m18.669s
>>>>
>>>> macosx-x64-debug
>>>> real 5m21.032s
>>>> user 35m57.347s
>>>> sys 2m20.588s
>>>>
>>>> macosx-x64-debug-npch
>>>> real 5m33.728s
>>>> user 38m10.311s
>>>> sys 2m27.587s
>>>>
>>>> macosx-x64-slowdebug
>>>> real 3m54.439s
>>>> user 25m32.197s
>>>> sys 2m8.750s
>>>>
>>>> macosx-x64-slowdebug-npch
>>>> real 4m11.987s
>>>> user 27m59.857s
>>>> sys 2m18.093s
>>>>
>>>>
>>>> On 2018-10-30 14:00, Erik Joelsson wrote:
>>>>> Hello,
>>>>>
>>>>> On 2018-10-30 13:17, Aleksey Shipilev wrote:
>>>>>> On 10/30/2018 06:26 PM, Ioi Lam wrote:
>>>>>>> Is there any advantage of using precompiled headers on Linux?
>>>>>> I have measured it recently on shenandoah repositories, and
>>>>>> fastdebug/release build times have not
>>>>>> improved with or without PCH. Actually, it gets worse when you
>>>>>> touch a single header that is in PCH
>>>>>> list, and you end up recompiling the entire Hotspot. I would be
>>>>>> in favor of disabling it by default.
>>>>> I just did a measurement on my local workstation (2x8 cores x2 ht
>>>>> Ubuntu 18.04 using Oracle devkit GCC 7.3.0). I ran "time make
>>>>> hotspot" with clean build directories.
>>>>>
>>>>> linux-x64:
>>>>> real 4m6.657s
>>>>> user 61m23.090s
>>>>> sys 6m24.477s
>>>>>
>>>>> linux-x64-npch
>>>>> real 3m41.130s
>>>>> user 66m11.824s
>>>>> sys 4m19.224s
>>>>>
>>>>> linux-x64-debug
>>>>> real 4m47.117s
>>>>> user 75m53.740s
>>>>> sys 8m21.408s
>>>>>
>>>>> linux-x64-debug-npch
>>>>> real 4m42.877s
>>>>> user 84m30.764s
>>>>> sys 4m54.666s
>>>>>
>>>>> linux-x64-slowdebug
>>>>> real 3m54.564s
>>>>> user 44m2.828s
>>>>> sys 6m22.785s
>>>>>
>>>>> linux-x64-slowdebug-npch
>>>>> real 3m23.092s
>>>>> user 55m3.142s
>>>>> sys 4m10.172s
>>>>>
>>>>> These numbers support your claim. Wall clock time is actually
>>>>> increased with PCH enabled, but total user time is decreased. Does
>>>>> not seem worth it to me.
>>>>>>> It's on by default and we keep having
>>>>>>> breakage where someone would forget to add #include. The latest
>>>>>>> instance is JDK-8213148.
>>>>>> Yes, we catch most of these breakages in CIs. Which tells me
>>>>>> adding it to jdk-submit would cover
>>>>>> most of the breakage during pre-integration testing.
>>>>> jdk-submit is currently running what we call "tier1". We do have
>>>>> builds of Linux slowdebug with precompiled headers disabled in
>>>>> tier2. We also build solaris-sparcv9 in tier1 which does not
>>>>> support precompiled headers at all, so to not be caught in
>>>>> jdk-submit you would have to be in Linux specific code. The
>>>>> example bug does not seem to be that. Mach5/jdk-submit was down
>>>>> over the weekend and yesterday so my suspicion is the offending
>>>>> code in this case was never tested.
>>>>>
>>>>> That said, given that we get practically no benefit from PCH on
>>>>> Linux/GCC, we should probably just turn it off by default for
>>>>> Linux and/or GCC. I think we need to investigate Macos as well here.
>>>>>
>>>>> /Erik
>>>>>> -Aleksey
>>>>>>
>>>>>
>>>>
>>>
>>
More information about the build-dev
mailing list