separating functional and parallel correctness using
play

Separating Functional and Parallel Correctness using - PowerPoint PPT Presentation

Separating Functional and Parallel Correctness using Nondeterministic Sequential Specifications Jacob Burnim, George Necula, Koushik Sen University of California, Berkeley 1 HotPar ' 10, Berkeley, CA June 14, 2010 Parallel Programming is


  1. Separating Functional and Parallel Correctness using Nondeterministic Sequential Specifications Jacob Burnim, George Necula, Koushik Sen University of California, Berkeley 1 HotPar ' 10, Berkeley, CA June 14, 2010

  2. Parallel Programming is Hard � Key Culprit: Nondeterministic interleaving of parallel threads. � Painful to reason simultaneously about parallelism and functional correctness. � Goal: Decompose efforts in addressing parallelism and functional correctness. � Allow programmers to reason about functional correctness sequentially . � Independently show correctness of parallelism. 2

  3. Our Approach � Goal: Decompose efforts in addressing parallelism and functional correctness. Parallel Functional ≤ program specification 3

  4. Our Approach � Goal: Decompose efforts in addressing parallelism and functional correctness. Program / specification Parallel Functional program specification 4

  5. Our Approach � Goal: Decompose efforts in addressing parallelism and functional correctness. Parallelism Correctness. Prove independently of complex & sequential function correctness. Program / specification Parallel Functional program specification 5

  6. Our Approach � Goal: Decompose efforts in addressing parallelism and functional correctness. Parallelism Correctness. Want to be able to Prove independently of reason about functional complex & sequential correctness without function correctness. parallel interleavings . Sequential program / Parallel Functional specification program specification 6

  7. Our Approach � Use sequential but nondeterministic specification for a program’s parallelism. � User annotates intended nondeterminism . Nondeterministic sequential Parallel Functional program/spec program specification 7

  8. Our Approach � Use sequential but nondeterministic specification for a program’s parallelism. � User annotates intended nondeterminism . Parallelism correct if Can address functional adds no unintended correctness without nondeterminism . parallel interleavings . Nondeterministic sequential Parallel Functional program/spec program specification 8

  9. Outline � Overview � Motivating Example � Nondeterministic Sequential (NDSEQ) Specifications for Parallel Correctness � Proving Parallel Correctness � Future Work � Conclusions 9

  10. Motivating Example � Goal: Find minimum-cost solution. � Simplified branch-and-bound benchmark. for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) if cost < best: best = cost best_soln = w 10

  11. Motivating Example � Goal: Find minimum-cost solution. � Simplified branch-and-bound benchmark. Input: List of possible solutions. for (w in queue ): if (lower_bnd(w) >= best): continue cost = compute_cost(w) Output: Solution from if cost < best: input queue with best = cost minimum cost. best_soln = w 11

  12. Motivating Example � Goal: Find minimum-cost solution. � Simplified branch-and-bound benchmark. for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost (w) if cost < best: best = cost Computes cost of best_soln = w solution w. Expensive . 12

  13. Motivating Example � Goal: Find minimum-cost solution. � Simplified branch-and-bound benchmark. Computes cheap lower bound on cost of w. for (w in queue): if ( lower_bnd (w) >= best): continue cost = compute_cost (w) if cost < best: best = cost Computes cost of best_soln = w solution w. Expensive . 13

  14. Motivating Example � Goal: Find minimum-cost solution. � Simplified branch-and-bound benchmark. Computes cheap lower bound on cost of w. for (w in queue): if ( lower_bnd (w) >= best): continue Prune when w cannot cost = compute_cost (w) have minimum-cost. if cost < best: best = cost Computes cost of best_soln = w solution w. Expensive . 14

  15. Motivating Example bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 3 cost: 9 best: ∞� best_soln: � � for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) if cost < best: best = cost best_soln = w 15

  16. Motivating Example bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 3 cost: 9 best: ∞� best_soln: � � prune?( a ) for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) if cost < best: best = cost best_soln = w 16

  17. Motivating Example bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 3 cost: 9 best: 2 best_soln: � � prune?( a ) for (w in queue): if (lower_bnd(w) >= best): update( a ) continue cost = compute_cost(w) if cost < best: best = cost best_soln = w 17

  18. Motivating Example bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 3 cost: 9 best: 2 best_soln: � � prune?( a ) for (w in queue): if (lower_bnd(w) >= best): update( a ) continue cost = compute_cost(w) prune?( b ) if cost < best: best = cost best_soln = w 18

  19. Motivating Example bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 3 cost: 9 best: 2 best_soln: � � prune?( a ) for (w in queue): if (lower_bnd(w) >= best): update( a ) continue cost = compute_cost(w) prune?( b ) if cost < best: update( b ) best = cost best_soln = w 19

  20. Motivating Example bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 3 cost: 9 best: 2 best_soln: � � prune?( a ) for (w in queue): if (lower_bnd(w) >= best): update( a ) continue cost = compute_cost(w) prune?( b ) if cost < best: update( b ) best = cost best_soln = w prune?( c ) 20

  21. Motivating Example bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 3 cost: 9 best: 2 best_soln: � � prune?( a ) for (w in queue): if (lower_bnd(w) >= best): update( a ) continue cost = compute_cost(w) prune?( b ) if cost < best: update( b ) best = cost best_soln = w prune?( c ) 21

  22. Motivating Example � Goal: Find minimum-cost solution. � Simplified branch-and-bound benchmark. for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) if cost < best: best = cost best_soln = w 22

  23. Motivating Example � Goal: Find minimum-cost solution. How do we � Simplified branch-and-bound benchmark. parallelize this code? for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) if cost < best: best = cost best_soln = w 23

  24. Parallelizing our Example � Goal: Find min-cost solution in parallel . � Simplified branch-and-bound benchmark. parallel-for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) atomic : if cost < best: best = cost best_soln = w 24

  25. Parallelizing our Example � Goal: Find min-cost solution in parallel . � Simplified branch-and-bound benchmark. Loop iterations can be run in parallel. parallel-for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) atomic : if cost < best: Updates to best best = cost are atomic. best_soln = w 25

  26. Prove Parallelism Correct? � Claim: Parallelization is correct. � If there are any bugs, they are sequential . � Want to prove parallelization correct. parallel-for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) atomic : if cost < best: best = cost best_soln = w 26

  27. Prove Parallelism Correct? � Claim: Parallelization is correct. � If there are any bugs, they are sequential . � Want to prove parallelization correct. Idea: Specify that parallel version parallel-for (w in queue): if (lower_bnd(w) >= best): gives same result as sequential. continue cost = compute_cost(w) atomic : if cost < best: best = cost best_soln = w 27

  28. Parallel-Sequential Equivalence? bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 2 cost: 9 best: ∞� best_soln: � � parallel-for (w in queue): if (lower_bnd(w) >= best): continue cost = compute_cost(w) atomic : if cost < best: best = cost best_soln = w 28

  29. Parallel-Sequential Equivalence? bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 2 cost: 9 best: 2 best_soln: � � parallel-for (w in queue): prune?( a ) if (lower_bnd(w) >= best): update( a ) continue cost = compute_cost(w) atomic : if cost < best: best = cost best_soln = w 29

  30. Parallel-Sequential Equivalence? bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 2 cost: 9 best: 2 best_soln: � � parallel-for (w in queue): prune?( a ) if (lower_bnd(w) >= best): update( a ) continue cost = compute_cost(w) prune?( b ) atomic : if cost < best: update( b ) best = cost best_soln = w 30

  31. Parallel-Sequential Equivalence? bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 2 cost: 9 best: 2 best_soln: � � parallel-for (w in queue): prune?( a ) if (lower_bnd(w) >= best): update( a ) continue cost = compute_cost(w) prune?( b ) atomic : if cost < best: update( b ) best = cost prune?( c ) best_soln = w 31

  32. Parallel-Sequential Equivalence? bound: 1 bound: 0 bound: 5 queue: ( a ) ( b ) ( c ) cost: 2 cost: 2 cost: 9 best: 2 best_soln: � � parallel-for (w in queue): prune?( a ) if (lower_bnd(w) >= best): Sequential program update( a ) continue cost = compute_cost(w) always finds prune?( b ) atomic : best_soln = (a) . if cost < best: update( b ) best = cost prune?( c ) best_soln = w 32

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend