+ All Categories
Home > Documents > FastFlow: high-level programming patterns with non ...

FastFlow: high-level programming patterns with non ...

Date post: 16-Oct-2021
Category:
Upload: others
View: 8 times
Download: 0 times
Share this document with a friend
48
FastFlow: high-level programming patterns with non-blocking lock-free run-time support Marco Aldinucci - Uni. of Torino, Italy Massimo Torquati and Marco Danelutto - Uni. Pisa, Italy Massimiliano Meneghin - IBM Research, Ireland Peter Kilpatrick - Queen’s Uni. Belfast, U.K. Maurizio Drocco - Uni. Torino, Italy UPMARC Workshop on Task-Based Parallel Programming Uppsala 2012 September 28, 2012 Uppsala, Sweden
Transcript
Page 1: FastFlow: high-level programming patterns with non ...

FastFlow: high-level programming patterns with non-blocking lock-free run-time support

Marco Aldinucci - Uni. of Torino, Italy

Massimo Torquati and Marco Danelutto - Uni. Pisa, ItalyMassimiliano Meneghin - IBM Research, IrelandPeter Kilpatrick - Queen’s Uni. Belfast, U.K.Maurizio Drocco - Uni. Torino, Italy

UPMARC Workshop on Task-Based Parallel ProgrammingUppsala 2012

September 28, 2012Uppsala, Sweden

Page 2: FastFlow: high-level programming patterns with non ...

Outline

✴ Concurrency and multi-core, the theoretical background✦ a personal perspective

✴ FastFlow✦ A programming model (and a library) for multicore (& manycore)

✦ Fast core-to-core lock-free messaging

✴ Applications

✴ Discussion

2

Page 3: FastFlow: high-level programming patterns with non ...

`````````````

Our tool perspective

Sharedmemory

Macro Data Flow

Beowulf

Grid

MPP

Autonomic

3

P3L1991

SKiE1997

OCamlP3L1998

SKElib2000

Lithium2002

Muskel2006

FastFlow2009

Eskimo2003

ASSIST2001

ASSISTant2008

GCM2008

GPG

PUs

Page 4: FastFlow: high-level programming patterns with non ...

Concurrency and multi-coretheoretical background: a personal

perspective

4

Page 5: FastFlow: high-level programming patterns with non ...

UPMARC workshop on task based programming ...

✦ FastFlow is NOT a task based framework, focus specifically on data movements and synchronizations (shmem/distr/GPU)

✦ it does not expose the task concept, it rather abstracts:

• networks of nodes (threads/processes) that can synchronize efficiently (via message passing) and move data (via shared memory or message passing)

• predefined, OO extendable, composable patterns (i.e. networks of nodes)

✦ orthogonal way of thinking w.r.t. tasks

• nodes are pinned to core, no over-provisioning, ...

✦ it can middleware to build your own task based framework

• inherit lock-free synchronization mechanisms (that aren’t friendly guys)

• just create an object, and pass the pointer

• predefined facilities to manage load-balancing, data-placement, OO-extendable

5

Page 6: FastFlow: high-level programming patterns with non ...

simeng

gath

er

simeng

disp

tach

incomplete simulation tasks (with load balancing)

farm

alig

nmen

t of

traje

ctor

ies

gene

ratio

n of

si

mul

atio

n ta

sks

simulation pipeline

start new simulations, steer and terminate running simulations

stateng

gath

er

disp

tach

farm

gene

ratio

n of

sl

idin

g w

indo

ws

of tr

ajec

torie

sraw simulation

results display ofresults

---Graphical

UserInterface

meanvariance k-means

filtered simulation

results

stateng

analysis pipelinemain pipeline

Parallel stochastic sim for system biology IEEE PDP 2011, HiBB 2011, Briefings in Bioinformatics (invited), Bio-IT world (invited), IEEE PDP 2013 (submitted), BMC Bioinformatics

6

task sizeDSL task engine

Page 7: FastFlow: high-level programming patterns with non ...

Simulation of transcriptional regulation in Neurospora

Parallel stochastic sim for system biology IEEE PDP 2011, HiBB 2011, Briefings in Bioinformatics (invited), Bio-IT world (invited), IEEE PDP 2013 (submitted), BMC Bioinformatics

7M. Aldinucci et al. On designing multicore-aware simulators for biological systems. PDP 2011. 2011. IEEE.

5

10

15

20

25

30

5 10 15 20 25 30

spee

dup

n. simulation engines (sim eng)

ideal240 trajectories480 trajectories

1200 trajectories

Page 8: FastFlow: high-level programming patterns with non ...

Micro-benchmarks: farm of tasks

void Emitter () { for ( i =0; i <streamLen;++i){ task = create_task (); queue=SELECT_WORKER_QUEUE(); queue −>PUSH(task);

} }

void Worker() { while (!end_of_stream){ myqueue −>POP(&task); do_work(task) ; }

}

int main () { spawn_thread( Emitter ) ; for ( i =0; i <nworkers;++i){ spawn_thread(Worker);

} wait_end () ;

}

E C

W1

W2

Wn

Used to implement: parameter sweeping, master-worker, etc.

8

Page 9: FastFlow: high-level programming patterns with non ...

Task farm with POSIX lock/unlock

2 3 4 5 6 7 80

2

4

6

8

Spee

dup

Number of Cores

Ideal 50 μS 5 μS 0.5 μSE C

W1

W2

Wn

average execution time per task

9

Page 10: FastFlow: high-level programming patterns with non ...

Can we avoid locks?

✴ Under relaxed memory models, using CAS/RW-ops✦ nonblocking algorithms

✦ they perform better than lock-based

✦ they fence the memory and pay cache coherency reconciliation overhead

✦ in GPUs ...

• CAS/atomic ... you have to go to the global memory

10

Page 11: FastFlow: high-level programming patterns with non ...

Lock vs Nonblocking CAS (fine grain 0.5 μS)

2 3 4 5 6 7 80

2

4

6

8

Spee

dup

Number of Cores

Ideal POSIX lock CAS

11

E C

W1

W2

Wn

Page 12: FastFlow: high-level programming patterns with non ...

Re-starting from the basics

✴ Reducing the problem to the bare bones✦ Producer-Consumer model (streaming)

✦ Directly control thread blocking using non-blocking synchronisations

✦ Directly design the “data channel”

• Having clear how data move in the whole memory hierarchy

✴ Restarting from the FIFO queue P C

12

Page 13: FastFlow: high-level programming patterns with non ...

Producer-Consumer✴ Producer-Consumer queues

✦ fundamental data structures in concurrent systems

• data/message channels synchronization, task scheduling, ...

• work-stealing mechanisms (e.g. for OpenMP runtime)

✴ Producer-Consumer vs Mutual Exclusion ✦ Mutex is inherently more complex (requires deadlock-freedom)

• require interlocked ops (CAS, ...), that induces memory fences, thus cache invalidation

• Dekker and Bakery algorithms requires Sequential Consistency

• Producer Consumer is a cooperative (non cyclic) process

✴ Producer-Consumer vs Transactional Memories (?)✦ To be tested extensively, interesting to understand what happens when data is

moved to another core (get an invalidation?)

✦ Transactions happens at cache line level (IBM/BlueGene) or blocking decode unit (IBM/PPC x86_64/ring0 wait on reservation)

13

Page 14: FastFlow: high-level programming patterns with non ...

Concurrent queues

✴ Concurrency level ✦ SPSC, SPMC, MCSP, MPMC

✴ Internal data structures✦ Array-based, List-based

✴ Size ✦ Bounded, Unbounded

✴ Progress guarantees✦ No guarantee (blocking), Obstruction freedom, Lock freedom,

Wait freedom

14

Page 15: FastFlow: high-level programming patterns with non ...

Blocking vs non-blocking

✴ What are the performance implications of the progress properties ?

✴ For medium/coarse grain applications:✦ Blocking faster than Non-Blocking

✴ For fine grain applications:✦ Non-Blocking faster than Blocking

✦ Obstruction-Free faster than Lock-Free faster than Wait-Free

✴ In the general case:✦ Stronger properties are harder to maintain

15

several task-based

approaches are here

I’m focusing here

Page 16: FastFlow: high-level programming patterns with non ...

Related Work: Lock-free, CAS-free, wait-free

✴ Single-Producer-Single-Consumer FIFO queues ✦ Lamport et al. 1983 Trans. PLS (Sequential consistency only - in memory)

✦ Higham and Kavalsh. 1997 ISPAN (P1C1 - TSO + proof - in memory)

✦ Giacomoni et al. 2008 PPoPP (TSO + cache slipping - in memory)

✦ BatchQueue & MCRingBuffer (TSO, double/multiple-buffering - in memory)

✴ Multiple-Producers-Multiple-Consumers FIFO queues✦ Blocking 2-locks - Michael and Scott

✦ Nonblocking with CAS - list-based - Michael and Scott (PODC96)

• Requires deferred reclamation/hazard pointers to avoid ABA problem

✦ Nonblocking with CAS - array-based - Tsigas and Zhang (PAA01)

✦ Nonblocking without CAS - in memory ➠ Cannot be done

✦ Nonblocking without CAS - with mediator thread ➠ FastFlow

16

Page 17: FastFlow: high-level programming patterns with non ...

Recap: coherence and consistency

✴ Memory/Cache Coherence✦ Deal with multiple replicas of the same location in different caches

✴ Memory Consistency✦ Deal with the ordering in which writes

and reads at different locations take effect in memory (issued by either the same or different processors/cores)

17

write(A,3)

write(A,1)Thread 1

Thread 2read(A,?)

Page 18: FastFlow: high-level programming patterns with non ...

Lamport FIFO - 1983

FastFlow SPSC queues

push_nonbocking(data) { if (NEXT(head) == tail) { return EWOULDBLOCK; } buffer[head] = data; head = NEXT(head); return 0;}

pop_nonblocking(data) {

if (head == tail) { return EWOULDBLOCK; } data = buffer[tail]; tail = NEXT(tail); return 0;}

push_nonbocking(data) { if (NULL != buffer[head]) { return EWOULDBLOCK; } buffer[head] = data; head = NEXT(head); return 0;}

pop_nonblocking(data) { data = buffer[tail]; if (NULL == data) { return EWOULDBLOCK; } buffer[tail] = NULL; tail = NEXT(tail); return 0;}

FastFlow FIFOderived from P1C1 (Higham and Kavalsh, ISPAN 1997)

& FastForward (Giacomoni et al, PPoPP 2008)

18

(WMB)For any model weaker

than TSO

Page 19: FastFlow: high-level programming patterns with non ...

Lamport FIFO - 1983

FastFlow SPSC queues

push_nonbocking(data) { if (NEXT(head) == tail) { return EWOULDBLOCK; } buffer[head] = data; head = NEXT(head); return 0;}

pop_nonblocking(data) {

if (head == tail) { return EWOULDBLOCK; } data = buffer[tail]; tail = NEXT(tail); return 0;}

push_nonbocking(data) { if (NULL != buffer[head]) { return EWOULDBLOCK; } buffer[head] = data; head = NEXT(head); return 0;}

pop_nonblocking(data) { data = buffer[tail]; if (NULL == data) { return EWOULDBLOCK; } buffer[tail] = NULL; tail = NEXT(tail); return 0;}

FastFlow FIFOderived from P1C1 (Higham and Kavalsh, ISPAN 1997)

& FastForward (Giacomoni et al, PPoPP 2008)

head and tail are mutually invalidated by

producer and consumer1 cache miss every push

and pop (at least)

18

excluding “true” deps

extended domainon void *

(WMB)For any model weaker

than TSOproducer read/write headconsumer read/write tail

no misses

Page 20: FastFlow: high-level programming patterns with non ...

Lock vs CAS vs SPSC FastFlow (50 μS)

2 3 4 5 6 7 80

2

4

6

8

Spee

dup

Number of Cores

Ideal POSIX lock CAS FastFlowE C

W1

W2

Wn

19

Page 21: FastFlow: high-level programming patterns with non ...

Lock vs CAS vs SPSC FastFlow (5 μS)

2 3 4 5 6 7 80

2

4

6

8

Spee

dup

Number of Cores

Ideal POSIX lock CAS FastFlowE C

W1

W2

Wn

20

Page 22: FastFlow: high-level programming patterns with non ...

Lock vs CAS vs SPSC FastFlow (0.5 μS)

2 3 4 5 6 7 80

2

4

6

8

Spee

dup

Number of Cores

Ideal POSIX lock CAS FastFlowE C

W1

W2

Wn

21

Page 23: FastFlow: high-level programming patterns with non ...

Medium grain (5 μS workload)

E C

W1

W2

Wn

22

Page 24: FastFlow: high-level programming patterns with non ...

Layer 1: Simple streaming networks

4 sockets x 8 core x 2 contexts

Xeon E7-4820 @2.0GHz Sandy Bridge 18MB L3 shared cache, 256K L2

0

5

10

15

20

25

30

35

40

45

64 128 256 512 1k 2k 4k 8k

nanose

conds

buffer size

P and C on different cores same CPU

1.50 1.37 0.83

1.330.75 0.82 0.50 0.46

0

5

10

15

20

25

30

35

40

45

64 128 256 512 1k 2k 4k 8k

nanoseco

nd

s

buffer size

P and C on different CPUs

3.333.15

2.23

2.91

3.56

4.08

2.43

2.76

0

5

10

15

20

25

30

35

40

45

64 128 256 512 1k 2k 4k 8k

nanose

conds

buffer size

P and C on same core distinct contexts

0.19 0.14 0.12 0.11 0.09 0.11 0.11 0.11

different sockets

MPI shmem implis ~190 ns at best

(D.K. Panda)

same socket same core different contexts same socket different cores different

23

Page 25: FastFlow: high-level programming patterns with non ...

Layer 1: Simple streaming networks

DRAFT

1 int size = N; //SPSC size

2 bool push(void∗ data) {3 if (buf w�>full()) {4 SPSC∗ t = pool.next w();

5 if (! t) return false;

6 buf w = t;

7 }8 buf w�>push(data);

9 return true;

10 }11 bool pop(void∗∗ data) {12 if (buf r�>empty()) {13 if (buf r == buf w) return false;

14 if (buf r�>empty()) {15 SPSC∗ tmp = pool.next r();

16 if (tmp) {17 pool. release (buf r) ;

18 buf r = tmp;

19 }20 }21 }22 return buf r�>pop(data);

23 }

25 struct Pool {26 dSPSC inuse;

27 SPSC cache;

29 SPSC∗ next w() {30 SPSC∗ buf;

31 if (!cache.pop(&buf))

32 buf = allocateSPSC(size);

33 inuse.push(buf);

34 return buf;

35 }36 SPSC∗ next r() {37 SPSC∗ buf;

38 return (inuse.pop(&buf)? buf : NULL);

39 }40 void release(SPSC∗ buf) {41 buf�>reset(); // reset pread and pwrite

42 if (!cache.push(buf))

43 deallocateSPSC(buf);

44 }45 }

Fig. 3: Unbounded wait-free uSPSC queue implementation.

impossible since, if the consumer switches to the next bu↵er while the previousone is not really empty, a data loss will occur. In the next section we prove thatthe if condition at line §3.�� is su�cient to ensure correct execution.

Theorem 2 (uSPSC). The uSPSC unbound queue sketched in Fig. 3 is correct(and wait-free) under any memory consistency model provided that it is built withinternal SPSC queues with size > 1.

Proof. The SPSC queue used as basic building block of the uSPSC queue hasbeen proved correct in [18,13]. Both the producer and the consumer initiallywork on the same bu↵er. The correct execution of pop and push is guaranteedby the correctness of the bu↵er (i.e. the internal SPSC queue) up to the momentthe bu↵er becomes full and the producer starts writing to a new bu↵er. We havetwo cases: the bu↵er the consumer is reading from is either non-empty or empty.In the former case, the correctness is again ensured by bu↵er correctness. Thelatter case is more subtle.

In a relaxed memory consistency model the consumer can be aware that theproducer has changed the writing bu↵er only with the writing of the data of theprevious push because of the Write Memory Barrier (WMB) at line §1.�. In fact,without the WMB, the new value of buf w (line §3.�) and the value to writtento the bu↵er (buf[pwrite] in the previous push at line §1.�) might appear inmemory in any order. Thus — in principle — it can be possible that the readingbu↵er buf r is still perceived as empty and a new writing bu↵er has been alreadystarted (buf r 6= buf w); the condition at line §3.�� could therefore evaluate totrue even if the previous bu↵er is not actually empty. This condition mightlead to data loss because the consumer might overtake and abandon a bu↵erstill holding a valid value. In the uSPSC implementation this cannot happen

M. Aldinucci, S. Campa, M. Danelutto, M. Torquati. An Efficient Synchronisation Mechanism for Multi-Core Systems.

EuroPar 2012.Wed 29 Aug - B3 multicore 14.30-16.00

tail head

dynamiclinked listof circular

buffers

P C

24

Page 26: FastFlow: high-level programming patterns with non ...

Layer 1: Simple streaming networks http://www.1024cores.net/home/technologies/fastflow

S2

S3 S4

S1 Sn

...

25

50K

100K

150K

200K

1 8 16 24 32 40 48 56 64

Thro

ugh

put (m

sg/s

)

n. threads

uSPSCdSPSC

dSPSC no cache

4 sockets x 8 core x 2 contexts

Xeon E7-4820 @2.0GHz Sandy Bridge 18MB L3 shared cache, 256K L2

Linked list w/ dyn allocMichael-Scott queue

well-known ~ 400 citations 0

50

100

150

200

250

300

350

400

450

64 1024 8192

nanose

conds

buffer size

mapping 1mapping 2mapping 3

Linked list with poolingOpt Michael-Scott queue

(our result)

20x faster

0

5

10

15

20

25

30

35

40

45

64 1024 8192

nanose

cond

s

buffer size

mapping 1mapping 2mapping 3

Linked list + circular bufferFastFlow queue

(our result)

12x faster

same coresame socketdifferent sockets

Speedup

<35 ns irrespectivelyof the mapping

Page 27: FastFlow: high-level programming patterns with non ...

new(C)

delete(B)new(A)

delete(A)delete(C)

new(B)new(C)

Unbound queues are useful

26

0

2

4

6

8

10

12

14

1 4 8 12 16 20 24 28 32

Tim

e (s

)

N. of (dealloc) threads

10M alloc/dealloc (32B) - 1µs tasks - 32-core Intel E7 2Ghz

Hoard-3.9libc-6TBB-4.0FastFlowIdeal

Page 28: FastFlow: high-level programming patterns with non ...

new(C)

delete(B)new(A)

delete(A)delete(C)

new(B)new(C)

Unbound queues are useful

OSallocator

26

0

2

4

6

8

10

12

14

1 4 8 12 16 20 24 28 32

Tim

e (s

)

N. of (dealloc) threads

10M alloc/dealloc (32B) - 1µs tasks - 32-core Intel E7 2Ghz

Hoard-3.9libc-6TBB-4.0FastFlowIdeal

Page 29: FastFlow: high-level programming patterns with non ...

new(C)

delete(B)new(A)

delete(A)delete(C)

new(B)new(C)

Unbound queues are useful

✴ Faster than posix, often faster than hoard and TBB

✦ unpublished, but available on sourceforge

✦ needs lot of comparative testing to be published

✴ Implements deferred deallocation to avoid ABA problem

FF allocator

The graph is now cyclicand needs unbound

queues to avoid deadlocks

26

0

2

4

6

8

10

12

14

1 4 8 12 16 20 24 28 32

Tim

e (s

)

N. of (dealloc) threads

10M alloc/dealloc (32B) - 1µs tasks - 32-core Intel E7 2Ghz

Hoard-3.9libc-6TBB-4.0FastFlowIdeal

Page 30: FastFlow: high-level programming patterns with non ...

FastFlow

27

Page 31: FastFlow: high-level programming patterns with non ...

Lock-free and CAS-free?

✴ Mutex cannot be doneSingle-Producer-Single-Consumer (SPSC) can be done✦ Producer-Consumer is inherently weaker with respect to Mutex

✦ It does require the cooperation of partners whereas Mutex does not

✴ Expressive enough to build a streaming (or dataflow) programming framework✦ MPMC = SPSC + mediator threads

✴ But what about productivity at large scale?✦ Write a program is defining a graph encoding true dependencies ... not

really easy

28

Page 32: FastFlow: high-level programming patterns with non ...

FastFlow is based on producer-consumer

✦ Lock-free/fence-free non-blocking synchronisations

✦ C++ STL-like implementation

✦ thread-model agnostic (pthreads, QT, windows threads, ...)

✦ compliant with other synchronisation mechanisms in the business code (e.g. locks and semaphores)

29

Multi-core and many-corecc-UMA or cc-NUMA featuring sequential or weak consistency

Simple streaming networks (building blocks)Lock-free SPSC queues and general threading model

Arbitrary streaming networks (building blocks)Lock-free SPSC, SPMC, MPSC, MPMC queues

Streaming networks patternsSkeletons: Pipeline, farm, D&C, ...

Simulation Montecarlo

Acceleratorself-offloading

AutonomicBehav.Skeletons

Efficient applications for multicore and manycoreSmith-Waterman, N-queens, QT, C4.5, FP-Growth, ...

FastFlow

Problem SolvingEnvironment

High-levelprogramming

Low-levelprogramming

Run-timesupport

Hardware

Applications

E C

P C

Producer Consumerlock-free SPSC queue

SPMC MPSC

Wn

W1

Farm

inputstream

outputstream

E C

Wn

W1

D&C

usesE

E

SPMC

C

MPSC

Page 33: FastFlow: high-level programming patterns with non ...

Pattern-based approach: rationale

✴ Abstract parallelism exploitation pattern by parametric code✦ E.g. higher order function, code factories, C++ templates, ...

✦ Can composed and nested as programming language constructs + offloading

✦ Stream and Data Parallel

✴ Platform independent✦ Implementations on different multi/many-cores

✦ Support for hybrid architectures thanks to pattern compositionality

✴ Provide state-of-the-art, parametric implementation of each parallelism exploitation pattern✦ With natural way of extending patterns, i.e. OO

✦ Functional (seq code) and tunable extra-functional (QoS) parameters

30

Page 34: FastFlow: high-level programming patterns with non ...

✴ farm✦ on CPU - master-worker - parallelism exploitation

✦ on GPU - CUDA streams - automatic exploitation of asynch comm

✴ pipeline✦ on CPU - pipeline

✦ on GPU - sequence of kernel calls or global mem synch

✴ map✦ on CPU - master-worker - parallelism exploitation

✦ on GPU - CUDA SIMT - parallelism exploitation

✴ reduce✦ on CPU - master-worker - parallelism exploitation

✦ on GPU - CUDA SIMT (reduction tree) - parallelism exploitation

✴ D&C✦ on CPU - master-worker with feedback - // exploitation

✦ on GPU - working on it, maybe loop+farm

Patterns, their implementation, and their purpose

31

stream[k]

copy_D2H

kernel

copy_H2D

stream[0]

farm_start

stream[1] stream[n]

farm_start

Page 35: FastFlow: high-level programming patterns with non ...

Composition

✴ Composition via C++ template meta-programming

✦ CPU: Graph composition

✦ GPU: CUDA streams

✦ CPU+GPU: offloading

✴ farm{ pipe }

✴ pipe(farm, farm)

✴ pipe(map, reduce)

✴ ....

32

copy_D2H

kernel

copy_H2D

farm_start

copy_D2H

kernel

copy_H2D

copy_D2H

kernel

copy_H2D

farm_start

Page 36: FastFlow: high-level programming patterns with non ...

#include <vector>#include <iostream>#include <ff/farm.hpp>

using namespace ff;

// generic workerclass Worker: public ff_node {public: void * svc(void * task) { int * t = (int *)task; std::cout << "Worker " << ff_node::get_my_id() << " received task " << *t << "\n"; return task; } // I don't need the following functions for this test //int svc_init() { return 0; } //void svc_end() {}

};

// the gatherer filterclass Collector: public ff_node {public: void * svc(void * task) { int * t = (int *)task; if (*t == -1) return NULL; return task; }};

// the load-balancer filterclass Emitter: public ff_node {public: Emitter(int max_task):ntask(max_task) {};

void * svc(void *) { int * task = new int(ntask); --ntask; if (ntask<0) return NULL; return task; }private: int ntask;};

int main(int argc, char * argv[]) {

if (argc<3) { std::cerr << "use: " << argv[0] << " nworkers streamlen\n"; return -1; } int nworkers=atoi(argv[1]); int streamlen=atoi(argv[2]);

if (!nworkers || !streamlen) { std::cerr << "Wrong parameters values\n"; return -1; } ff_farm<> farm; // farm object Emitter E(streamlen); farm.add_emitter(&E);

std::vector<ff_node *> w; for(int i=0;i<nworkers;++i) w.push_back(new Worker); farm.add_workers(w); // add all workers to the farm

Collector C; farm.add_collector(&C); if (farm.run_and_wait_end()<0) { error("running farm\n"); return -1; } std::cerr << "DONE, time= " << farm.ffTime() << " (ms)\n"; farm.ffStats(std::cerr);

return 0;}

E C

W1

W2

Wn 33

Page 37: FastFlow: high-level programming patterns with non ...

+ distributed

✴ Generic ff_node is subclassed to ff_dnode

✴ ff_dnode can support network channels✦ P2P or collective

✦ used as frontier node of streaming graph

✦ can be used to merge graphs across distributed platforms

✴ No changes to programming model✦ at least require to “add” stub ff_dnode✦ when passing pointers data is serialised

• serialisation hand-managed (zero-copy, think to Java!)

M. Aldinucci, S. Campa, M. Danelutto, M. Torquati, P. Kilpatrick. Targeting distributed systems in FastFlow. CGW-Europar 2012

Streaming network patternsSkeletons: pipeline, map farm, reduce, D&C, ...

Arbitrary streaming networksLock-free SPSC/MPMC queues + FF nodes

Simple streaming networksLock-free SPSC queues + threading model

FastFlow

Multicore and manycoreSMP: cc-UMA & cc-NUMA

Applications on multicore, many core & distributed platforms of multicoresEfficient and portable - designed with high-level patterns

Distributed platformsClouds, clusters of SMPs

Simple streaming networksZero copy networking + processes model

Arbitrary streaming networksCollective communications + FF Dnodes

34

Page 38: FastFlow: high-level programming patterns with non ...

+ OpenCL (working on)

35

Page 39: FastFlow: high-level programming patterns with non ...

Summary

✴ Patterns at the high-level✦ Currently as C++ templates

✦ Set of patterns can be extended, semantics of patterns can be changed, complexity gracefully increase with semantic distance

✴ Used to generate cyclic streaming networks (of threads, ...)✦ Graphs, describing true data dependencies. Can be composed and

transformed as graphs

✦ Cyclic graphs need unbound queue

✦ Heterogeneous cores, thread affinity, memory affinity, NUMA, can be managed while mapping graph onto the metal

36

Page 40: FastFlow: high-level programming patterns with non ...

2012: Cholesky fact vs PLASMA librariesIEEE PDP 2012

37

Page 41: FastFlow: high-level programming patterns with non ...

C4.5 (Fine grain - irregular D&C)PKDD 2011

38

Page 42: FastFlow: high-level programming patterns with non ...

Smith Waterman vs TBB vs OpenMP vs CilkParallel Computing 2010

39

Page 43: FastFlow: high-level programming patterns with non ...

Two-phase denoisingIEEE IPTA 2012

40

Adaptivemedian filterdifferent pixels are

independent and can be easily processed

in parallelpixels are read-only

Iterative variational methodanswer to the question:

which is the greyscale level that better “integrate” in

the surrounding (i.e. keeps edges)

at each iteration an approximation of restored

pixels is available

map p in pixels while (winsize<MAX) if (homogenous(p,winsize)) winsize++; else if isImpluse(p) return NOISY; return NOT_NOISY;

while !fixpoint map u in N (noisy pixels) new_u = value_that_minimize F(u); reduce(u in N,new_u in NEW_N, diff);

detect

denoise4

only irregularities due to the affecting noise, thus leaving out high-level discontinuities (edges). � and ↵ are the

regularization parameters that balance the effects of both mentioned terms. Among all the functionals F(u) (see

[21]) for edge preserving proposed during the last fifteen years, we have selected the one proposed in [15]:

F

d

|N

(u) =

X

(i,j)2N

[|ui,j

� d

i,j

|+ �

2

(S1 + S2)] (2)

where

S1 =

X

(m,n)2Vi,j\N

2 · '(ui,j

� d

m,n

) (3)

S2 =

X

(m,n)2Vi,j\N

c

'(u

i,j

� u

m,n

) (4)

where N represents the noisy pixels set, N c the set of uncorrupted pixels, and V

i,j

is the set of the four closest

neighbors of the pixel with coordinates (i, j) and d is the corrupted image. As in [15], we have used the following

' function that provides the best trade-off between edge preserving and denoising:

'(t) = |t|↵ with 1 < ↵ 2 (5)

The values of ↵ and � were, respectively, set to 1.3 and 4 in order to guarantee the trade-off between noise

removal and edge preservation provided by the function '.

The minimization problem is then solved by an algorithm that works on the residuals z = u� y of the functional

(1) and it is following reviewed:

– Initialize z

(0)ij

= 0 for each (ij) 2 A;

– At each iteration k, calculate, for each (ij) 2 A,

(k)i,j

= �

X

(m,n)2Vi,j

' (y

i,j

� z

i,j

� y

m,n

)

where z

m,n

, for (m,n) 2 V i, j, are the latest updates and ' is the derivative of '.

– If ⇠(k)i,j

1, z(k)i,j

will be set to 0. If not, z(k)i,j

is the solution of the following equation:

X

(m,n)2Vi,j

'

⇣z

(k)i,j

+ y

i,j

� z

m,n

� y

m,n

⌘= sign

⇣⇠

(k)i,j

The quasi-Newton method [22] is recursively applied to find the restored image u that minimizes the functional

shown in (2). The convergence criterion is |z(k) � z

(k�1)| < 1.

III. SEQUENTIAL ALGORITHM: EXPERIMENTAL EVALUATION

The algorithm has been prototyped in C++ and tested on a single core of an Intel workstation with 2 quad-core

Xeon E5520 Nehalem (16 HyperThreads) @2.26GHz with 8MB L3 cache and 24 GBytes of main memory with

Linux x86 64. The test of the denoising filter was performed on four images (256-by-256 and 8-bit gray-scale):

December 20, 2011 DRAFT

4

only irregularities due to the affecting noise, thus leaving out high-level discontinuities (edges). � and ↵ are the

regularization parameters that balance the effects of both mentioned terms. Among all the functionals F(u) (see

[21]) for edge preserving proposed during the last fifteen years, we have selected the one proposed in [15]:

F

d

|N

(u) =

X

(i,j)2N

[|ui,j

� d

i,j

|+ �

2

(S1 + S2)] (2)

where

S1 =

X

(m,n)2Vi,j\N

2 · '(ui,j

� d

m,n

) (3)

S2 =

X

(m,n)2Vi,j\N

c

'(u

i,j

� u

m,n

) (4)

where N represents the noisy pixels set, N c the set of uncorrupted pixels, and V

i,j

is the set of the four closest

neighbors of the pixel with coordinates (i, j) and d is the corrupted image. As in [15], we have used the following

' function that provides the best trade-off between edge preserving and denoising:

'(t) = |t|↵ with 1 < ↵ 2 (5)

The values of ↵ and � were, respectively, set to 1.3 and 4 in order to guarantee the trade-off between noise

removal and edge preservation provided by the function '.

The minimization problem is then solved by an algorithm that works on the residuals z = u� y of the functional

(1) and it is following reviewed:

– Initialize z

(0)ij

= 0 for each (ij) 2 A;

– At each iteration k, calculate, for each (ij) 2 A,

(k)i,j

= �

X

(m,n)2Vi,j

' (y

i,j

� z

i,j

� y

m,n

)

where z

m,n

, for (m,n) 2 V i, j, are the latest updates and ' is the derivative of '.

– If ⇠(k)i,j

1, z(k)i,j

will be set to 0. If not, z(k)i,j

is the solution of the following equation:

X

(m,n)2Vi,j

'

⇣z

(k)i,j

+ y

i,j

� z

m,n

� y

m,n

⌘= sign

⇣⇠

(k)i,j

The quasi-Newton method [22] is recursively applied to find the restored image u that minimizes the functional

shown in (2). The convergence criterion is |z(k) � z

(k�1)| < 1.

III. SEQUENTIAL ALGORITHM: EXPERIMENTAL EVALUATION

The algorithm has been prototyped in C++ and tested on a single core of an Intel workstation with 2 quad-core

Xeon E5520 Nehalem (16 HyperThreads) @2.26GHz with 8MB L3 cache and 24 GBytes of main memory with

Linux x86 64. The test of the denoising filter was performed on four images (256-by-256 and 8-bit gray-scale):

December 20, 2011 DRAFT

1

4

only irregularities due to the affecting noise, thus leaving out high-level discontinuities (edges). � and ↵ are the

regularization parameters that balance the effects of both mentioned terms. Among all the functionals F(u) (see

[21]) for edge preserving proposed during the last fifteen years, we have selected the one proposed in [15]:

F

d

|N

(u) =

X

(i,j)2N

[|ui,j

� d

i,j

|+ �

2

(S1 + S2)] (2)

where

S1 =

X

(m,n)2Vi,j\N

2 · '(ui,j

� d

m,n

) (3)

S2 =

X

(m,n)2Vi,j\N

c

'(u

i,j

� u

m,n

) (4)

where N represents the noisy pixels set, N c the set of uncorrupted pixels, and V

i,j

is the set of the four closest

neighbors of the pixel with coordinates (i, j) and d is the corrupted image. As in [15], we have used the following

' function that provides the best trade-off between edge preserving and denoising:

'(t) = |t|↵ with 1 < ↵ 2 (5)

The values of ↵ and � were, respectively, set to 1.3 and 4 in order to guarantee the trade-off between noise

removal and edge preservation provided by the function '.

The minimization problem is then solved by an algorithm that works on the residuals z = u� y of the functional

(1) and it is following reviewed:

– Initialize z

(0)ij

= 0 for each (ij) 2 A;

– At each iteration k, calculate, for each (ij) 2 A,

(k)i,j

= �

X

(m,n)2Vi,j

' (y

i,j

� z

i,j

� y

m,n

)

where z

m,n

, for (m,n) 2 V i, j, are the latest updates and ' is the derivative of '.

– If ⇠(k)i,j

1, z(k)i,j

will be set to 0. If not, z(k)i,j

is the solution of the following equation:

X

(m,n)2Vi,j

'

⇣z

(k)i,j

+ y

i,j

� z

m,n

� y

m,n

⌘= sign

⇣⇠

(k)i,j

The quasi-Newton method [22] is recursively applied to find the restored image u that minimizes the functional

shown in (2). The convergence criterion is |z(k) � z

(k�1)| < 1.

III. SEQUENTIAL ALGORITHM: EXPERIMENTAL EVALUATION

The algorithm has been prototyped in C++ and tested on a single core of an Intel workstation with 2 quad-core

Xeon E5520 Nehalem (16 HyperThreads) @2.26GHz with 8MB L3 cache and 24 GBytes of main memory with

Linux x86 64. The test of the denoising filter was performed on four images (256-by-256 and 8-bit gray-scale):

December 20, 2011 DRAFT

Page 44: FastFlow: high-level programming patterns with non ...

Two-phase denoisingIEEE IPTA 2012 (Istanbul, 15-18 Oct)

41

10% impulsive noise 50% impulsive noise 90% impulsive noiseOriginalBaboon standard

test image1024x1024

Restored

PNSR 43.29dB MAE 0.35 PNSR 23.4 MAE 11.21PNSR 32.75dB MAE 2.67

Page 45: FastFlow: high-level programming patterns with non ...

simeng

gath

er

simeng

disp

tach

incomplete simulation tasks (with load balancing)

farm

alig

nmen

t of

traje

ctor

ies

gene

ratio

n of

si

mul

atio

n ta

sks

simulation pipeline

start new simulations, steer and terminate running simulations

stateng

gath

er

disp

tach

farm

gene

ratio

n of

sl

idin

g w

indo

ws

of tr

ajec

torie

sraw simulation

results display ofresults

---Graphical

UserInterface

meanvariance k-means

filtered simulation

results

stateng

analysis pipelinemain pipeline

reducereduce reducereduce

a1 a2 a3 a4 b1 b2 b3 b4

c1 c2 c3 c4 d1 d2 d3 d4

e1 e2 e3 e4 f1 f2 f3 f4

{a,b}@P1

{c,d}@P2

{e,f}@P3

a1 b1

c1

e1

d1

f1

b2

c2

e2 f2

b3

a2

d2

e3 f3

c3

b4

d3

a3 e4

f4c4 d4

a4

{a,b}@P1

{c,d}@P2

{e,f}@P3

idle

F(a,...,f)

F(a,...,f)

idle

a1 b1

c1

e1

d1

f1

b2

c2

e2 f2

b3

a2

d2

e3 f3

c3

b4

d3

a3 e4

f4c4 d4

a4

{a,b}@P1

{c,d}@P2

{e,f}@P3

F2(a,...f)

simulationwall-clocktime

trajectory reduction

gainF1(a,...f)

F3(a,...f)

F4(a,...f)

ii)

iii)

i)

1's runs 2's runs 4's 3's

Parallel stochastic sim for system biology IEEE PDP 2011, HiBB 2011, Briefings in Bioinformatics (invited), Bio-IT world (invited), IEEE PDP 2013 (submitted), BMC Bioinformatics

42

5

10

15

20

25

30

5 10 15 20 25 30

spee

dup

n. simulation engines (sim eng)

ideal240 trajectories480 trajectories

1200 trajectories

Page 46: FastFlow: high-level programming patterns with non ...

Conclusions✴ FastFlow C++ pattern-based framework

✦ A tiny, lightweight & open research framework

✦ 3 years old - over 8K downloads - 40K contacts

✦ x86/PPC/ARM + Linux/Mac/Win/iOS

• Adopted as one run-time technology in ParaPhrase EU-FP7 STREP

• a laboratory to experiment new run-time solutions

• GPGPU integration (working on), Infiniband RDMA integration (working on),HW blocking reads (thinking on), HW transactional mem (thinking on) ...

• Stream-specific parallel memory allocator: fast (but still under test)

✦ Data-centric, focus on messaging and synchronization, thread model agnostic

✦ High-level = performance & portability

• Speedup starting from ~20 clock cycles workload on standard x86_64 (TBB >20K)

• Tested on dozen of apps, comparable or faster than TBB/OpenMP

• http://di.unito.it/fastflow

43

Page 47: FastFlow: high-level programming patterns with non ...

✴ Paraphrase✦ Parallel Patterns for Adaptive Heterogeneous Multicore Systems

✦ EU-FP7 STREP, 2011-2014, FastFlow is the background technology

✴ IMPACT✦ Innovative Methods for Particle Colliders at the Terascale

✦ National, 2012-2015, FastFlow is the background technology

✦ 1 postdoc position open: 2 years, about 1800 Euro/mount after taxes

✴ HiPEAC✦ High Performance and Embedded Architecture and Compilation

✦ EU NOE, 2012-2016

✴ BETTY✦ Behavioral Types for Reliable Large-Scale Software Systems 

✦ EU Cost Action, 2012-2016

44

Thank you

Page 48: FastFlow: high-level programming patterns with non ...

IMPACTInnovative Methods for Particle Colliders at the Terascale

(2012-2015, oversimplified vision)

1 postdoc position open2 years, about 1800 Euro/mount after taxes

huge data Diff(somehow)

Monte Carlo simulationof “known” processes

Filtered datato be analysed

(much smaller)

huge data

Particle physicists Theoretic physicists

new knowledge

Monte Carlo simulationssmaller but frequent

requires great “reactivity”of the workflow to tune models

new speculations

IMPACT project contributed to results on

preliminary results onchannel H→ZZ→4l

shown at Higg’s boson claim Jul 2012


Recommended