[LLVMdev] [RFC] Parallelization metadata and intrinsics in LLVM (for OpenMP, etc.)
Adve, Vikram Sadanand
vadve at illinois.edu
Tue Oct 2 07:28:25 PDT 2012
Hal, Andrey, Alexey,
>From the LLVM design viewpoint, there is a fundamental problem with both Hal's approach and the Intel approach: both are quite language-specific. OpenMP is a particular parallel language, with particular constructs (e.g., parallel regions) and semantics. LLVM is a language-neutral IR and infrastructure and OpenMP-specific concepts should not creep into it. I've included an excerpt from Hal's proposal below, which shows what I mean: the design is couched in terms of OpenMP parallel regions. Other parallel languages, e.g, Cilk, have no such notion. The latest Intel proposal is at least as OpenMP-specific.
I do agree with the general goal of trying to support parallel programming languages in a more first-class manner in LLVM than we do today. But the right approach for that is to be as language-neutral as possible. For example, any parallelism primitives in the LLVM IR and any LLVM- or machine-level optimizations that apply to parallel code should be applicable not only to OpenMP but also to languages like Cilk, Java/C#, and several others. I think "libraries" like Intel's TBB should be supported, too: they have a (reasonably) well-defined semantics, just like languages do, and are become widely used.
I also do not think LLVM metadata is the way to represent the primitives, because they are simply too fragile. But you don't have to argue that one with me :-), others have argued this already. You really need more first class, language-neutral, LLVM mechanisms for parallelism. I'm not pretending I know how to do this, though there are papers on the subject, including one from an Intel team (Pillar: A Parallel Implementation Language, LCPC 2007).
--Vikram
Professor, Computer Science
University of Illinois at Urbana-Champaign
http://llvm.org/~vadve
> To mark this function as a parallel region, a module-level 'parallel'
> metadata entry is created. The call site(s) of this function are marked
> with this metadata,. The metadata has entries:
> - The string "region"
> - A reference to the parallel-region function
> - If applicable, a list of metadata references specifying
> special-handling child regions (parallel loops and serialized/critical
> regions)
>
> If the special-handling region metadata is no longer referenced by code
> within the parallel region, then the region has become invalid, and
> will be removed (meaning all parallelization metadata will be removed)
> by the ParallelizationCleanup. The same is true for all other
> cross-referenced metadata below.
>
> Note that parallel regions can be nested.
>
> As a quick example, something like:
> int main() {
> int a;
> #pragma omp parallel firstprivate(a)
> do_something(a)
> ...
> }
>
> becomes something like:
>
> define private void @parreg(i32 %a) {
> entry:
> call void @do_something(i32 %a)
> ret
> }
>
> define i32 @main() {
> entry:
> ...
> call void @parreg1(i32 %a) !parallel !0
> ...
>
> !0 = metadata !{ metadata !"region", @parreg }
>
--Vikram
Professor, Computer Science
University of Illinois at Urbana-Champaign
http://llvm.org/~vadve
More information about the llvm-dev
mailing list