Presentation is loading. Please wait.

Presentation is loading. Please wait.

The Relative Power of Synchronization Operations

Similar presentations


Presentation on theme: "The Relative Power of Synchronization Operations"— Presentation transcript:

1 The Relative Power of Synchronization Operations
Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit

2 Last Lecture: Shared-Memory Computability
10011 Mathematical model of concurrent computation What is (and is not) concurrently computable Efficiency (mostly) irrelevant We looked at shared memory computation and tried to understand what we could build using the weakest assumptions regarding our shared medium. Art of Multiprocessor Programming

3 Wait-Free Implementation
Every method call completes in finite number of steps Implies no mutual exclusion We looked at wait-free implementations because they imply no mutual exclusion. (2) Art of Multiprocessor Programming

4 Art of Multiprocessor Programming
From Weakest Register 1 Single writer Single reader 1 We started with the weakest primitive we could think of. Safe Boolean register Art of Multiprocessor Programming

5 All the way to a Wait-free Implementation of Atomic Snapshots
MRMW MRSW M-valued Boolean SRSW We built a collection of different synchronization objects all the way to an atomic snapshot. But what about constructing other objects like Queues. We know two thread queues can be implemented in a wait-free manner. What about queues with more than one enqueuer and dequeuer? Safe Regular Atomic Snapshot Art of Multiprocessor Programming

6 Rationale for wait-freedom
We wanted atomic registers to implement mutual exclusion So we couldn’t use mutual exclusion to implement atomic registers But wait, there’s more! Art of Multiprocessor Programming

7 Why is Mutual Exclusion so wrong?
(2)

8 Asynchronous Interrupts
??? ??? Swapped out back at (2) Art of Multiprocessor Programming

9 Heterogeneous Processors
??? ??? yawn 286 Pentium Pentium (1) Art of Multiprocessor Programming

10 Art of Multiprocessor Programming
Fault-tolerance ??? ??? (2) Art of Multiprocessor Programming

11 Machine Level Instruction Granularity
Eugene Amdahl Wait-free implementations imply that operatiosn of different threads interleave at the granularity of individual machine instructions accessing memory. (2) Art of Multiprocessor Programming

12 Art of Multiprocessor Programming
Basic Questions Wait-Free synchronization might be a good idea in principle But how do you do it Systematically? Correctly? Efficiently? Art of Multiprocessor Programming

13 FIFO Queue: Enqueue Method
q.enq( ) Art of Multiprocessor Programming

14 FIFO Queue: Dequeue Method
q.deq()/ Art of Multiprocessor Programming

15 Two-Thread Wait-Free Queue
public class LockFreeQueue { int head = 0, tail = 0; Item[QSIZE] items; public void enq(Item x) { while (tail-head == QSIZE) {}; items[tail % QSIZE] = x; tail++; } public Item deq() { while (tail-head == 0) {} Item item = items[head % QSIZE]; head++; return item; }} Art of Multiprocessor Programming

16 What About Multiple Dequeuers?
Art of Multiprocessor Programming

17 Art of Multiprocessor Programming
Grand Challenge Only new aspect Implement a FIFO queue Wait-free Linearizable From atomic read-write registers Multiple dequeuers (1) Art of Multiprocessor Programming

18 Art of Multiprocessor Programming
Consensus While you are ruminating on the grand challenge… We will give you another puzzle Consensus Will be important … Art of Multiprocessor Programming

19 Consensus: Each Thread has a Private Input
19 32 21 Art of Multiprocessor Programming

20 Art of Multiprocessor Programming
They Communicate Art of Multiprocessor Programming

21 They Agree on One Thread’s Input
19 19 19 Art of Multiprocessor Programming

22 Art of Multiprocessor Programming
Formally: Consensus Consistent: all threads decide the same value Valid: the common decision value is some thread's input As we will see later consensus can be formulated as a linearizable object in which threads in the sequential execution decide on the value of the first thread to complete. Art of Multiprocessor Programming

23 No Wait-Free Implementation of Consensus using Registers
??? ??? Art of Multiprocessor Programming

24 Art of Multiprocessor Programming
Formally Theorem [adapted from Fischer, Lynch, Paterson]: There is no wait-free implementation of n-thread consensus, n>1, from read-write registers Implication: asynchronous computability fundamentally different from Turing computability This is one of the most fundamental theorems of distributed computing, proved originally by Fischer, Lynch, and Paterson in the 1980’s. It says that there are problems that are easily solvable by reading and writing to memory on a single processor, a turing machine, but are not solvable on a multiprocessor. As we will see, this will have profound implications on multiprocessor hardware design. We will give here a proof of their theorem in the context of shared memory as proven by Herlihy. Art of Multiprocessor Programming

25 Art of Multiprocessor Programming
Proof Strategy Assume otherwise Reason about the properties of any such protocol Derive a contradiction Quod Erat Demonstrandum Suffices to prove for binary consensus and n=2 Art of Multiprocessor Programming

26 Wait-Free Computation
A moves B moves Either A or B “moves” Moving means Register read Register write It suffices to prove the claim for two threads. Here is how we model computation histories. Art of Multiprocessor Programming

27 Art of Multiprocessor Programming
The Two-Move Tree Final states Initial state (2) Art of Multiprocessor Programming

28 Art of Multiprocessor Programming
Decision Values 1 1 1 1 Art of Multiprocessor Programming

29 Bivalent: Both Possible
1 1 1 1 Art of Multiprocessor Programming

30 Univalent: Single Value Possible
1 1 1 1 Art of Multiprocessor Programming

31 x-valent: x Only Possible Decision
1 1 1 1 Art of Multiprocessor Programming

32 Art of Multiprocessor Programming
Summary Wait-free computation is a tree Bivalent system states Outcome not fixed Univalent states Outcome is fixed May not be “known” yet 1-Valent and 0-Valent states Art of Multiprocessor Programming

33 Art of Multiprocessor Programming
Claim Some initial state is bivalent Outcome depends on Chance Whim of the scheduler Multiprocessor gods do play dice … Lets prove this claim Art of Multiprocessor Programming

34 Both Inputs 0 Univalent: all executions must decide 0
Univalent: all executions must decide 0 (2) Art of Multiprocessor Programming (1)

35 Both Inputs 0 Including this solo execution by A
Including this solo execution by A (1) Art of Multiprocessor Programming (1)

36 Both Inputs 1 1 1 All executions must decide 1
(2) Art of Multiprocessor Programming (1)

37 Both Inputs 1 1 Including this solo execution by B
(1) Art of Multiprocessor Programming (1)

38 What if inputs differ? 1 By Way of contradiction: If univalent
1 Imagine that all the executions still decide on one input or another…assume the claim is false and lets show the set of possible executions must then include two executions with different values. By Way of contradiction: If univalent all executions must decide on same value (2) Art of Multiprocessor Programming

39 The Possible Executions
1 Include the solo execution by A that decides 0 (2) Art of Multiprocessor Programming

40 The Possible Executions
1 Also include the solo execution by B which we know decides 1 (2) Art of Multiprocessor Programming

41 Possible Executions Include
How univalent is that? (QED) 1 Since e Solo execution by A must decide 0 Solo execution by B must decide 1 Art of Multiprocessor Programming

42 Art of Multiprocessor Programming
Critical States critical A critical state is a bivalent state in which the next step by one thread will lead to a 0-valent state and the next step by the other will lead to a 1-valent state 0-valent 1-valent (3) Art of Multiprocessor Programming (3)

43 From a Critical State c 0-valent 1-valent
If A goes first, protocol decides 0 If B goes first, protocol decides 1 Art of Multiprocessor Programming

44 Reaching Critical State
initially bivalent CB univalent CA CB univalent CA univalent Why must there be such a critical state? Start from a bivalent state. If it is not critical, run A until about to make state 0-valent, if not a critical state, that is, if B’s step will not take the state to a 1-valent state, then run B until in is about to take system to a 1-valent state. If this state is not critical, run A again, then B, and so on. Since this is a wai-free execution, within a finite number of steps each will finish, so somewhere before they must reach a critical state. c univalent 0-valent 1-valent Art of Multiprocessor Programming

45 Art of Multiprocessor Programming
Critical States Starting from a bivalent initial state The protocol can reach a critical state Otherwise we could stay bivalent forever And the protocol is not wait-free Art of Multiprocessor Programming

46 Art of Multiprocessor Programming
Model Dependency So far, memory-independent! True for Registers Message-passing Carrier pigeons Any kind of asynchronous computation Art of Multiprocessor Programming

47 Art of Multiprocessor Programming
Read-Write Memory Reads and/or writes To same/different registers Art of Multiprocessor Programming

48 Art of Multiprocessor Programming
Completing the Proof Lets look at executions that: Start from a critical state Threads cause state to become univalent by reading or writing to same/different registers End within a finite number of steps deciding either 0 or 1 Show this leads to a contradiction Art of Multiprocessor Programming

49 Possible Interactions
A reads x x.read() y.read() x.write() y.write() ? A reads y Tp prove that we cannot solve consensus using read-write registers, lets go over all the possible interactions among the threads and show that for each such execution they lead to a contradiction. Art of Multiprocessor Programming

50 Some Thread Reads Contradiction c 1 A runs solo, eventually decides 0
B reads x A runs solo, eventually decides 1 1 Contradiction This is the case in which some thread reads (and the other either reads or writes). Two possible executions, one in which A runs solo and decides 0 and another in which A runs after B takes its critical read step. Leads to a contradiction since A cannot tell that B has read…so two executions lead to the same state but the system is supposed to have two different valencies for it, a contradiction. States look the same to A Art of Multiprocessor Programming

51 Possible Interactions
x.read() y.read() x.write() y.write() no ? Art of Multiprocessor Programming

52 Writing Distinct Registers
A writes y B writes x A writes y B writes x Contradiction 1 The song is the same Art of Multiprocessor Programming

53 Possible Interactions
x.read() y.read() x.write() y.write() no ? Art of Multiprocessor Programming

54 Writing Same Registers
c B writes x A writes x A runs solo, eventually decides 0 A writes x Contradiction A runs solo, eventually decides 1 1 States look the same to A Art of Multiprocessor Programming

55 Art of Multiprocessor Programming
That’s All, Folks! x.read() y.read() x.write() y.write() no QED Art of Multiprocessor Programming

56 Recap: Atomic Registers Can’t Do Consensus
If protocol exists It has a bivalent initial state Leading to a critical state What’s up with the critical state? Case analysis for each pair of methods As we showed, all lead to a contradiction Art of Multiprocessor Programming

57 What Does Consensus have to do with Concurrent Objects?
Consensus can be formulated as a linearizable object in which threads in the sequential execution decide on the value of the first thread to complete. Art of Multiprocessor Programming

58 Art of Multiprocessor Programming
Consensus Object public interface Consensus { Object decide(object value); } (4) Art of Multiprocessor Programming (4)

59 Concurrent Consensus Object
We consider only one time objects: each thread can execute a method only once Linearizable to sequential consensus object in which the thread who’s input was decided on completed its method first A linearizable object in which threads in the sequential execution decide on the value of the first thread to complete. The consensus objects we will consider will be one time objects, that is, each thread executes a method once. Art of Multiprocessor Programming

60 Art of Multiprocessor Programming
Java Jargon Watch Define Consensus protocol as an abstract class We implement some methods Leave you to do the rest … Art of Multiprocessor Programming

61 Generic Consensus Protocol
abstract class ConsensusProtocol implements Consensus { protected Object[] proposed = new Object[N]; private void propose(Object value) { proposed[ThreadID.get()] = value; } abstract public Object decide(object value); }} Note the use of a protected for proposed. A protected method is visible to inheriting classes, even not part of the same package. A package scope (default) method is not. That is the only difference between protected and package scope. method are restricted in accessing it. See example below: package one; public class A { protected int p; } //////////////////////////////// package two; import one. A; class B extends A void myMethod() p = 1; // ok A a = new A(); a.p = 1; // not ok, p would have to be public for this to work. (4) Art of Multiprocessor Programming (4)

62 Generic Consensus Protocol
abstract class ConsensusProtocol implements Consensus { protected Object[] proposed = new Object[N]; private void propose(Object value) { proposed[ThreadID.get()] = value; } abstract public Object decide(object value); }} Each thread’s proposed value (4) Art of Multiprocessor Programming (4)

63 Generic Consensus Protocol
abstract class ConsensusProtocol implements Consensus { protected Object[] proposed = new Object[N]; private void propose(Object value) { proposed[ThreadID.get()] = value; } abstract public Object decide(object value); }} Propose a value (4) Art of Multiprocessor Programming (4)

64 Generic Consensus Protocol
abstract class ConsensusProtocol implements Consensus { protected Object[] proposed = new Object[N]; private void propose(Object value) { proposed[ThreadID.get()] = value; } abstract public Object decide(object value); }} Decide a value: abstract method means subclass does the heavy lifting (real work) (4) Art of Multiprocessor Programming (4)

65 Can a FIFO Queue Implement Consensus?

66 FIFO Queue with red and black balls
FIFO Consensus proposed array FIFO Queue with red and black balls 8 Coveted red ball Dreaded black ball Art of Multiprocessor Programming

67 Protocol: Write Value to Array
1 Art of Multiprocessor Programming

68 Protocol: Take Next Item from Queue
8 1 Art of Multiprocessor Programming

69 Protocol: Take Next Item from Queue
I got the dreaded black ball, so I will decide the other’s value from the array I got the coveted red ball, so I will decide my value 1 8 Art of Multiprocessor Programming

70 Consensus Using FIFO Queue
public class QueueConsensus extends ConsensusProtocol { private Queue queue; public QueueConsensus() { queue = new Queue(); queue.enq(Ball.RED); queue.enq(Ball.BLACK); } Art of Multiprocessor Programming

71 Art of Multiprocessor Programming
Initialize Queue public class QueueConsensus extends ConsensusProtocol { private Queue queue; public QueueConsensus() { this.queue = new Queue(); this.queue.enq(Ball.RED); this.queue.enq(Ball.BLACK); } 8 Art of Multiprocessor Programming

72 Art of Multiprocessor Programming
Who Won? public class QueueConsensus extends ConsensusProtocol { private Queue queue; public decide(object value) { propose(value); Ball ball = this.queue.deq(); if (ball == Ball.RED) return proposed[i]; else return proposed[1-i]; } Art of Multiprocessor Programming

73 Race to dequeue first queue item
Who Won? public class QueueConsensus extends ConsensusProtocol { private Queue queue; public decide(object value) { propose(value); Ball ball = this.queue.deq(); if (ball == Ball.RED) return proposed[i]; else return proposed[1-ij]; } Race to dequeue first queue item Art of Multiprocessor Programming

74 Art of Multiprocessor Programming
Who Won? public class QueueConsensus extends ConsensusProtocol { private Queue queue; public decide(object value) { propose(value); Ball ball = this.queue.deq(); if (ball == Ball.RED) return proposed[i]; else return proposed[1-i]; } i = ThreadID.get(); I win if I was first Art of Multiprocessor Programming

75 Other thread wins if I was second
Who Won? public class QueueConsensus extends ConsensusProtocol { private Queue queue; public decide(object value) { propose(value); Ball ball = this.queue.deq(); if (ball == Ball.RED) return proposed[i]; else return proposed[1-i]; } Other thread wins if I was second Art of Multiprocessor Programming

76 Art of Multiprocessor Programming
Why does this Work? If one thread gets the red ball Then the other gets the black ball Winner decides her own value Loser can find winner’s value in array Because threads write array Before dequeueing from queue Art of Multiprocessor Programming

77 Art of Multiprocessor Programming
Theorem We can solve 2-thread consensus using only A two-dequeuer queue, and Some atomic registers Art of Multiprocessor Programming

78 Art of Multiprocessor Programming
Implications Given A consensus protocol from queue and registers Assume there exists A queue implementation from atomic registers Substitution yields: A wait-free consensus protocol from atomic registers contradiction (1) Art of Multiprocessor Programming (1)

79 Art of Multiprocessor Programming
Corollary It is impossible to implement a two-dequeuer wait-free FIFO queue from read/write memory. Art of Multiprocessor Programming

80 Art of Multiprocessor Programming
Consensus Numbers An object X has consensus number n If it can be used to solve n-thread consensus Take any number of instances of X together with atomic read/write registers and implement n-thread consensus But not (n+1)-thread consensus Art of Multiprocessor Programming

81 Art of Multiprocessor Programming
Consensus Numbers Theorem Atomic read/write registers have consensus number 1 Multi-dequeuer FIFO queues have consensus number at least 2 Art of Multiprocessor Programming

82 Consensus Numbers Measure Synchronization Power
Theorem If you can implement X from Y And X has consensus number c Then Y has consensus number at least c Art of Multiprocessor Programming

83 Synchronization Speed Limit
Conversely If X has consensus number c And Y has consensus number d < c Then there is no way to construct a wait-free implementation of X by Y This theorem will be very useful Unforeseen practical implications! Theoretical Caveat: Certain weird exceptions exist The exceptions have to do with special non-deterministic objects or with how threads “bind” to the object or with the objects being “oblivious”. See chapter for details. The following is a summary from a paper on the subject by Hadzilacos et. al: Hadzilacos et al prove that if types can be nondeterministic and nonoblivious, and each process is required to bind permanently to at most one port of an object, then hrm is not robust. Concurrently with the rst appearance of our result [CHJT94], there appeared two papers proving the robustness of hrm in certain models [BGA94, PBN94]. Specically, Borowsky, Gafni, and Afek show that if types must be deterministic and oblivious, each process may bind to several ports of the same object, and the process-to-port binding is transient, then hrm is robust [BGA94]. Peterson, Bazzi, and Neiger show that if types must be deterministic, each process may bind to several ports of the same object, but the process-to-port binding is permanent, then hrm is robust [PBN94]. More nonrobustness results have appeared recently. Moran and Rappoport [MR96] strengthen our result by proving that hrm is not robust even if types must be deterministic, as long as each process must be permanently bound to at most one port of an object. Lo and Hadzilacos [LH97] prove that hrm is not robust if types can be nondeterministic, regardless of whether they are oblivious and of how processes may bind to ports. Schenk proves a result similar to the one in [LH97], but his result requires innite nondeterminism and applies only for a stronger denition of wait-free implementation [Sch96]. Art of Multiprocessor Programming

84 Earlier Grand Challenge
Snapshot means Write any array element Read multiple array elements atomically What about Write multiple array elements atomically Scan any array elements Call this problem multiple assignment Art of Multiprocessor Programming

85 Multiple Assignment Theorem
Atomic registers cannot implement multiple assignment Weird or what? Single location write/multi location read OK Multi location write/multi location read impossible (1) Art of Multiprocessor Programming (1)

86 Art of Multiprocessor Programming
Proof Strategy If we can write to 2/3 array elements We can solve 2-consensus Impossible with atomic registers Therefore Cannot implement multiple assignment with atomic registers Art of Multiprocessor Programming (1)

87 Art of Multiprocessor Programming
Proof Strategy Take a 3-element array A writes atomically to slots 0 and 1 B writes atomically to slots 1 and 2 Any thread can scan any set of locations Art of Multiprocessor Programming (1)

88 Double Assignment Interface
interface Assign2 { public void assign(int i1, int v1, int i2, int v2); public int read(int i); } (4) Art of Multiprocessor Programming (4)

89 Double Assignment Interface
interface Assign2 { public void assign(int i1, int v1, int i2, int v2); public int read(int i); } Atomically assign value[i1]= v1 value[i2]= v2 (4) Art of Multiprocessor Programming (4)

90 Double Assignment Interface
interface Assign2 { public void assign(int i1, int v1, int i2, int v2); public int read(int i); } Return i-th value (4) Art of Multiprocessor Programming (4)

91 Art of Multiprocessor Programming
Initially A Writes to 0 and 1 Writes to 1 and 2 B Art of Multiprocessor Programming

92 Art of Multiprocessor Programming
Thread A wins if A Thread B didn’t move B Art of Multiprocessor Programming (1)

93 Art of Multiprocessor Programming
Thread A wins if A Thread B moved later B Art of Multiprocessor Programming (1)

94 Art of Multiprocessor Programming
Thread A loses if A Thread B moved earlier B Art of Multiprocessor Programming (1)

95 Art of Multiprocessor Programming
Multi-Consensus Code class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} (4) Art of Multiprocessor Programming (4)

96 Multi-Consensus Code Extends ConsensusProtocol
class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} To save space and make the code clearer we wrote that it extends consensus while it actually extends ConsensusProtocol and omitted that Decide sets j=i-1 and then proposes value. Assume this appears in all the code. Extends ConsensusProtocol Decide sets j=i-1 and proposes value (4) Art of Multiprocessor Programming (4)

97 Three slots initialized to EMPTY
Multi-Consensus Code class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} Three slots initialized to EMPTY (4) Art of Multiprocessor Programming (4)

98 Assign id 0 to entries 0,1 (or id 1 to entries 1,2)
Multi-Consensus Code class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} Assign id 0 to entries 0,1 (or id 1 to entries 1,2) (4) Art of Multiprocessor Programming (4)

99 Read the register my thread didn’t assign
Multi-Consensus Code class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} Read the register my thread didn’t assign (4) Art of Multiprocessor Programming (4)

100 Other thread didn’t move, so I win
Multi-Consensus Code class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} Other thread didn’t move, so I win (4) Art of Multiprocessor Programming (4)

101 Other thread moved later so I win
Multi-Consensus Code class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} Other thread moved later so I win (4) Art of Multiprocessor Programming (4)

102 Art of Multiprocessor Programming
Multi-Consensus Code class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} OK, I win. (4) Art of Multiprocessor Programming (4)

103 Other thread moved first, so I lose
Multi-Consensus Code class MultiConsensus extends …{ Assign2 a = new Assign2(3, EMPTY); public Object decide(object value) { a.assign(i, i, i+1, i); int other = a.read((i+2) % 3); if (other==EMPTY||other==a.read(1)) return proposed[i]; else return proposed[j]; }} (1) Other thread moved first, so I lose (4) Art of Multiprocessor Programming (4)

104 Art of Multiprocessor Programming
Summary If a thread can assign atomically to 2 out of 3 array locations Then we can solve 2-consensus Therefore No wait-free multi-assignment From read/write registers Art of Multiprocessor Programming

105 Read-Modify-Write Objects
Method call Returns object’s prior value x Replaces x with mumble(x) Art of Multiprocessor Programming

106 Art of Multiprocessor Programming
Read-Modify-Write public abstract class RMWRegister { private int value; public int synchronized getAndMumble() { int prior = this.value; this.value = mumble(this.value); return prior; } (1) Art of Multiprocessor Programming

107 Art of Multiprocessor Programming
Read-Modify-Write public abstract class RMWRegister { private int value; public int synchronized getAndMumble() { int prior = this.value; this.value = mumble(this.value); return prior; } Return prior value (1) Art of Multiprocessor Programming

108 Apply function to current value
Read-Modify-Write public abstract class RMWRegister { private int value; public int synchronized getAndMumble() { int prior = this.value; this.value = mumble(this.value); return prior; } Apply function to current value (1) Art of Multiprocessor Programming

109 Art of Multiprocessor Programming
RMW Everywhere! Most synchronization instructions are RMW methods The rest Can be trivially transformed into RMW methods Art of Multiprocessor Programming

110 Art of Multiprocessor Programming
Example: Read public abstract class RMWRegister { private int value; public int synchronized read() { int prior = this.value; this.value = this.value; return prior; } (1) Art of Multiprocessor Programming

111 Apply f(v)=v, the identity function
Example: Read public abstract class RMW { private int value; public int synchronized read() { int prior = this.value; this.value = this.value; return prior; } Apply f(v)=v, the identity function (1) Art of Multiprocessor Programming

112 Art of Multiprocessor Programming
Example: getAndSet public abstract class RMWRegister { private int value; public int synchronized getAndSet(int v) { int prior = this.value; this.value = v; return prior; } (1) Art of Multiprocessor Programming

113 Example: getAndSet (swap)
public abstract class RMWRegister { private int value; public int synchronized getAndSet(int v) { int prior = this.value; this.value = v; return prior; } F(x)=v is constant function (1) Art of Multiprocessor Programming

114 Art of Multiprocessor Programming
getAndIncrement public abstract class RMWRegister { private int value; public int synchronized getAndIncrement() { int prior = this.value; this.value = this.value + 1; return prior; } (1) Art of Multiprocessor Programming

115 Art of Multiprocessor Programming
getAndIncrement public abstract class RMWRegister { private int value; public int synchronized getAndIncrement() { int prior = this.value; this.value = this.value + 1; return prior; } F(x) = x+1 (1) Art of Multiprocessor Programming

116 Art of Multiprocessor Programming
getAndAdd public abstract class RMWRegister { private int value; public int synchronized getAndAdd(int a) { int prior = this.value; this.value = this.value + a; return prior; } (1) Art of Multiprocessor Programming

117 Art of Multiprocessor Programming
Example: getAndAdd public abstract class RMWRegister { private int value; public int synchronized getAndIncrement(int a) { int prior = this.value; this.value = this.value + a; return prior; } F(x) = x+a (1) Art of Multiprocessor Programming

118 Art of Multiprocessor Programming
compareAndSet public abstract class RMWRegister { private int value; public boolean synchronized compareAndSet(int expected, int update) { int prior = this.value; if (this.value==expected) { this.value = update; return true; } return false; } … } (1) Art of Multiprocessor Programming

119 If value is what was expected, …
compareAndSet public abstract class RMWRegister { private int value; public boolean synchronized compareAndSet(int expected, int update) { int prior = this.value; if (this.value==expected) { this.value = update; return true; } return false; } … } If value is what was expected, … (1) Art of Multiprocessor Programming

120 Art of Multiprocessor Programming
compareAndSet public abstract class RMWRegister { private int value; public boolean synchronized compareAndSet(int expected, int update) { int prior = this.value; if (this.value==expected) { this.value = update; return true; } return false; } … } … replace it (1) Art of Multiprocessor Programming

121 Art of Multiprocessor Programming
compareAndSet public abstract class RMWRegister { private int value; public boolean synchronized compareAndSet(int expected, int update) { int prior = this.value; if (this.value==expected) { this.value = update; return true; } return false; } … } Report success (1) Art of Multiprocessor Programming

122 Otherwise report failure
compareAndSet public abstract class RMWRegister { private int value; public boolean synchronized compareAndSet(int expected, int update) { int prior = this.value; if (this.value==expected) { this.value = update; return true; } return false; } … } Otherwise report failure (1) Art of Multiprocessor Programming

123 Lets characterize F(x)…
Read-Modify-Write public abstract class RMWRegister { private int value; public void synchronized getAndMumble() { int prior = this.value; this.value = mumble(this.value); return prior; } Lets characterize F(x)… (1) Art of Multiprocessor Programming

124 Art of Multiprocessor Programming
Definition A RMW method With function mumble(x) is non-trivial if there exists a value v Such that v ≠ mumble(v) Art of Multiprocessor Programming

125 Art of Multiprocessor Programming
Par Example Identity(x) = x is trivial getAndIncrement(x) = x+1 is non-trivial Art of Multiprocessor Programming

126 Art of Multiprocessor Programming
Theorem Any non-trivial RMW object has consensus number at least 2 No wait-free implementation of RMW registers from atomic registers Hardware RMW instructions not just a convenience Art of Multiprocessor Programming

127 Art of Multiprocessor Programming
Reminder Subclasses of consensus have propose(x) method which just stores x into proposed[i] built-in method decide(object value) method which determines winning value customized, class-specific method Art of Multiprocessor Programming

128 Art of Multiprocessor Programming
Proof public class RMWConsensus extends ConsensusProtocol { private RMWRegister r = v; public Object decide(object value) { propose(value); if (r.getAndMumble() == v) return proposed[i]; else return proposed[j]; }} (4) Art of Multiprocessor Programming

129 Art of Multiprocessor Programming
Proof public class RMWConsensus extends ConsensusProtocol { private RMWRegister r = v; public Object decide(object value) { propose(value); if (r.getAndMumble() == v) return proposed[i]; else return proposed[j]; }} Initialized to v (4) Art of Multiprocessor Programming

130 Art of Multiprocessor Programming
Proof public class RMWConsensus extends Consensus { private RMWRegister r = v; public Object decide(object value) { if (r.getAndMumble() == v) return proposed[i]; else return proposed[j]; }} Am I first? (4) Art of Multiprocessor Programming

131 Art of Multiprocessor Programming
Proof public class RMWConsensus extends ConsensusProtocol { private RMWRegister r = v; public Object decide(object value) { propose(value); if (r.getAndMumble() == v) return proposed[i]; else return proposed[j]; }} Yes, return my input (4) Art of Multiprocessor Programming

132 Proof No, return other’s input public class RMWConsensus
extends ConsensusProtocol { private RMWRegister r = v; public Object decide(object value) { propose(value); if (r.getAndMumble() == v) return proposed[i]; else return proposed[j]; }} No, return other’s input (4) Art of Multiprocessor Programming

133 Art of Multiprocessor Programming
Proof We have displayed A two-thread consensus protocol Using any non-trivial RMW object Art of Multiprocessor Programming

134 Art of Multiprocessor Programming
Interfering RMW Let F be a set of functions such that for all fi and fj, either Commute: fi(fj(v))=fj(fi(v)) Overwrite: fi(fj(v))=fi(v) Claim: Any set of RMW objects that commutes or overwrites has consensus number exactly 2 Art of Multiprocessor Programming

135 Art of Multiprocessor Programming
Examples “test-and-set” getAndSet(1) f(v)=1 “swap” getAndSet(x) f(v,x)=x “fetch-and-inc” getAndIncrement() f(v)=v+1 Overwrite fi(fj(v))=fi(v) Overwrite fi(fj(v))=fi(v) Commute fi(fj(v))= fj(fi(v)) Art of Multiprocessor Programming

136 Meanwhile Back at the Critical State
A about to apply fA B about to apply fB c 0-valent 1-valent Art of Multiprocessor Programming

137 Maybe the Functions Commute
A applies fA B applies fB B applies fB A applies fA C runs solo C runs solo 1 0-valent 1-valent Art of Multiprocessor Programming

138 Maybe the Functions Commute
A applies fA B applies fB These states look the same to C B applies fB A applies fA Contradiction C runs solo C runs solo 1 0-valent 1-valent Art of Multiprocessor Programming

139 Maybe the Functions Overwrite
A applies fA B applies fB A applies fA C runs solo C runs solo 1 0-valent 1-valent Art of Multiprocessor Programming

140 Maybe the Functions Overwrite
These states look the same to C c A applies fA B applies fB A applies fA C runs solo Contradiction C runs solo 1 0-valent 1-valent Art of Multiprocessor Programming

141 Art of Multiprocessor Programming
Impact Many early machines provided these “weak” RMW instructions Test-and-set (IBM 360) Fetch-and-add (NYU Ultracomputer) Swap (Original SPARCs) We now understand their limitations But why do we want consensus anyway? Art of Multiprocessor Programming

142 Art of Multiprocessor Programming
compareAndSet public abstract class RMWRegister { private int value; public boolean synchronized compareAndSet(int expected, int update) { int prior = this.value; if (this.value==expected) { this.value = update; return true; } return false; } … } (1) Art of Multiprocessor Programming

143 replace value if its what we expected, …
compareAndSet public abstract class RMWRegister { private int value; public boolean synchronized compareAndSet(int expected, int update) { int prior = this.value; if (this.value==expected) { this.value = update; return true; } return false; } … } replace value if its what we expected, … (1) Art of Multiprocessor Programming

144 compareAndSet Has ∞ Consensus Number
public class RMWConsensus extends ConsensusProtocol { private AtomicInteger r = new AtomicInteger(-1); public Object decide(object value) { propose(value); r.compareAndSet(-1,i); return proposed[r.get()]; } (4) Art of Multiprocessor Programming

145 compareAndSet Has ∞ Consensus Number
public class RMWConsensus extends ConsensusProtocol { private AtomicInteger r = new AtomicInteger(-1); public Object decide(object value) { propose(value) r.compareAndSet(-1,i); return proposed[r.get()]; } Initialized to -1 (4) Art of Multiprocessor Programming

146 compareAndSet Has ∞ Consensus Number
public class RMWConsensus extends ConsensusProtocol { private AtomicInteger r = new AtomicInteger(-1); public Object decide(object value) { propose(value); r.compareAndSet(-1,i); return proposed[r.get()]; } Try to swap in my id (4) Art of Multiprocessor Programming

147 compareAndSet Has ∞ Consensus Number
public class RMWConsensus extends ConsensusProtocol { private AtomicInteger r = new AtomicInteger(-1); public Object decide(object value) { propose(value); r.compareAndSet(-1,i); return proposed[r.get()]; } Decide winner’s preference (4) Art of Multiprocessor Programming

148 The Consensus Hierarchy
1 Read/Write Registers, Snapshots… 2 getAndSet, getAndIncrement, … . ∞ compareAndSet,… Art of Multiprocessor Programming

149 Art of Multiprocessor Programming
Multiple Assignment Atomic k-assignment Solves consensus for 2k-2 threads Every even consensus number has an object (can be extended to odd numbers) Art of Multiprocessor Programming

150 Art of Multiprocessor Programming
Lock-Freedom Lock-free: in an infinite execution infinitely often some method call finishes (obviously, in a finite number of steps) Pragmatic approach Implies no mutual exclusion NOTE: Lock-free is the same as wait-free if the execution is finite. “Lock-free is to wait-free as deadlock-free is to lockout-free.” In other words, Lock-free and Deadlock-free are “stalinistic”, preferring group progress, while Wait-free and Lockout-free guarantee individual progress. Any wait-free implementation is lock-free. Art of Multiprocessor Programming

151 Lock-Free vs. Wait-free
Wait-Free: each method call takes a finite number of steps to finish Lock-free: infinitely often some method call finishes NOTE: Lock-free is the same as wait-free if the execution is finite. “Lock-free is to wait-free as deadlock-free is to lockout-free.” In other words, Lock-free and Deadlock-free are “stalinistic”, preferring group progress, while Wait-free and Lockout-free guarantee individual progress. Any wait-free implementation is lock-free. Art of Multiprocessor Programming

152 Art of Multiprocessor Programming
Lock-Freedom Any wait-free implementation is lock-free. Lock-free is the same as wait-free if the execution is finite. Old saying: “Lock-free is to wait-free as deadlock-free is to lockout-free.” NOTE: Lock-free is the same as wait-free if the execution is finite. “Lock-free is to wait-free as deadlock-free is to lockout-free.” In other words, Lock-free and Deadlock-free are “stalinistic”, preferring group progress, while Wait-free and Lockout-free guarantee individual progress. Any wait-free implementation is lock-free. Art of Multiprocessor Programming

153 Lock-Free Implementations
Lock-free consensus is as impossible as wait-free consensus All the results we presented hold for lock-free algorithms also. (2) Art of Multiprocessor Programming

154 There is More: Universality
Consensus is universal From n-thread consensus Wait-free/Lock-free Linearizable n-threaded Implementation Of any sequentially specified object Stay tuned… Art of Multiprocessor Programming

155 Art of Multiprocessor Programming
          This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License. You are free: to Share — to copy, distribute and transmit the work to Remix — to adapt the work Under the following conditions: Attribution. You must attribute the work to “The Art of Multiprocessor Programming” (but not in any way that suggests that the authors endorse you or your use of the work). Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license. For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to Any of the above conditions can be waived if you get permission from the copyright holder. Nothing in this license impairs or restricts the author's moral rights. Art of Multiprocessor Programming


Download ppt "The Relative Power of Synchronization Operations"

Similar presentations


Ads by Google