g etting f ull s peed with d elphi primož gabrijelčič [email protected] otl.17slon.com [w...

35
GETTING FULL SPEED WITH DELPHI Primož Gabrijelčič [email protected] www.thedelphigeek.com otl.17slon.com [WHY SINGLE-THREADING IS NOT ENOUGH?]

Upload: coleen-montgomery

Post on 24-Dec-2015

223 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

GETTING FULL SPEED WITH DELPHI

Primož Gabrijelčič[email protected]

www.thedelphigeek.comotl.17slon.com

[WHY SINGLE-THREADING IS NOT ENOUGH?]

Page 2: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Multithreading

Page 3: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

What?•The art of doing multiple things at the same time

Page 4: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Why?•The end of free lunch

Page 5: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

How?•OmniThreadLibrary

Page 6: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

When?•Rarely

Page 7: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

WHAT?

Page 8: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Threading

• A thread is a line of execution through a program– There is always one thread

• Multitasking (and multithreading)– Cooperative– Preemptive • Time slicing• Parallel execution

Page 9: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Processes vs. Threads

• Pros– Processes are isolated – data protection is simple

• Cons– Processes are isolated – data sharing is simple– Processes are heavy, threads are light

Page 10: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Problems

• Data sharing– Messaging– Synchronization

• Synchronization causes– Race conditions– Deadlocking– Livelocking

• Slowdown

Page 11: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

WHY?

Page 12: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

The End of Free Lunch

© Herb Sutter, www.gotw.ca/publications/concurrency-ddj.htm

What we want

What we have

Page 13: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

HOW?

Page 14: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Four paths to multithreading• The Delphi Way– TMyThread = class(TThread)

• The Windows Way– FHandle := BeginThread(nil, 0, @ThreadProc,

Pointer(Self), 0, FThreadID);• The Lightweight Way (AsyncCalls)– TAsyncCalls.Invoke(procedure begin

DoTheCalculation;end);

• OmniThreadLibrary

Page 15: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

OmniThreadLibrary is …

• … VCL for multithreading– Simplifies programming tasks– Componentizes solutions– Allows access to the bare metal

• … trying to make multithreading possible for mere mortals

• … providing well-tested components packed in reusable classes with high-level parallel programming support

Page 16: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Project Status

• OpenBSD license• Actively developed– 886 commits [

code.google.com/p/omnithreadlibrary/]

• Actively used– 2.0: 1206 downloads– 1.05: 2028 downloads

[March 1st, 2011]

• Almost no documentation

Page 17: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

HOW?

Page 18: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

High level multithreading

• Join• Futures• Pipelines• Fork/Join• Parallel for

• Delphi 2009 required

Page 19: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Join

• Divide and Wait– Start multiple background calculations– Wait for all to complete– No result is returned (directly)

• Two basic forms– Join(task1, task2);– Join([task1, task2, task3, … taskN]);

Page 20: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Future• Wikipedia– “They (futures) describe an object that acts as a

proxy for a result that is initially not known, usually because the computation of its value has not yet completed.”

– Start background calculation, wait on result.• How to use?– Future:=TOmniFuture<type>.Create( calculation);

– Query Future.Value;

Page 21: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Pipeline

• Multistage process

Page 22: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Pipelinesvar pipeOut: IOmniBlockingCollection;

pipeOut := Parallel.Pipeline .Stage(StageGenerate) .Stage(StageMult2) .Stage(StageSum) .Run;

Page 23: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Fork/Join

• Divide and conquer– Execute multiple tasks– Wait for them to terminate– Collect results– Proceed

• Subtasks may spawn new subtasks

Page 24: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Fork/Joinmax1 := forkJoin.Compute( function: integer begin Result := … end);max1 := forkJoin.Compute( function: integer begin Result := … end);Result := Max(max1.Value, max2.Value);

Page 25: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Parallel ForParallel .ForEach(1, CMaxSGPrimeTest) .Execute( procedure (const value: integer) begin if IsPrime(value) then numPrimes.Increment; end);

Page 26: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Messaging

• TOmniMessageQueue• TOmniQueue– Dynamically allocated, O(1) enqueue and

dequeue, threadsafe, microlocking queue

• TOmniBlockingCollection

• TOmniValue

Page 27: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Tasks vs. Threads

• Task is part of code that has to be executed• Thread is the execution environment• You take care of the task,

OTL takes care of the thread

Page 28: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Task Execution

• CreateTask(task_procedure)• CreateTask(task_method )• CreateTask(TOmniWorker_object)• CreateTask(anonymous_procedure)

Page 29: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Thread Pool

• Starting up a thread takes time• Thread pool keeps threads alive and waits for

tasks• Automatic thread startup/shutdown• User code executed at thread creation– Connection pool

• .Run .Schedule⇨

Page 30: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

WHEN?

Page 31: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Danger!

“New programmers are drawn to multithreading

like moths to flame, with similar results.”

-Danny Thorpe

Page 32: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

When To Use

• Slow background process• Background communication• Executing synchronous API• Multicore data processing• Multiple clients

Page 33: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Keep in mind

• Don’t parallelize everything• Don’t create thousands of threads• Rethink the algorithm• Prove the improvements• Test, test and test

Page 34: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

Be Afraid

• Designing parallel solutions is hard• Writing multithreaded code is hard• Testing multicore applicationss is hard• Debugging multithreading

code is pure insanity

Page 35: G ETTING F ULL S PEED WITH D ELPHI Primož Gabrijelčič primoz@gabrijelcic.org  otl.17slon.com [W HY S INGLE -T HREADING I S N OT E

QUESTIONS?