[llvm-dev] Multi-Threading Compilers

Nicholas Krause via llvm-dev llvm-dev at lists.llvm.org
Sat Feb 29 16:00:53 PST 2020



On 2/29/20 6:17 PM, River Riddle via llvm-dev wrote:
>
>
> On Sat, Feb 29, 2020 at 2:25 PM David Blaikie via llvm-dev 
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
>
>
>     On Sat, Feb 29, 2020 at 2:19 PM Chris Lattner <clattner at nondot.org
>     <mailto:clattner at nondot.org>> wrote:
>
>         On Feb 29, 2020, at 2:08 PM, David Blaikie <dblaikie at gmail.com
>         <mailto:dblaikie at gmail.com>> wrote:
>>
>>             I've
>>             curious as
>>             to how MLIR deals with IPO as that's the problem I was
>>             running into.
>>
>>
>>         FWIW I believe LLVM's new pass manager (NPM) was designed
>>         with parallelism and the ability to support this situation
>>         (that MLIR doesn't? Or doesn't to the degree/way in which the
>>         NPM does). I'll leave it to folks (Chandler probably has the
>>         most context here) to provide some more detail there if they
>>         can/have time.
>
>         Historically speaking, all of the LLVM pass managers have been
>         designed to support multithreaded compilation (check out the
>         ancient history of the WritingAnLLVMPass
>         <http://llvm.org/docs/WritingAnLLVMPass.html> doc if curious).
>
>
>     I think the specific thing that might'v been a bit different in
>     the NPM was to do with analysis invalidation in a way that's more
>     parallelism friendly than the previous one - but I may be
>     misrepresenting/misundrstanding some of it.
>
>         The problem is that LLVM has global use-def chains on
>         constants, functions and globals, etc, so it is impractical to
>         do this.  Every “inst->setOperand” would have to be able to
>         take locks or use something like software transactional memory
>         techniques in their implementation.  This would be very
>         complicated and very slow.
>
>
>     Oh, yeah - I recall that particular limitation being discussed/not
>     addressed as yet.
>
>         MLIR defines this away from the beginning. This is a result of
>         the core IR design, not the pass manager design itself.
>
>
>     What does MLIR do differently here/how does it define that issue
>     away? (doesn't have use-lists built-in?)
>
>
> The major thing is that constants and global-like objects don't 
> produce SSA values and thus don't have use-lists. 
> https://mlir.llvm.org/docs/Rationale/#multithreading-the-compiler discusses 
> this a bit.
>
> For constants, the data is stored as an Attribute(context uniqued 
> metadata, have no use-list, not SSA). This attribute can either placed 
> in the attribute list(if the operand is always constant, like for the 
> value of a switch case), otherwise it must be explicitly materialized 
> via some operation. For example, the `std.constant 
> <https://mlir.llvm.org/docs/Dialects/Standard/#constant-operation>` 
> operation will materialize an SSA value from some attribute data.
>
> For references to functions and other global-like objects, we have a 
> non-SSA mechanism built around `symbols`. This is essentially using a 
> special attribute to reference the function by-name, instead of by ssa 
> value. You can find more information on MLIR symbols here 
> <https://mlir.llvm.org/docs/SymbolsAndSymbolTables/>.
>
> Along with the above, there is a trait that can be attached to 
> operations called `IsolatedFromAbove 
> <https://mlir.llvm.org/docs/Traits/#isolatedfromabove>`. This 
> essentially means that no SSA values defined above a region can be 
> referenced from within that region. The pass manager only allows 
> schedule passes on operations that have this property, meaning that 
> all pipelines are implicitly multi-threaded.
>
> The pass manager in MLIR was heavily inspired by the work on the new 
> pass manager in LLVM, but with specific constraints/requirements that 
> are unique to the design of MLIR. That being said, there are some 
> usability features added that would also make great additions to LLVM: 
> instance specific pass options and statistics, pipeline crash 
> reproducer generation, etc.
>
> Not sure if any of the above helps clarify, but happy to chat more if 
> you are interested.
>
> -- River
>
>     - Dave
>
River,
The big thing from my reading of the Pass Manager in MLIR is that it 
allows us to iterate through
a pass per function or module as a group allowing it to run in async. 
I've proposed this
on the GCC side:
https://gcc.gnu.org/ml/gcc/2020-02/msg00247.html

Its to walk through the IPA passes which are similar to analyze passes 
on the LLVM side.

Nick

>
>         -Chris
>
>     _______________________________________________
>     LLVM Developers mailing list
>     llvm-dev at lists.llvm.org <mailto: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/20200229/e718f5ca/attachment-0001.html>


More information about the llvm-dev mailing list