1 / 62

CPE 631 Session 23: Multiprocessors (Part 4)

Review of the bus snooping topology in multiprocessor systems, including cache and memory interactions.

fbostic
Download Presentation

CPE 631 Session 23: Multiprocessors (Part 4)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CPE 631 Session 23: Multiprocessors (Part 4) Department of Electrical and Computer EngineeringUniversity of Alabama in Huntsville

  2. Review: Bus Snooping Topology P0 P1 Pn C - Cache M - Memory IO - Input/Output ... C C C IO M

  3. Snoopy-Cache State Machine CPU Read hit Write missfor this block Shared (read/only) CPU Read Invalid Place read miss on bus CPU Write Place Write Miss on bus Write missfor this block CPU read miss Write back block, Place read miss on bus CPU Read miss Place read miss on bus Write Back Block; (abort memory access) CPU Write Place Write Miss on Bus Cache Block State Write Back Block; (abort memory access) Read miss for this block Exclusive (read/write) CPU Write Miss Write back cache block Place write miss on bus CPU read hit CPU write hit

  4. P0 P1 Pn C C C IO IO IO M M M Distributed Directory MPs C - Cache M - Memory IO - Input/Output ... Interconnection Network

  5. Directory Protocol • Similar to Snoopy Protocol: Three states • Shared: ≥ 1 processors have data, memory up-to-date • Uncached (no processor has it; not valid in any cache) • Exclusive: 1 processor (owner) has data; memory out-of-date • In addition to cache state, must track which processors have data when in the shared state (usually bit vector, 1 if processor has copy) • Keep it simple(r): • Writes to non-exclusive data => write miss • Processor blocks until access completes • Assume messages received and acted upon in order sent

  6. Directory Protocol • No bus and don’t want to broadcast: • interconnect no longer single arbitration point • all messages have explicit responses • Terms: typically 3 processors involved • Local node where a request originates • Home node where the memory location of an address resides • Remote node has a copy of a cache block, whether exclusive or shared • Example messages on next slide: P = processor number, A = address

  7. Directory Protocol Messages Message type Source Destination Msg Content Read missLocal cacheHome directory P, A Processor P reads data at address A; make P a read sharer and arrange to send data back Write missLocal cacheHome directory P, A Processor P writes data at address A; make P the exclusive owner and arrange to send data back InvalidateHome directoryRemote caches A Invalidate a shared copy at address A. FetchHome directoryRemote cache A Fetch the block at address A and send it to its home directory Fetch/InvalidateHome directoryRemote cache A Fetch the block at address A and send it to its home directory; invalidate the block in the cache Data value reply Home directoryLocal cache Data Return a data value from the home memory (read miss response) Data write-backRemote cacheHome directory A, Data Write-back a data value for address A (invalidate response)

  8. CPU -Cache State Machine CPU Read hit Invalidate Shared (read/only) Invalid CPU Read Send Read Miss message CPU read miss: Send Read Miss CPU Write:Send Write Miss msg to h.d. CPU Write:Send Write Miss message to home directory Fetch/Invalidate send Data Write Back message to home directory Fetch:send Data Write Back message to home directory CPU read miss:send Data Write Back message and read miss to home directory Exclusive (read/writ) CPU read hit CPU write hit CPU write miss: send Data Write Back message and Write Miss to home directory

  9. Directory State Machine Read miss: Sharers += {P}; send Data Value Reply Read miss: Sharers = {P} send Data Value Reply Shared (read only) Uncached Write Miss: Sharers = {P}; send Data Value Reply msg Write Miss: send Invalidate to Sharers; then Sharers = {P}; send Data Value Reply msg Data Write Back: Sharers = {} (Write back block) Read miss: Sharers += {P}; send Fetch; send Data Value Reply msg to remote cache (Write back block) Write Miss: Sharers = {P}; send Fetch/Invalidate; send Data Value Reply msg to remote cache Exclusive (read/writ)

  10. /* * Title: Matrix multiplication kernel * Author: Aleksandar Milenkovic, milenkovic@computer.org * Date: November, 1997 * *------------------------------------------------------------ * Command Line Options * -pP: P = number of processors; must be a power of 2. * -nN: N = number of columns (even integers). * -h : Print out command line options. *------------------------------------------------------------ * */ void main(int argc, char*argv[]) { /* Define shared matrix */ ma = (double **) G_MALLOC(N*sizeof(double *)); mb = (double **) G_MALLOC(N*sizeof(double *)); for(i=0; i<N; i++) { ma[i] = (double *) G_MALLOC(N*sizeof(double)); mb[i] = (double *) G_MALLOC(N*sizeof(double)); }; /* Initialize the Index */ Index = 0; /* Initialize the barriers and the lock */ LOCKINIT(indexLock) BARINIT(bar_fin) /* read/initialize data */ ... /* do matrix multiplication in parallel a=a*b */ /* Create the slave processes. */ for (i = 0; i < numProcs-1; i++) CREATE(SlaveStart) /* Make the master do slave work so we don't waste a processor */ SlaveStart(); ... } Parallel Program: An Example

  11. /*====== SlaveStart ================*/ /* This is the routine that each processor will be executing in parallel */ void SlaveStart() { int myIndex, i, j, k, begin, end; double tmp; LOCK(indexLock); /* enter the critical section */ myIndex = Index; /* read your ID */ ++Index; /* increment it, so the next will operate on ID+1 */ UNLOCK(indexLock); /* leave the critical section */ /* Initialize begin and end */ begin = (N/numProcs)*myIndex; end = (N/numProcs)*(myIndex+1); /* the main body of a thread */ for(i=begin; i<end; i++) { for(j=0; j<N; j++) { tmp=0.0; for(k=0; k<N; k++) { tmp = tmp + ma[i][k]*mb[k][j]; } ma[i][j] = tmp; } } BARRIER(bar_fin, numProcs); } Parallel Program: An Example

  12. Synchronization • Why Synchronize? Need to know when it is safe for different processes to use shared data • Issues for Synchronization: • Uninterruptable instruction to fetch and update memory (atomic operation); • User level synchronization operation using this primitive; • For large scale MPs, synchronization can be a bottleneck; techniques to reduce contention and latency of synchronization

  13. Uninterruptable Instruction to Fetch and Update Memory • Atomic exchange: interchange a value in a register for a value in memory • 0 => synchronization variable is free • 1 => synchronization variable is locked and unavailable • Set register to 1 & swap • New value in register determines success in getting lock 0 if you succeeded in setting the lock (you were first) 1 if other processor had already claimed access • Key is that exchange operation is indivisible • Test-and-set: tests a value and sets it if the value passes the test • Fetch-and-increment: it returns the value of a memory location and atomically increments it • 0 => synchronization variable is free

  14. Lock&Unlock: Test&Set /* Test&Set */ ============== loadi R2, #1 lockit: exch R2, location /* atomic operation*/ bnez R2, lockit /* test*/ unlock: store location, #0 /* free the lock (write 0) */

  15. Lock&Unlock: Test and Test&Set /* Test and Test&Set */ ======================= lockit: load R2, location /* read lock varijable */ bnz R2, lockit /* check value */ loadi R2, #1 exch R2, location /* atomic operation */ bnz reg, lockit /* if lock is not acquired, repeat */ unlock: store location, #0 /* free the lock (write 0) */

  16. Lock&Unlock: Test and Test&Set /* Load-linked and Store-Conditional */ ======================================= lockit: ll R2, location /* load-linked read */ bnz R2, lockit /* if busy, try again */ load R2, #1 sc location, R2 /* conditional store */ beqz R2, lockit /* if sc unsuccessful, try again */ unlock: store location, #0 /* store 0 */

  17. Uninterruptable Instruction to Fetch and Update Memory • Hard to have read & write in 1 instruction: use 2 instead • Load linked (or load locked) + store conditional • Load linked returns the initial value • Store conditional returns 1 if it succeeds (no other store to same memory location since preceeding load) and 0 otherwise • Example doing atomic swap with LL & SC: try: mov R3,R4 ; mov exchange value ll R2,0(R1) ; load linked sc R3,0(R1) ; store conditional (returns 1, if Ok) beqz R3,try ; branch store fails (R3 = 0) mov R4,R2 ; put load value in R4 • Example doing fetch & increment with LL & SC: try: ll R2,0(R1) ; load linked addi R2,R2,#1 ; increment (OK if reg–reg) sc R2,0(R1) ; store conditional beqz R2,try ; branch store fails (R2 = 0)

  18. User Level Synchronization—Operation Using this Primitive • Spin locks: processor continuously tries to acquire, spinning around a loop trying to get the lock li R2,#1 lockit: exch R2,0(R1) ;atomic exchange bnez R2,lockit ;already locked? • What about MP with cache coherency? • Want to spin on cache copy to avoid full memory latency • Likely to get cache hits for such variables • Problem: exchange includes a write, which invalidates all other copies; this generates considerable bus traffic • Solution: start by simply repeatedly reading the variable; when it changes, then try exchange (“test and test&set”): try: li R2,#1 lockit: lw R3,0(R1) ;load var bnez R3,lockit ;not free=>spin exch R2,0(R1) ;atomic exchange bnez R2,try ;already locked?

  19. Barrier Implementation struct BarrierStruct { LOCKDEC(counterlock); LOCKDEC(sleeplock); int sleepers; }; ... #define BARDEC(B) struct BarrierStruct B; #define BARINIT(B) sys_barrier_init(&B); #define BARRIER(B,N) sys_barrier(&B, N);

  20. Barrier Implementation (cont’d) void sys_barrier(struct BarrierStruct *B, int N) { LOCK(B->counterlock) (B->sleepers)++; if (B->sleepers < N ) { UNLOCK(B->counterlock) LOCK(B->sleeplock) B->sleepers--; if(B->sleepers > 0) UNLOCK(B->sleeplock) else UNLOCK(B->counterlock) } else { B->sleepers--; if(B->sleepers > 0) UNLOCK(B->sleeplock) else UNLOCK(B->counterlock) } }

  21. Another MP Issue: Memory Consistency Models • What is consistency? When must a processor see the new value? e.g., seems that P1: A = 0; P2: B = 0; ..... ..... A = 1; B = 1; L1: if (B == 0) ... L2: if (A == 0) ... • Impossible for both if statements L1 & L2 to be true? • What if write invalidate is delayed & processor continues? • Memory consistency models: what are the rules for such cases? • Sequential consistency: result of any execution is the same as if the accesses of each processor were kept in order and the accesses among different processors were interleaved => assignments before ifs above • SC: delay all memory accesses until all invalidates done

  22. Memory Consistency Model • Schemes faster execution to sequential consistency • Not really an issue for most programs; they are synchronized • A program is synchronized if all access to shared data are ordered by synchronization operations write (x) ... release (s) {unlock} ... acquire (s) {lock} ... read(x) • Only those programs willing to be nondeterministic are not synchronized: “data race”: outcome f(proc. speed) • Several Relaxed Models for Memory Consistency since most programs are synchronized; characterized by their attitude towards: RAR, WAR, RAW, WAW to different addresses

  23. Summary • Caches contain all information on state of cached memory blocks • Snooping and Directory Protocols similar; bus makes snooping easier because of broadcast (snooping => uniform memory access) • Directory has extra data structure to keep track of state of all cache blocks • Distributing directory => scalable shared address multiprocessor => Cache coherent, Non uniform memory access

  24. Aleksandar Milenković Achieving High Performance in Bus-Based SMPs Partially funded by Encore, Florida, done at the School of Electrical Engineering, University of Belgrade (1997/1999) A. Milenkovic, "Achieving High Performance in Bus-Based Shared Memory Multiprocessors," IEEE Concurrency, Vol. 8, No. 3, July-September 2000, pp. 36-44.

  25. Outline • Introduction • Existing Solutions • Proposed Solution: Cache Injection • Experimental Methodology • Results • Conclusions

  26. Introduction • Bus-based SMPs: current situation and challenges P0 P1 Pn C - Cache M - Memory IO - Input/Output ... C C C M IO

  27. Introduction Introduction • Cache misses and bus traffic are key obstaclesto achieving high performance due to • widening speed gap between processor and memory • high contention on the bus • data sharing in parallel programs • Write miss latencies: relaxed memory consistency models • Latency of read misses remains • Techniques to reduce the number of read misses

  28. Existing solutions • Cache Prefetching • Read Snarfing • Software-controlled updating

  29. a:S a:M a:S a:I/- a:I/- a:I/- a:S a:I Exisitng solutions An Example P0 P1 P2 0. Početno stanje store a load a 1. P0: store a load a 2. P1: load a 3. P2: load a P1 P2 P0 M - Modified S - Shared I – Invalid - – Not present a:S

  30. a:S a:M a:S a:I/- a:I/- a:I/- a:S a:I Exisiting solutions Cache Prefetching P0 P1 P2 0. Initial state store a pf a pf a 1. P0: store a load a 2. P1: pf a load a 3. P2: pf a 4. P1: load a P2 P1 P0 5. P2: load a a:S pf - prefetch

  31. Exisiting solutions Cache Prefetching • Reduces all kind of misses (cold, coh., repl.) • Hardware support: prefetch instructions + buffering of prefetches • Compiler support [T. Mowry, 1994; T. Mowry and C. Luk, 1997] • Potential of cache prefetching in BB SMPs [D. Tullsen, S. Eggers, 1995]

  32. a:S a:M a:S a:I/- a:S a:I a:I a:S Exisitng solutions Read Snarfing P0 P1 P2 0. Initial state store a load a 1. P0: store a load a 2. P1: load a 3. P2: load a P1 P2 P0

  33. Exisiting solutions Read Snarfing • Reduces only coherence misses • Hardware support: negligible • Compiler support: none • Performance evaluation [C. Andersen and J.-L. Baer, 1995] • Drawbacks

  34. a:S a:M a:S a:I a:I a:S a:S a:I Exisiting solutions Software-controlled updating P0 P1 P2 store-up a load a load a 0. Initial state 1. P0: store-up a 2. P1: load a P2 P1 P0 3. P2: load a

  35. Exisiting solutions Software-controlled updating • Reduces only coherence misses • Hardware support • Compiler support: [J. Skeppstedt, P. Stenstrom, 1994] • Performance evaluation [F. Dahlgren, J. Skeppstedt, P. Stenstrom, 1995] • Drawbacks

  36. CACHE INJECTION • Motivation • Definition and programming model • Implementation • Primena na prave deljene podatke (PDP) • Primena na sinhro-primitive (SP) • Hardverska podrška • Softverska podrška

  37. Cache Injection Motivation • Overcome some of the other techniques’ shortcomings such as • minor effectiveness of cache prefetching in reducing coherence cache misses • minor effectiveness of read snarfing and software-controlled updating in SMPs with relatively small private caches • high contention on the bus in cache prefetching and software-controlled updating

  38. Cache Injection Definition • Consumers predicts their future needs for shared data by executing an openWin instruction • OpenWin Laddr, Haddr • Injection table • Hit in injection table cache injection

  39. Cache Injection Definition • Injection on first read • Applicable for read only shared data and 1-Producer-Multiple-Consumers sharing pattern • Each consumer initializes its local injection table • Injection on Update • Applicable for 1-Producer-1-Consumer and1-Producer-Multiple-Consumers sharing patterns ormigratory sharing pattern • Each consumer initializes its local injection table • After data production, the data producer initiates an update bus transaction by executing an update or store-update instruction

  40. Cache Injection Implementation • OpenWin(Laddr, Haddr) • OWL(Laddr) • OWH(Haddr) • CloseWin(Laddr) • Update(A) • StoreUpdate(A)

  41. a:S a:M a:I a:S a:S a:I a:S a:I Cache Injection Injection on first read P0 P1 P2 0. Initial state store a owl a owl a 1. P0: store a load a 2. P1: owl a load a 3. P2: owl a 4. P1: load a P1 P2 P0 5. P2: load a a a

  42. a:S a:M a:I a:S a:S a:I a:S a:I Cache Injection Injection on update P0 P1 P2 0. Initial state owl a owl a storeUp a 1. P2: owl a load a 2. P1: owl a load a 3. P0: storeUp a 4. P1: load a P1 P2 P0 5. P2: load a a a

  43. Cache Injection Injection for true shared data: PC shared double A[NumProcs][100]; OpenWin(A[0][0], A[NumProcs-1][99]); for(t=0; t<t_max; t++) { local double myVal =0.0 for(p=0; p<NumProcs; p++) { for(i=0; i<100; i++) myVal+=foo(A[p][i], MyProcNum]; } barrier(B, NumProcs); for(i=0; i<100; i++) A[MyProcNum][i]+=myVal; barrier(B, NumProcs); } CloseWin(A[0][0]);

  44. Cache Injection Injection for true shared data:PC

  45. Base Inject Cache Injection Injection forLockSP OpenWin(L); lock(L); critical-section(d); unlock(L); CloseWin(L); lock(L); critical-section(d); unlock(L);

  46. Cache Injection Injection forLockSP • Traffic • Test&exch Lock implementation • LL-SC Lock implementation N – Number of processors; RdC - Read; RdXC - ReadExclusive; InvC - Invalidate; WbC - WriteBack

  47. Cache Injection Injection for BarrierSP • Base barrier implementation • Injection barrier implementation struct BarrierStruct { LOCKDEC(counterlock); //semafor dolazaka LOCKDEC(sleeplock); //semafor odlazaka int sleepers;}; //broj blokiranih #define BARDEC(B) struct BarrierStruct B; #define BARINIT(B) sys_barrier_init(&B); #define BARRIER(B,N) sys_barrier(&B, N); BARDEC(B) BARINIT(B) OpenWin(B->counterlock, B->sleepers); .... BARRIER(B, N); ...; BARRIER(B, N); ...; CloseWin(B->counterlock);

  48. Cache Injection Hardware support • Injection table • Instructions: OWL, OWH, CWL (Update, StoreUpdate) • Injection cycle in cache controller

  49. Cache Injection Software support • Compiler and/or programmer are responsible for inserting instructions • Sinhro • True shared data

  50. Experimental Methodology • Limes (Linux Memory Simulator) – a tool for program-driven simulation of shared memory multiprocessors • Workload • Modeled Architecture • Experiments

More Related