multicore programming skip list tutorial 10 cs 0368-3469 spring 2010

66
Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Upload: quinten-dew

Post on 30-Mar-2015

228 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Multicore Programming

Skip listTutorial 10

CS 0368-3469Spring 2010

Page 2: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Set Object Interface

• Collection of elements• No duplicates• Methods

– add() a new element– remove() an element– contains() if element is present

Page 3: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Many are Cold but Few are Frozen

• Typically high % of contains() calls• Many fewer add() calls• And even fewer remove() calls

– 90% contains()– 9% add()– 1% remove()

• Folklore?– Yes but probably mostly true

Page 4: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Concurrent Sets

• Balanced Trees?– Red-Black trees, AVL trees, …

• Problem: no one does this well …• … because rebalancing after add()

or remove() is a global operation

Page 5: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Skip Lists

2255

8877

9900

• Probabilistic Data Structure• No global rebalancing• Logarithmic-time search

Page 6: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Skip List Property

9900

• Each layer is sublist of lower-levels

Page 7: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Skip List Property

779900

• Each layer is sublist of lower-levels

Page 8: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Skip List Property

55 779900

• Each layer is sublist of lower-levels

Page 9: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Skip List Property

5588

779900

• Each layer is sublist of lower-levels

Page 10: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Skip List Property

2255

8877

9900

• Each layer is sublist of lower-levels• Lowest level is entire list

Page 11: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Skip List Property

2255

8877

9900

• Each layer is sublist of lower-levels• Not easy to preserve in concurrent

implementations …

Page 12: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Search

2255

8877

9900

contains(8) Too far

Page 13: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Search

2255

8877

9900

contains(8) OK

Page 14: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Search

2255

8877

9900

contains(8) Too far

Page 15: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Search

2255

8877

9900

contains(8) Too far

Page 16: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Search

2255

8877

9900

contains(8) Yes!

Page 17: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

77

Search

800

2255

99

contains(8)

Page 18: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

77

Logarithmic

800

2255

99

contains(8)

Log N

Page 19: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Why Logarthimic

2255

8877

9900

• Property: Each pointer at layer i jumps over roughly 2i nodes

• Pick node heights randomly so property guaranteed probabilistically

2i 2i

Page 20: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Find() -- Sequential

int find(T x, Node<T>[] preds, Node<T>[] succs) { … }

Page 21: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Find() -- Sequential

int find(T x, Node<T>[] preds, Node<T>[] succs) { … }

object height(-1 if not there)

Page 22: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Find() -- Sequential

int find(T x, Node<T>[] preds, Node<T>[] succs) { … }

Object sought

object height(-1 if not there)

Page 23: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Find() -- Sequential

int find(T x, Node<T>[] preds, Node<T>[] succs) { … }

object sought

return predecessors

Object height(-1 if not there)

Page 24: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Find() -- Sequential

int find(T x, Node<T>[] preds, Node<T>[] succs) { … }

object sought

return predecessors

return successors

object height(-1 if not there)

Page 25: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Successful Search

2255

8877

9900

find(7, …)

prev

0

1

2

3

4

Page 26: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Successful Search

2255

8877

9900

find(7, …)

curr

0

1

2

3

4

prev

0

1

2

3

4

Page 27: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Unsuccessful Search

2255

8877

9900

find(6, …)

prev

0

1

2

3

4

Page 28: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Unsuccessful Search

2255

8877

9900

find(6, …)

curr

0

1

2

3

4

prev

0

1

2

3

4

Page 29: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Lazy Skip List

• Mix blocking and non-blocking techniques: – Use optimistic-lazy locking for add()

and remove()– Wait-free contains()

• Remember: typically lots of contains() calls but few add() and remove()

Page 30: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Review: Lazy List Remove

aa b c d

Page 31: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Review: Lazy List Remove

aa b c d

Present in list

Page 32: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Review: Lazy List Remove

aa b c d

Logically deleted

Page 33: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Review: Lazy List Remove

aa b c d

Physically deleted

Page 34: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Lazy Skip Lists

2255

8877

• Use a mark bit for logical deletion

990

0

00

0

0

00

Page 35: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

add(6)

• Create node of (random) height 4

2255

8877

99000

0

66

Page 36: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

add(6)

• find() predecessors

6

2255

8877

99000

0

0

66

Page 37: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

add(6)

• find() predecessors• Lock them 6

2255

8877

9900 00

0

0

66

Page 38: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

add(6)

• find() predecessors• Lock them• Validate

6

2255

8877

9900 00

0

0

66Optimistic approach

Page 39: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

add(6)

8877

99

2255

00

• find() predecessors• Lock them• Validate• Splice

0

66

0

0

0

Page 40: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

add(6)

• find() predecessors• Lock them• Validate• Splice• Unlock

8877

99

2255

0066

0

00

0

0

Page 41: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

remove(6)

8877

99

2255

0066

0

00 0

0

0

Page 42: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

remove(6)• find() predecessors

8877

99

2255

0066

0

00 0

0

0

Page 43: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

remove(6)• find() predecessors• Lock victim

8877

99

2255

0066

0

00 0

0

0

Page 44: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

8877

99

2255

0066

remove(6)• find() predecessors• Lock victim• Set mark (if not already set)

0

00

0

0

Logical remove…

Page 45: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

8877

99

2255

0066

remove(6)• find() predecessors• Lock victim• Set mark (if not already set)• Lock predecessors (ascending order) &

validate

0

01 0

0

0

Page 46: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

remove(6)• find() predecessors• Lock victim• Set mark (if not already set)• Lock predecessors (ascending order) &

validate • Physically remove

8877

99

2255

0066

0

01 0

0

0

Page 47: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

remove(6)• find() predecessors• Lock victim• Set mark (if not already set)• Lock predecessors (ascending order) &

validate • Physically remove

8877

99

2255

0066

0

01 0

0

0

Page 48: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

remove(6)• find() predecessors• Lock victim• Set mark (if not already set)• Lock predecessors (ascending order) &

validate • Physically remove

8877

99

2255

0066

0

01 0

0

0

Page 49: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

remove(6)• find() predecessors• Lock victim• Set mark (if not already set)• Lock predecessors (ascending order) &

validate • Physically remove

8877

99

2255

0066

0

01 0

0

0

Page 50: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

remove(6)• find() predecessors• Lock victim• Set mark (if not already set)• Lock predecessors (ascending order) &

validate • Physically remove

8877

99

2255

00

0

00

0

0

Page 51: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

contains(8)• Find() & not marked

8877

99

2255

0066

0

00 0

0

0

Page 52: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

contains(8)

8877

99

2255

0066

0

00 0

0

0

Node 6 removed while traversed

Page 53: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

contains(8)

8877

99

2255

00

66

0

00

0

0

Node removed while being traversed

Page 54: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

contains(8)

8877

99

2255

00

66

0

00

0

0

Prove: an unmarked node (like 8) remains reachable

Page 55: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

8877

99

2255

0066

remove(6): Linearization• Successful remove happens when bit is set

0

00

0

0

Logical remove…

Page 56: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Add: Linearization

8877

99

2255

00

• Successful add() at point when fully linked • Add fullyLinked bit to indicate this• Bit tested by contains()

0

0

66

0

0

0

Page 57: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

contains(7): Linearization

8877

99

2255

00

66

0

00

0

0

• When fully-linked unmarked node found• Pause while fullyLinked bit unset

Page 58: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

contains(7): Linearization

88

66

99

2255

00

77

0

0

1

0

0

• When do we linearize unsuccessful Search?

1So far OK…

Page 59: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

contains(7): Linearization

88

66

99

2255

00

77

0

00

0

• When do we linearize unsuccessful Search?

77

But what if a new 7 added concurrently?

Page 60: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

contains(7): Linearization

88

66

99

2255

00

77

0

00

0

• When do we linearize unsuccessful Search?

1

77

Prove: at some point 7was not in the skip list

Page 61: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

A Simple Experiment

• Each thread runs 1 million iterations, each either:– add()– remove()– contains()

• Item and method chosen in random from some distribution

Page 62: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Lazy Skip List: Performance

Multiprogramming

search

Th

rou

gh

pu

t

Page 63: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Lazy Skip List: Performance

Multiprogramming

Higher contention

searchT

hro

ug

hp

ut

Page 64: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Lazy Skip List: Performance

Multiprogramming

Unrealistic Contention

search

Th

rou

gh

pu

t

Page 65: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

Summary

• Lazy Skip List– Optimistic fine-grained Locking

• Performs as well as the lock-free solution in “common” cases

• Simple

Page 66: Multicore Programming Skip list Tutorial 10 CS 0368-3469 Spring 2010

           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– http://creativecommons.org/licenses/by-sa/3.0/.

• 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.