[llvm-dev] [cfe-dev] RFC: Replacing the default CRT allocator on Windows
Mitch Phillips via llvm-dev
llvm-dev at lists.llvm.org
Tue Jul 7 14:03:54 PDT 2020
Bearing in mind that the ASan allocator isn't particularly suited to
detecting memory corruption unless you compile LLVM/Clang with ASan
instrumentation as well. I don't imagine anybody would be proposing making
the debug build for Windows be ASan-ified by default.
On Tue, Jul 7, 2020 at 1:49 PM Adrian McCarthy via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Asan and the Debug CRT take different approaches, but the problems they
> cover largely overlap.
>
> Both help with detection of errors like buffer overrun, double free, use
> after free, etc. Asan generally gives you more immediate feedback on
> those, but you pay a higher price in performance. Debug CRT lets you do
> some trade off between the performance hit and how soon it detects problems.
>
> Asan documentation says leak detection is experimental on Windows, while
> the Debug CRT leak detection is mature and robust (and can be nearly
> automatic in debug builds). By adding a couple calls, you can do finer
> grained leak detection than checking what remains when the program exits.
>
> Debug CRT lets you hook all of the malloc calls if you want, so you can
> extend it for your own types of tracking and bug detection. But I don't
> think that feature is often used.
>
> Windows's Appverifier is cool and powerful. I cannot remember for sure,
> but I think some of its features might depend on the Debug CRT. One thing
> it can do is simulate allocation failures so you can test your program's
> recovery code, but most programs nowadays assume memory allocation never
> fails and will just crash if it ever does.
>
> On Tue, Jul 7, 2020 at 10:25 AM Zachary Turner via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> Note that ASAN support is present on Windows now. Does the Debug CRT
>> provide any features that are not better served by ASAN?
>>
>> On Tue, Jul 7, 2020 at 9:44 AM Chris Tetreault via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>>> For release builds, I think this is fine. However for debug builds, the
>>> Windows allocator provides a lot of built-in functionality for debugging
>>> memory issues that I would be very sad to lose. Therefore, I would request
>>> that:
>>>
>>>
>>>
>>> 1. This be added as a configuration option to either select the new
>>> allocator or the windows allocator
>>> 2. The Windows allocator be used by default in debug builds
>>>
>>>
>>>
>>> Ideally, since you’re doing this work, you’d implement it in such a way
>>> that it’s fairly easy for anybody to use whatever allocator they want when
>>> building LLVM (on any platform, not just windows), and it’s not just
>>> hardcoded to system allocator vs whatever allocator ends up getting added.
>>> However, as long as I can use the windows debug allocator I’m happy.
>>>
>>>
>>>
>>> Thanks,
>>>
>>> Christopher Tetreault
>>>
>>>
>>>
>>> *From:* cfe-dev <cfe-dev-bounces at lists.llvm.org> *On Behalf Of *Alexandre
>>> Ganea via cfe-dev
>>> *Sent:* Wednesday, July 1, 2020 9:20 PM
>>> *To:* cfe-dev at lists.llvm.org; LLVM Dev <llvm-dev at lists.llvm.org>
>>> *Subject:* [EXT] [cfe-dev] RFC: Replacing the default CRT allocator on
>>> Windows
>>>
>>>
>>>
>>> Hello,
>>>
>>>
>>>
>>> I was wondering how folks were feeling about replacing the default
>>> Windows CRT allocator in Clang, LLD and other LLVM tools possibly.
>>>
>>>
>>>
>>> The CRT heap allocator on Windows doesn’t scale well on large core count
>>> machines. Any multi-threaded workload in LLVM that allocates often is
>>> impacted by this. As a result, link times with ThinLTO are extremely slow
>>> on Windows. We’re observing performance inversely proportional to the
>>> number of cores. The more cores the machines has, the slower ThinLTO
>>> linking gets.
>>>
>>>
>>>
>>> We’ve replaced the CRT heap allocator by modern lock-free thread-cache
>>> allocators such as rpmalloc (unlicence), mimalloc (MIT licence) or snmalloc
>>> (MIT licence). The runtime performance is an order of magnitude faster.
>>>
>>>
>>>
>>> Time to link clang.exe with LLD and -flto on 36-core:
>>>
>>> Windows CRT heap allocator: 38 min 47 sec
>>>
>>> mimalloc: 2 min 22 sec
>>>
>>> rpmalloc: 2 min 15 sec
>>>
>>> snmalloc: 2 min 19 sec
>>>
>>>
>>>
>>> We’re running in production with a downstream fork of LLVM + rpmalloc
>>> for more than a year. However when cross-compiling some specific game
>>> platforms we’re using other downstream forks of LLVM that we can’t change.
>>>
>>>
>>>
>>> Two questions arise:
>>>
>>> 1. The licencing. Should we embed one of these allocators into the
>>> LLVM tree, or keep them separate out-of-the-tree?
>>> 2. If the answer for above question is “yes”, given the tremendous
>>> performance speedup, should we embed one of these allocators into Clang/LLD
>>> builds by default? (on Windows only) Considering that Windows doesn’t have
>>> a LD_PRELOAD mechanism.
>>>
>>>
>>>
>>> Please see demo patch here: https://reviews.llvm.org/D71786
>>>
>>>
>>>
>>> Thank you in advance for the feedback!
>>>
>>> Alex.
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200707/515d771a/attachment.html>
More information about the llvm-dev
mailing list