darma: a software stack model for supporting asynchronous ... · darma design goal #1: flexible...

32
Sandia National Laboratories is a multi-program laboratory managed and operated by Sandia Corporation, a wholly owned subsidiary of Lockheed Martin Corporation, for the U.S. Department of Energy’s National Nuclear Security Administration under contract DE-AC04-94AL85 000. SAND NO. 2011-XXXXP DARMA: A software stack model for supporting asynchronous, data effects programming Jeremiah Wilke (PI), Jonathan Lifflander, David S. Hollman, Giulio Borghesi, Aram Markosyan, Robert L. Clay (PM) Unclassified Unlimited Release (UUR) SAND2017-12506 C

Upload: others

Post on 07-Oct-2020

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

1

Sandia National Laboratories is a multi-program laboratory managed and operated by Sandia Corporation, a wholly owned subsidiary of Lockheed Martin Corporation, for the U.S. Department of Energy’s National Nuclear Security Administration under contract DE-AC04-94AL85000. SAND NO. 2011-XXXXP

DARMA: A software stack model for supporting asynchronous, data effects programming

Jeremiah Wilke (PI), Jonathan Lifflander, David S. Hollman, Giulio Borghesi, Aram Markosyan, Robert L. Clay (PM)

Unclassified Unlimited Release (UUR)SAND2017-12506 C

Page 2: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

2

DARMA: Distributed, Asynchronous, Resilient Models for Applications

• Provide a programming model target that can express tasks with flexible granularity and their corresponding data effects

– Assumption: granularity control is the key to performance, data effects are critical to efficient task mapping and synchronization

– Corollary: explicit overdecomposition creates complicated multi-level code, obscures fundamental algorithm; programmer focus should be on “fundamental” unit of work and relationships (data effects) to other tasks

– Corollary: Amortize cost of overdecomposition through “elastic” tasks that can exploit data parallelism, decrease the ratio of tasks/cores

• Provide a programming model and semantic with race-free execution, but with flexible underlying execution model

– Assumption: programming focus should be task decomposition, not control structures; execution model should provide safe concurrency; scheduling heuristic must provide non-blocking and resource usage guarantees

2

Page 3: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

3

Application domains driving DARMA worldview are characterized by dynamic parallelism or complicated synchronization patterns

Unknown unknownsDynamic, rapidly changing parallelism. Load balancing not feasible

without dynamic load balancing across tasks

• Solid mechanics with multiscale physics• Particle-in-cell quiescence detection• Tree search• AMR with “fast” shockwave

Page 4: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

4

Application domains driving DARMA worldview are characterized by dynamic parallelism or complicated synchronization patterns

Known unknownsDynamic, but persistent behavior. Semi-static scheduling across phases

possible using timers/performance counters

• Particle-in-cell load balancing across patches

• Block-based sparse linear solvers with irregular sparsity

• AMR with “slow” shockwave

Page 5: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

5

Application domains driving DARMA worldview are characterized by dynamic parallelism or complicated synchronization patterns

Difficult knownsProblems known “statically” but flexible granularity needed for data

locality (e.g. tiling) or fine-grained synchronization

• Tiled-based linear algebra• Finite element matrix assembly• Complex chemistry

dpotrf

dtrsm

dgemm dsyrk

dpotrf

dtrsm

dgemmdsyrk

dpotrf

dtrsm

dsyrk

dpotrf

dtrsm

dsyrk

dgemm

dtrsm

dsyrk

dgemm

dtrsm

dsyrk

Page 6: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

6

DARMA provides data effects programming within C++

• Data effects help extract concurrency– Maintain sequential, imperative model for expressing

algorithms– Derive data flow and synchronization from data usage

relationships between tasks– Deterministic-by-default semantics based on sequential

task order

• Data effects programming puts focus on localityand granularity– Application-level focus should be on the right task

granularity to preserve locality and maximize parallelism– Granularity must be balanced against overheads

dpotrf

dtrsm

dgemm dsyrk

dpotrf

dtrsm

dgemmdsyrk

dpotrf

dtrsm

dsyrk

dpotrf

dtrsm

dsyrk

dgemm

dtrsm

dsyrk

dgemm

dtrsm

dsyrk

Page 7: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

7

DARMA design goal #1: Flexible granularity• Granularity (DARMA definition):

– Task size– Task shape – Task boundaries

• Choice of granularity is driven by– Data locality– Coarse-graining (limit synchronization)– Pipelining (limit delay of next steps)– Loops structured for fine-grained– Load balance

• Data locality and fine-grained (SMT-ish) parallelism are major exascale challenges– Data movement relatively more expensive– Hardware will accelerate fine-grained operations

• GPU, vectors hard enough with branchy code 7

Diamond/hexagonal tiling is classic example of data

locality driving task granularity

Hybrid Hexagonal/Classical Tiling for GPUs,Grosser, Sadayappan, et al; CGO ‘14

Page 8: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

8

Coarse-grained parallelism will increasingly be “epiphenomenon” of local task structure

8

• Data locality is a driving concern for task decomposition• Traversal order creates DOACROSS task parallelism between tiles

– Notion of DOACROSS parallelism existing concept from 90’s– DOALL + pt-2-pt inter-task synchronization constraints

• Flexible task granularity is a requirement of data locality, e.g.not the fundamental requirement itself

• Express ”fundamental” work unit targeted at main bottlenecks; let runtime (compiler?) distribute and aggregate

Page 9: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

9

DARMA Design Goal #1 (Corollary): Manage the complexity of multi-level parallelism in the programming model• Should each of boxes fit L1? L2? Be a thread? A

load balancing unit? An MPI rank?– Answer: Yes

• Programming should express fundamental units of work and their composition (as data effects)

• Tasks are shared-memory by default to minimize overhead, but hooks generated at compile-time for “promoting” to distributed memory

• Memoization of data effects as lightweight synchronization graph, exploit persistence whenever possible (as done in MPI)

Corollary : Manage overheads to keep tasks from being ”artificially” large

Page 10: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

10

DARMA Design Goal #2: Flexible, safe asynchronous programming model balancing breadth- and depth-first execution

• Particle-in-cell, tree-traversal problems are both branchy codes that create “holes” in parallel lanes– “Breadth-first” loop/tree traversal creates parallelism,

but loses locality– “Depth-first” loop/tree traversal preserves locality,

but loses parallelism

10

A(0,0) dpotrf

A(0,0) dtrsm A(1,0) dsyrk A(1,1)

dpotrf A(1,1)

dgemm A(1,2)

dgemm A(1,3)

dtrsm A(2,0)dsyrk

dgemm

dtrsm

A(3,0)

A(1,0)

A(2,0)

A(3,0)

A(1,1)

A(1,2)

A(2,2)

A(2,3)Running

(Ready tasks)

Scheduling(Analyze DAG)

Appending(New tasks)Active

threadTaskData

Page 11: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

11

DARMA provides data effects programming within C++void dpotrf(Tile& Aii);void dtrsm(const Tile& Aii, Tile& Aji); void dsyrk(const Tile& Aji, Tile& Ajj); void dgemm(const Tile& Aji, const Tile& Aki, Tile& Ajk);

int cholesky(…){ ... Matrix A(n,n,N); ... for (int i=0; i < n; ++i){ dpotrf(A(i,i)); for (int j=i+1; j < n; ++j){ dtrsm(A(i,i), A(j,i)); } for (int j=i+1; j < n; ++j){ dsyrk(A(j,i), A(j,j)); for (int k=j+1; k < n; ++k){ dgemm(A(j,i), A(k,i), A(j,k)); } } } return 0;}

dpotrf

dtrsm

dgemm dsyrk

dpotrf

dtrsm

dgemmdsyrk

dpotrf

dtrsm

dsyrk

dpotrf

dtrsm

dsyrk

dgemm

dtrsm

dsyrk

dgemm

dtrsm

dsyrk

Page 12: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

12

struct dpotrf{ operator()(Tile& Aii); };struct dtrsm{ operator()(const Tile& Aii, Tile& Aji); }; struct dsyrk{ operator()(const Tile& Aji, Tile& Ajj); }; struct dgemm{ operator()(const Tile& Aji, const Tile& Aki, Tile& Ajk); };

int cholesky(…){ ... DarmaMatrix A(n,n,N); ... for (int i=0; i < n; ++i){ create_work<dpotrf>(A(i,i)); for (int j=i+1; j < n; ++j){ create_work<dtrsm>(A(i,i), A(j,i)); } for (int j=i+1; j < n; ++j){ create_work<dsyrk>(A(j,i), A(j,j)); for (int k=j+1; k < n; ++k){ create_work<dgemm>(A(j,i), A(k,i), A(j,k)); } } } return 0;}

DARMA provides data effects programming within C++dpotrf

dtrsm

dgemm dsyrk

dpotrf

dtrsm

dgemmdsyrk

dpotrf

dtrsm

dsyrk

dpotrf

dtrsm

dsyrk

dgemm

dtrsm

dsyrk

dgemm

dtrsm

dsyrk

Page 13: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

13

Metaprogramming provides data effects directly within standards-compliant C++

Example Program

AccessHandle<int> my_data;

darma::create_work([=]{ my_data.set_value(29);});

darma::create_work( reads(my_data), [=]{ cout << my_data.get_value(); });

darma::create_work( reads(my_data), [=]{ cout << my_data.get_value(); });

darma::create_work([=]{ my_data.set_value(31);});

Modifymy_data

Readmy_data

Readmy_data

Modifymy_data

DAG (Directed Acyclic Graph)

These two tasks are concurrentand can be run in parallel by a DARMA backend

SequentialSemantics

• Data effects captured by using special C++ wrapper classesAccessHandle<T>

• Converting from data-centric programming to execution-centric backend requires dependency capture and dependency analysis

• Metaprogramming in headers embeds capture in access handles (what data used in task and how?)

• Metaprogramming in headers embeds analysis through task creation functions(relation between data used in task A to data used in task B?)

Semantics

Page 14: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

14

DARMA defines “asynchronous” semantics for C++

ContinuationA

ContinuationB

Closure1

Closure2

void start(AH<int> v){ … create_work(reads(v),[=]{ work(v); }); std::cout << v.get_value(); create_work([=]{ moreWork(v); });…

1

2

3

4

1234

Immediate = Scheduling = Read-onlyImmed = Read-only, Sched = ModifyImmediate = Scheduling = ModifyImmed = None, Sched = Modify

• DARMA defines variable asynchronous permissionswith two parts:• Immediate: What’s valid right now?• Scheduling: What’s valid in subtask?

• Permissions can be:• Modifiable (M)• Read-only (R)• None (N)

• DARMA semantics dictate how permissions change in closures and continuations

• Permissions are defined at language level (compile-time) regardless of execution order

• Semantics ensure deterministic-by-default (non-racy) code

Page 15: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

15

Semantics support flexible execution models in DARMA• Depth-first execution

– Emphasize locality, local work first– Defer continuation, execute subtask – Requires context switching

• Breadth-first execution– Increase parallelism and lookahead– Defer subtasks, execute continuation– No context switching required

init(a,b);

create_work([=]{

fxn(a,b);

create_work([=]{

subfxn(a,b);

});

});

init(c,d);

create_work([=]{

nextFxn(c,d);

});Breadth-firstexecution

Depth-firstexecution

ContinuationA

ContinuationB

Closure1

Closure2

create_work(reads(v),[=]{ work(v); }); std::cout << v.get_value(); create_work([=]{ moreWork(v); });…

1

Page 16: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

16

Semantics supports flexibility in execution model and therefore flexibility in backend runtime implementation

A(0,0) dpotrf

A(0,0) dtrsm A(1,0) dsyrk A(1,1)

dpotrf A(1,1)

dgemm A(1,2)

dgemm A(1,3)

dtrsm A(2,0)dsyrk

dgemm

dtrsm

A(3,0)

A(1,0)

A(2,0)

A(3,0)

A(1,1)

A(1,2)

A(2,2)

A(2,3)Running

(Ready tasks)

Scheduling(Analyze DAG)

Appending(New tasks)Active

threadTaskData

• Execution model supports any mix of depth/breadth-first (if architecture supports)

• Semantics allow concurrentand asynchronous:• Execution (running tasks) • Scheduling (analyzing DAG)• Creation (append new tasks)

Page 17: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

17

The programming/execution models are conceptual guides designed to express all available parallelism

Not all runtimes providethe same functionality

Application

DARMA

Runtime

OS/Hardware

Common APIacross runtimes

Common APIacross runtimes

Front End API(Application User)

Translation Layer

Back End API(Specification for Runtime)

Glue Code(Specific to each runtime)

DARMA software stack for community involvement in

development, best practices

Page 18: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

18

The programming/execution models are conceptual guides designed to express all available parallelism

Not all runtimes providethe same functionality

Application

DARMA

Runtime

OS/Hardware

Common APIacross runtimes

Common APIacross runtimes

Front End API(Application User)

Translation Layer

Back End API(Specification for Runtime)

Glue Code(Specific to each runtime)

Backend StatusCharm++ Tested at scale

MPI /OpenMP Prototype doneHPX Prototype done

Kokkos(on-node)

In progress

std::threads(on-node)

Completed

Page 19: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

19

The programming/execution models are conceptual guides designed to express parallelism to a variety of runtimes

Not all runtimes providethe same functionality

Application

DARMA

Runtime

OS/Hardware

Common APIacross runtimes

Common APIacross runtimes

Front End API(Application User)

Translation Layer

Back End API(Specification for Runtime)

Glue Code(Specific to each runtime)

DARMA software stack model for engaging apps

+ runtime teams to develop best practices

Page 20: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

20

Constructs exist for task parallelism or data-parallel collectionsData collections require specifying granularity

• Data collections specify granularity• Granularity can be completely

decoupled from nodes/processes• Easy overdecomposition

• ”Correct” granularity is a balance of• Maximizing parallelism• Increasing locality• Balancing overheads

auto mycol = initial_access_collection( index_range = Range1D(10));

create_concurrent_work<MyFun>( mycol, index_range = Range1D(10));

create_concurrent_work<MyFun>( mycol, index_range = Range1D(10));

Example Program

SequentialSemantics

Modifymycol

Modifymycol

Generated DAG

Scalable GraphRefinement

...

...

Modifymycol

Modifymycol

Index 0 Index 1 Index 9

A mapping must exist between thedata index ranges and task index range.In this case, since the three ranges areidentical in size and type, a one-to-oneidentity map is automatically applied.

Semantics

Page 21: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

21

Granularity control is critical to performance in many applications

Rank 1

Rank 2Rank 3

NodeParallel

Patch 1

Patch 2

Patch 3

Thread,VectorParallel

Thread,Node

Parallel

Particle-in-cell problem is major example of granularity control dictating performance

Load balance, pipeline parallelism comes from overdecomposition factor (ODF),

no need to repartition problem

Page 22: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

22

Granularity control is critical to performance in many applications

Applicationwork (tasks)

Data transfer(send/recv)

Applicationwork (tasks)

Data transfer(send/recv)

ODF=8

ODF=1

• Communication pipelining comes from overdecomposition

• Granularity dictated by algorithm

Page 23: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

23

Granularity control is critical to performance in many applicationsStrong-scaling on Trinity Compute intensity over time

• Load balance flexibility comes from overdecomposition• Load balancing must balance quality of heuristic with cost of heuristic

Page 24: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

24

Critical step in lowering overheads of “overdecomposition” approach is overdecomposing nodes, not overdecomposing cores

Assume 16-core node

4x-core OD NoOverdecomposition

4x-node OD w/Kokkos

• DARMA scheduler allocates multiple cores to task, configures “environment” of Kokkos execution space

Page 25: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

25

DARMA’s Higher-level Programmatic Approach: Defining a “software stack model” for asynchronous programming

25

Application

DARMA

Runtime

OS/Hardware

Common APIacross runtimes

Common APIacross runtimes

Front End API(Application User)

Translation Layer

Back End API(Specification for Runtime)

Glue Code(Specific to each runtime)

Mapping toavarietyofAMTruntimesystemtechnologies

Page 26: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

26

Mitigate risks by leveraging existing runtime infrastructure as much as possible, encourage collaboration

26

Application

DARMA

Runtime

OS/Hardware

Common APIacross runtimes

Common APIacross runtimes

Front End API(Application User)

Translation Layer

Back End API(Specification for Runtime)

Glue Code(Specific to each runtime)

Mapping toavarietyofAMTruntimesystemtechnologies

Charm++”Shim”Layer

Diagramnotnecessarilytoscale!

Page 27: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

27

Current efforts geared towards reference implementation on MPI + OpenMP for interoperability, baseline example for community

27

Application

DARMA

Runtime

OS/Hardware

Common APIacross runtimes

Common APIacross runtimes

Front End API(Application User)

Translation Layer

Back End API(Specification for Runtime)

Glue Code(Specific to each runtime)

Mapping toavarietyofAMTruntimesystemtechnologies

MPI+OpenMP +Kokkos Reference

Primary2018milestone:MPI+OpenMP interoperabilityofdynamic,asynchronousDARMA

phase/kernel

Page 28: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

28

C++ committee activity:async_ptr(P0971, not yet released)

• We are currently working on a proposal for a class template called async_ptrthat has similar semantics to AccessHandle (but less implicit syntax).

• Proposal uses syntax that reflects the analogy to reference borrowing (from Rust), which has similar semantics.

void dpotrf(Tile& Aii);void dtrsm(const Tile& Aii, Tile& Aji);void dsyrk(const Tile& Aji, Tile& Ajj);void dgemm(const Tile& Aji, const Tile& Aki, Tile& Ajk);

int cholesky(...){

...Matrix<async_ptr<Tile>> A(n,n,N);...for (int i=0; i < n; ++i){

A(i,i).async_borrow_value(dpotrf);for (int j=i+1; j < n; ++j){

with_all(as_const(A(i,i)), A(j,i)).async_borrow_value(dtrsm);}for (int j=i+1; j < n; ++j){

with_all(as_const(A(j,i)), A(j,j)).async_borrow_value(dsyrk);for (int k=j+1; k < n; ++k){

with_all(as_const(A(j,i)), as_const(A(k,i)), A(j,k)).async_borrow_value(dgemm);

}}

}return 0;

}

Page 29: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

29

C++ committee activity:Executors(P0443)

• We are actively contributing to the development of the C++ Executor concept and supporting facilities.

• Executors, as a concept, provide constraints on a low-level interface for describing execution patterns in generic code.

• Not intended to be a user-level API (mostly a library-author-level API)

priority_scheduler sched;auto ex = execution::require(sched.executor(), oneway, single);auto low = execution::require(ex, low_priority);auto med = execution::require(ex, normal_priority);auto high = execution::require(ex, high_priority);execution::executor<oneway_t, single_t, priority> poly_high(high);...low.execute([]{ std::cout << "11\n"; });low.execute([]{ std::cout << "111\n"; });med.execute([]{ std::cout << "2\n"; });med.execute([]{ std::cout << "22\n"; });high.execute([]{ std::cout << "3\n"; });high.execute([]{ std::cout << "33\n"; });high.execute([]{ std::cout << "333\n"; });poly_high.execute([]{ std::cout << "3333\n"; });execution::require(ex, priority{-1}).execute([&]{ sched.stop(); });...sched.run();

Page 30: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

30

Other C++ Committee Activities

• Futures– (Proposal number not yet assigned; see github.com/executors/futures)

• span/mdspan, in collaboration with Kokkos– P0009, P0546

• Generic access properties for views of memory– P0856, P0860, P0900

• Atomic references to arbitrary memory– P0019

• Deferred reclamation through hazard pointers and RCU– P0566

Page 31: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

31

Tutorial Time!

bit.ly/darma-tutorial

https://darma-tasking.github.io/presentations/ecp-tutorial-2018/

Page 32: DARMA: A software stack model for supporting asynchronous ... · DARMA design goal #1: Flexible granularity • Granularity (DARMA definition): – Task size – Task shape – Task

32

AcknowledgmentsSandia National Laboratories is a multimission laboratory managed and operated by National Technology and Engineering Solutions of Sandia, LLC., a wholly owned subsidiary of Honeywell International, Inc., for the U.S. Department of Energy's National Nuclear Security Administration under contract DE-NA-0003525.