Skip to content
  • Jonathan Peyton's avatar
    [OpenMP] Introduce hierarchical scheduling · f6399367
    Jonathan Peyton authored
    This patch introduces the logic implementing hierarchical scheduling.
    First and foremost, hierarchical scheduling is off by default
    To enable, use -DLIBOMP_USE_HIER_SCHED=On during CMake's configure stage.
    This work is based off if the IWOMP paper:
    "Workstealing and Nested Parallelism in SMP Systems"
    
    Hierarchical scheduling is the layering of OpenMP schedules for different layers
    of the memory hierarchy. One can have multiple layers between the threads and
    the global iterations space. The threads will go up the hierarchy to grab
    iterations, using possibly a different schedule & chunk for each layer.
    
    [ Global iteration space (0-999) ]
    
    (use static)
    [ L1 | L1 | L1 | L1 ]
    
    (use dynamic,1)
    [ T0 T1 | T2 T3 | T4 T5 | T6 T7 ]
    
    In the example shown above, there are 8 threads and 4 L1 caches begin targeted.
    If the topology indicates that there are two threads per core, then two
    consecutive threads will share the data of one L1 cache unit. This example
    would have the iteration space (0-999) split statically across the four L1
    caches (so the first L1 would get (0-249), the second would get (250-499), etc).
    Then the threads will use a dynamic,1 schedule to grab iterations from the L1
    cache units. There are currently four supported layers: L1, L2, L3, NUMA
    
    OMP_SCHEDULE can now read a hierarchical schedule with this syntax:
    OMP_SCHEDULE='EXPERIMENTAL LAYER,SCHED[,CHUNK][:LAYER,SCHED[,CHUNK]...]:SCHED,CHUNK
    And OMP_SCHEDULE can still read the normal SCHED,CHUNK syntax from before
    
    I've kept most of the hierarchical scheduling logic inside kmp_dispatch_hier.h
    to try to keep it separate from the rest of the code.
    
    Differential Revision: https://reviews.llvm.org/D47962
    
    llvm-svn: 336571
    f6399367
Loading