tim harris researcher microsoft corporation. source: table from

10
Tim Harris Researcher Microsoft Corporation

Upload: jeffery-malone

Post on 16-Dec-2015

219 views

Category:

Documents


2 download

TRANSCRIPT

Tim HarrisResearcherMicrosoft Corporation

Source: Table from http://www.intel.com/technology/mooreslaw/index.htm

1970

1980

1990

2000

2005

1,000

1,000,000

Transistor count1,000,000,000

4004

8086

Intel 486

Intel 386

286

IntelPentium

IntelPentium II

IntelPentium 4 Intel

Itanium 2

Increases in clock frequency

Increases in clock frequency

Increases in ILP

Increases in ILP

ParallelismParallelism

How do we find things to run in parallel?

How do we control sharing of data between concurrent threads?

Server workloads often provide a natural source of parallelism: Deal with

different clients concurrently

Server workloads often provide a natural source of parallelism: Deal with

different clients concurrently

Numerical workloads are, of course, also frequently parallelisable: Problems

can be partitioned, or parallel building blocks

composed

Numerical workloads are, of course, also frequently parallelisable: Problems

can be partitioned, or parallel building blocks

composed

Programmers aren’t good at thinking

about thread interleavings

Programmers aren’t good at thinking

about thread interleavings

…and locks provide a complicated solution

that discourages modularity

…and locks provide a complicated solution

that discourages modularity

Races: Due to forgotten locks Deadlock: Locks acquired in “wrong” order Lost wakeups: Forgotten notify to condition variableError recovery tricky: Need to restore invariants and release locks in exception handlersSimplicity versus scalability tensionLack of progress guarantees…but worst of all

Suppose we have a good concurrent hash table implementation:

void Swap(int kx, int ky) {vx = ht.Remove(kx);vy = ht.Remove(ky);ht.Insert(kx, vy);ht.Insert(ky, vx);

}

void Swap(int kx, int ky) {if (kx < ky) {

t = kx; kx = ky; ky = t;}ht.Lock(kx);ht.Lock(ky);vx = ht.Remove(kx);vy = ht.Remove(ky);ht.Insert(kx, vy);ht.Insert(ky, vx);ht.Unlock(kx);ht.Unlock(ky);

}

“Write the obvious sequential code and wrap ‘atomic’ around it”

void Swap(int kx, int ky) {atomic {

vx = ht.Remove(kx);vy = ht.Remove(ky);ht.Insert(kx, vy);ht.Insert(ky, vx);

}}

Integration with other language features (exceptions, finalizers, class initialization, ...)Integration with other parallel programming abstractions (locks/atomic, OpenMP, ...)Interaction with non-transacted resourcesCorrect usage and memory modelsPerformance analysis and tuningDebugging

© 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.

The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after

the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

Microsoft Research Faculty Summit 2007