[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