Short modules for introducing parallel concepts David - - PowerPoint PPT Presentation

short modules for introducing parallel concepts
SMART_READER_LITE
LIVE PREVIEW

Short modules for introducing parallel concepts David - - PowerPoint PPT Presentation

Short modules for introducing parallel concepts David Bunde Knox College Work par<ally supported by NSF DUE-1044299. Any opinions, findings, and


slide-1
SLIDE 1

Short ¡modules ¡for ¡introducing ¡ parallel ¡concepts ¡

David ¡Bunde ¡ Knox ¡College ¡

Work ¡par<ally ¡supported ¡by ¡NSF ¡DUE-­‑1044299. ¡Any ¡opinions, ¡findings, ¡and ¡conclusions ¡or ¡recommenda<ons ¡expressed ¡in ¡ this ¡material ¡are ¡those ¡of ¡the ¡author ¡and ¡do ¡not ¡necessarily ¡reflect ¡the ¡views ¡of ¡the ¡Na<onal ¡Science ¡Founda<on. ¡

slide-2
SLIDE 2

Why ¡introduce ¡parallelism? ¡

  • It’s ¡here ¡
  • CC ¡2013 ¡says ¡you ¡should ¡
  • Students ¡want ¡to ¡see ¡it ¡
slide-3
SLIDE 3

Module-­‑based ¡approach ¡

  • It’s ¡hard ¡to ¡revise ¡curriculum ¡or ¡en<re ¡course, ¡

but ¡rela<vely ¡easy ¡to ¡carve ¡out ¡a ¡couple ¡of ¡ days ¡

  • Modules ¡are ¡self-­‑contained ¡2-­‑3 ¡day ¡units ¡that ¡

fit ¡within ¡exis<ng ¡courses ¡

  • Include ¡course ¡materials ¡and ¡background ¡

support ¡

slide-4
SLIDE 4

The ¡modules ¡

  • Mandelbrot ¡set ¡with ¡OpenMP ¡
  • Short ¡exercises ¡with ¡CUDA ¡
  • Chapel ¡in ¡Algorithms ¡

Materials ¡available: ¡

¡hXp://faculty.knox.edu/dbunde/teaching/CCSC-­‑MW13 ¡

slide-5
SLIDE 5

Note ¡on ¡“tutorial” ¡

slide-6
SLIDE 6

My ¡context ¡

  • Dept ¡has ¡3 ¡FTEs, ¡27 ¡majors ¡(soph-­‑senior) ¡
  • Trimester ¡calendar ¡

– Students ¡take ¡3 ¡classes ¡a ¡term, ¡we ¡teach ¡2 ¡ – Cover ¡~1 ¡semester ¡of ¡material ¡into ¡10 ¡weeks ¡ – 70-­‑minute ¡periods; ¡MWF ¡lecture, ¡Th ¡lab ¡

  • Classes ¡with ¡10-­‑20 ¡
  • Mac ¡labs, ¡Linux ¡servers ¡
slide-7
SLIDE 7

Module ¡1 ¡ Mandelbrot ¡set ¡with ¡OpenMP ¡

slide-8
SLIDE 8

Overview ¡

  • Built ¡around ¡program ¡that ¡

¡ ¡generates ¡Mandelbrot ¡set ¡ ¡ ¡as ¡.bmp ¡file ¡

  • OpenMP ¡

– threading ¡library ¡built ¡into ¡most ¡C ¡compilers ¡

  • Used ¡several ¡ways ¡as ¡part ¡of ¡discussion ¡of ¡

threads ¡and ¡concurrency ¡in ¡OS ¡course ¡

slide-9
SLIDE 9

Secng ¡all ¡the ¡pixels ¡

for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡ ¡for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡ ¡ ¡x ¡= ¡((double)i ¡/ ¡numCols ¡-­‑0.5) ¡* ¡2; ¡ ¡ ¡ ¡y ¡= ¡((double)j ¡/ ¡numRows ¡-­‑0.5) ¡* ¡2; ¡ ¡ ¡ ¡color ¡= ¡mandelbrot(x,y); ¡ ¡ ¡ ¡pixels[i][j].rgbtBlue ¡= ¡pixels[i][j].rgbtGreen ¡= ¡ ¡ ¡ ¡ ¡ ¡pixels[i][j].rgbtRed ¡= ¡color; ¡ ¡} ¡ } ¡

slide-10
SLIDE 10

OpenMP ¡

  • Old ¡standard ¡(1st ¡in ¡1997), ¡but ¡s<ll ¡widely ¡used ¡
  • Implemented ¡as ¡pragmas ¡in ¡C ¡and ¡Fortran ¡
  • Widely ¡supported ¡(gcc, ¡Visual ¡Studio, ¡Intel, ¡...) ¡

– requires ¡–fopenmp ¡flag ¡in ¡gcc ¡

slide-11
SLIDE 11

Parallel ¡for ¡loop ¡

#pragma ¡omp ¡parallel ¡for ¡ for(int ¡i=1; ¡i<=100; ¡i++) ¡... ¡

Prior code Iterations 1−25 Iterations 26−50 Iterations 51−75 Iterations 76−100 Subsequent code

slide-12
SLIDE 12

Applying ¡parallel ¡for ¡

#pragma ¡omp ¡parallel ¡for ¡

for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡ ¡for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡ ¡ ¡x ¡= ¡((double)i ¡/ ¡numCols ¡-­‑0.5) ¡* ¡2; ¡ ¡ ¡ ¡y ¡= ¡((double)j ¡/ ¡numRows ¡-­‑0.5) ¡* ¡2; ¡ ¡ ¡ ¡color ¡= ¡mandelbrot(x,y); ¡ ¡ ¡ ¡pixels[i][j].rgbtBlue ¡= ¡pixels[i][j].rgbtGreen ¡= ¡ ¡ ¡ ¡ ¡ ¡pixels[i][j].rgbtRed ¡= ¡color; ¡ ¡} ¡ } ¡

slide-13
SLIDE 13

Resul<ng ¡output ¡(closeup) ¡

slide-14
SLIDE 14

Priva<zing ¡local ¡variables ¡

#pragma ¡omp ¡parallel ¡for ¡private(x,y,color) ¡

for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡ ¡for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡ ¡ ¡x ¡= ¡((double)i ¡/ ¡numCols ¡-­‑0.5) ¡* ¡2; ¡ ¡ ¡ ¡y ¡= ¡((double)j ¡/ ¡numRows ¡-­‑0.5) ¡* ¡2; ¡ ¡ ¡ ¡color ¡= ¡mandelbrot(x,y); ¡ ¡ ¡ ¡pixels[i][j].rgbtBlue ¡= ¡pixels[i][j].rgbtGreen ¡= ¡ ¡ ¡ ¡ ¡ ¡pixels[i][j].rgbtRed ¡= ¡color; ¡ ¡} ¡ } ¡

slide-15
SLIDE 15

How ¡well ¡does ¡it ¡parallelize? ¡

Original ¡(serial) ¡running ¡<me: ¡2.39 ¡seconds ¡ Parallel ¡running ¡<me: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.43 ¡seconds ¡ ¡ ¡ ¡ ¡Speedup ¡= ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡= ¡1.67 ¡

(On ¡my ¡Macbook ¡Pro, ¡with ¡Intel ¡Core ¡i5 ¡processor) ¡

Serial ¡<me ¡ ¡ Parallel ¡<me ¡

slide-16
SLIDE 16

Parallelizing ¡inner ¡loop ¡

#pragma ¡omp ¡parallel ¡for ¡private(x,y,color) ¡ for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡ ¡for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡ ¡ ¡ ¡ ¡... ¡ for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡ ¡ ¡ ¡ ¡#pragma ¡omp ¡parallel ¡for ¡private(x,y,color) ¡ ¡for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡ ¡ ¡ ¡ ¡... ¡

slide-17
SLIDE 17

Parallelizing ¡inner ¡loop ¡

#pragma ¡omp ¡parallel ¡for ¡private(x,y,color) ¡ for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡ ¡for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡ ¡ ¡ ¡ ¡... ¡ for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡ ¡ ¡ ¡ ¡#pragma ¡omp ¡parallel ¡for ¡private(x,y,color) ¡ ¡for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡ ¡ ¡ ¡ ¡... ¡ Time: ¡1.43 ¡sec ¡ Time: ¡1.35 ¡sec ¡

slide-18
SLIDE 18

Inside ¡mandelbrot ¡func<on ¡

double ¡mandelbrot(double ¡x, ¡double ¡y) ¡{ ¡ ¡int ¡maxItera<on ¡= ¡1000; ¡ ¡int ¡itera<on ¡= ¡0; ¡ ¡double ¡re ¡= ¡0, ¡im ¡= ¡0; ¡ ¡while((re*re ¡+ ¡im*im ¡<= ¡4) ¡&& ¡(itera<on ¡< ¡maxItera<on)) ¡{ ¡ ¡ ¡ ¡double ¡temp ¡= ¡re*re ¡-­‑ ¡im*im ¡+ ¡x; ¡ ¡ ¡ ¡im ¡= ¡2*re*im ¡+ ¡y; ¡ ¡ ¡ ¡re ¡= ¡temp; ¡ ¡ ¡ ¡itera<on++; ¡ ¡} ¡ ¡if(itera<on ¡!= ¡maxItera<on) ¡return ¡255; ¡else ¡return ¡0; ¡ } ¡

slide-19
SLIDE 19

Inside ¡mandelbrot ¡func<on ¡

double ¡mandelbrot(double ¡x, ¡double ¡y) ¡{ ¡ ¡int ¡maxItera<on ¡= ¡1000; ¡ ¡int ¡itera<on ¡= ¡0; ¡ ¡double ¡re ¡= ¡0, ¡im ¡= ¡0; ¡ ¡while((re*re ¡+ ¡im*im ¡<= ¡4) ¡&& ¡(itera<on ¡< ¡maxItera<on)) ¡{ ¡ ¡ ¡ ¡double ¡temp ¡= ¡re*re ¡-­‑ ¡im*im ¡+ ¡x; ¡ ¡ ¡ ¡im ¡= ¡2*re*im ¡+ ¡y; ¡ ¡ ¡ ¡re ¡= ¡temp; ¡ ¡ ¡ ¡itera<on++; ¡ ¡} ¡ ¡if(itera<on ¡!= ¡maxItera<on) ¡return ¡255; ¡else ¡return ¡0; ¡ } ¡

Takes ¡longer ¡for ¡ ¡ points ¡in ¡the ¡set ¡

slide-20
SLIDE 20

Swapping ¡loop ¡order ¡

#pragma ¡omp ¡parallel ¡for ¡private(x,y,color) ¡ for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡

Time: ¡1.35 ¡sec ¡

slide-21
SLIDE 21

Dynamic ¡scheduling ¡

#pragma ¡omp ¡parallel ¡for ¡... ¡ ¡schedule(dynamic) ¡ for ¡(int ¡i ¡= ¡0; ¡i ¡< ¡numCols; ¡i++) ¡{ ¡ ¡for ¡(int ¡j ¡= ¡0; ¡j ¡< ¡numRows; ¡j++) ¡{ ¡ ¡ ¡ ¡ ¡ ¡... ¡

Time: ¡0.98 ¡sec ¡

slide-22
SLIDE 22

Summary ¡of ¡versions ¡

  • Serial ¡version ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡2.39 ¡sec ¡
  • Incorrect ¡parallel ¡version ¡(race) ¡
  • Parallel ¡outer ¡loop ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.43 ¡sec ¡
  • Parallel ¡inner ¡loop ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.35 ¡sec ¡
  • Swap ¡loop ¡order ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡1.26 ¡sec ¡
  • Dynamic ¡scheduling ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡0.98 ¡sec ¡
slide-23
SLIDE 23

Alterna<ve: ¡Pthread ¡library ¡

  • Can ¡do ¡(most ¡of) ¡lesson ¡using ¡POSIX-­‑standard ¡

threads ¡(pthreads) ¡

  • Not ¡easy ¡to ¡do ¡dynamic ¡scheduling ¡

} Same Thread Thread Child Subsequent code Prior code pthread_join(..., &retVal) pthread_create(..., func_ptr, arg) void* func(void* arg) { ...

slide-24
SLIDE 24

Classroom ¡hints ¡

  • Can’t ¡have ¡too ¡many ¡students ¡sharing ¡same ¡

machine ¡

  • Go ¡over ¡concepts ¡before ¡and/or ¡azer ¡showing ¡

code ¡

slide-25
SLIDE 25

How ¡I’ve ¡used ¡it ¡

  • Previous ¡lecture ¡introducing ¡threads ¡
  • Lab ¡using ¡pthreads ¡(Mandelbrot ¡or ¡other ¡

example) ¡

  • Lecture ¡on ¡lab ¡and ¡using ¡Mandelbrot ¡

(OpenMP) ¡to ¡illustrate ¡concepts ¡

– Definite ¡improvement ¡over ¡doing ¡same ¡material ¡ with ¡Pthreads ¡in ¡lecture ¡

slide-26
SLIDE 26

OpenMP ¡or ¡Pthreads ¡first? ¡

  • OpenMP ¡first ¡

– Give ¡high-­‑level ¡concepts ¡before ¡lots ¡of ¡syntax ¡ – Want ¡to ¡spend ¡most ¡of ¡<me ¡on ¡concepts ¡so ¡do ¡it ¡ first ¡

  • Pthreads ¡first ¡

– Demonstrate ¡execu<on ¡model ¡before ¡showing ¡ “magic” ¡ – Could ¡use ¡other ¡examples ¡for ¡simplicity ¡

slide-27
SLIDE 27

“TODO” ¡list ¡

  • Which ¡order ¡for ¡Pthreads ¡vs. ¡OpenMP? ¡

– Join ¡my ¡experiment! ¡

  • More ¡colorful ¡versions ¡of ¡Mandelbrot ¡
  • Interac<ve ¡image ¡genera<on ¡
  • Other ¡examples ¡

Please ¡share! ¡

slide-28
SLIDE 28

Module ¡2 ¡ Short ¡exercises ¡with ¡CUDA ¡

Part ¡of ¡Bunde, ¡Karavanic, ¡Mache, ¡ Mitchell, ¡“Adding ¡GPU ¡compu<ng ¡to ¡ Computer ¡Organiza<on ¡courses”, ¡ EduPar ¡2013 ¡ ¡

slide-29
SLIDE 29

What ¡is ¡CUDA? ¡

  • “Compute ¡Unified ¡Device ¡Architecture” ¡
  • NVIDIA’s ¡architecture ¡and ¡language ¡for ¡

general-­‑purpose ¡programming ¡on ¡graphics ¡ cards ¡

  • Really ¡a ¡library ¡and ¡extension ¡of ¡C ¡(and ¡other ¡

languages) ¡

slide-30
SLIDE 30

Why ¡CUDA? ¡

  • Easy ¡to ¡get ¡the ¡hardware ¡

– My ¡laptop ¡came ¡with ¡a ¡48-­‑core ¡card ¡ – Department ¡has ¡448-­‑core ¡card ¡(< ¡$600) ¡ – NVIDIA ¡willing ¡to ¡donate ¡equipment ¡

  • Exci<ng ¡for ¡students ¡

– They ¡have ¡cards ¡and ¡want ¡to ¡use ¡them ¡ – Easy ¡to ¡see ¡performance ¡benefits ¡

slide-31
SLIDE 31

Game ¡of ¡Life ¡(GoL) ¡

  • Simula<on ¡with ¡cells ¡upda<ng ¡in ¡lock ¡step ¡
  • Each ¡turn, ¡count ¡living ¡neighbors ¡
  • Cell ¡alive ¡next ¡turn ¡if ¡

– alive ¡this ¡<me ¡and ¡have ¡2 ¡living ¡neighbors, ¡or ¡ – have ¡3 ¡living ¡neighbors ¡

slide-32
SLIDE 32

Module ¡constraints ¡

  • Brief ¡<me: ¡Course ¡has ¡lots ¡of ¡other ¡goals ¡

– One ¡70-­‑minute ¡lab ¡and ¡parts ¡of ¡2 ¡lectures ¡

  • Rela<vely ¡inexperienced ¡students ¡

– Some ¡just ¡out ¡of ¡CS ¡2 ¡ – Many ¡didn’t ¡know ¡C ¡or ¡Unix ¡programming ¡

slide-33
SLIDE 33

Unit ¡goals ¡

  • Idea ¡of ¡parallelism ¡
  • Benefits ¡and ¡costs ¡of ¡system ¡heterogeneity ¡
  • Data ¡movement ¡and ¡NUMA ¡
  • Generally, ¡the ¡effect ¡of ¡architecture ¡on ¡

program ¡performance ¡

slide-34
SLIDE 34

Approach ¡taken ¡

  • Introductory ¡lecture ¡

– GPUs: ¡massively ¡parallel, ¡outside ¡CPU, ¡kernels, ¡SIMD ¡

  • Lab ¡illustra<ng ¡features ¡of ¡CUDA ¡architecture ¡

– Data ¡transfer ¡<me ¡ – Thread ¡divergence ¡ – Memory ¡types ¡(next ¡<me) ¡

  • “Lessons ¡learned” ¡lecture ¡

– Reiterate ¡architecture ¡ – Demonstrate ¡speedup ¡with ¡Game ¡of ¡Life ¡ – Talk ¡about ¡use ¡in ¡Top ¡500 ¡systems ¡

slide-35
SLIDE 35

CUDA ¡programming ¡model ¡

  • Device ¡has ¡many ¡cores, ¡organized ¡into ¡groups ¡
  • 32-­‑thread ¡warps ¡execute ¡the ¡same ¡instruc<on ¡

k e r n e l i n v

  • c

a t i

  • n

s

CPU "host" "device" GPU

c

  • d

e ( " k e r n e l " ) d a t a data

slide-36
SLIDE 36

Data ¡transfer ¡

... cudaMemcpy(res, res_dev, N*sizeof(int), cudaMemcpyDeviceToHost); //transfer array a to GPU cudaMemcpy(a_dev, a, N*sizeof(int), cudaMemcpyHostToDevice); ...

direction indicator

//allocate memory on the device: cudaMalloc((void**) &a_dev, N*sizeof(int)); //transfer array res back from GPU:

slide-37
SLIDE 37

Invoking ¡the ¡kernel ¡

  • Blocks ¡are ¡an ¡organiza<onal ¡unit ¡for ¡threads ¡
  • Performance ¡is ¡very ¡dependent ¡on ¡#blocks ¡

and ¡#threads ¡

  • One ¡rule: ¡#threads ¡should ¡be ¡mul<ple ¡of ¡32 ¡

kernel<<<blocks,threads>>>(res_dev, a_dev, b_dev); int threads = 512; //# threads per block int blocks = (N+threads−1)/threads; //# blocks (N/threads rounded up)

slide-38
SLIDE 38

Kernel ¡itself ¡

since #threads potentially > array size

__global__ void kernel(int* res, int* a, int* b) { //function that runs on GPU to do the addition //sets res[i] = a[i] + b[i]; each thread is responsible for one value of i int thread_id = threadIdx.x + blockIdx.x*blockDim.x; if(thread_id < N) { } } res[thread_id] = a[thread_id] + b[thread_id];

slide-39
SLIDE 39

Lab ¡ac<vity ¡1: ¡Data ¡transfer ¡<me ¡

  • Students ¡compare ¡running ¡<me ¡of ¡

– working ¡CUDA ¡program ¡to ¡add ¡pair ¡of ¡vectors ¡ – program ¡with ¡data ¡transfer, ¡but ¡no ¡arithme<c ¡ – program ¡that ¡does ¡arithme<c ¡and ¡only ¡1 ¡direc<on ¡

  • f ¡data ¡transfer ¡
  • Observe ¡that ¡data ¡transfer ¡is ¡bulk ¡of ¡the ¡<me ¡
slide-40
SLIDE 40

Lab ¡ac<vity ¡1: ¡Data ¡transfer ¡<me ¡

  • Students ¡compare ¡running ¡<me ¡of ¡

– working ¡CUDA ¡program ¡to ¡add ¡pair ¡of ¡vectors ¡ – program ¡with ¡data ¡transfer, ¡but ¡no ¡arithme<c ¡ – program ¡that ¡does ¡arithme<c ¡and ¡only ¡1 ¡direc<on ¡

  • f ¡data ¡transfer ¡
  • Observe ¡that ¡data ¡transfer ¡is ¡bulk ¡of ¡the ¡<me ¡
slide-41
SLIDE 41

Lab ¡ac<vity ¡2: ¡Thread ¡divergence ¡ ¡

  • Compare ¡two ¡apparently ¡equivalent ¡kernels: ¡
  • Observe ¡vastly ¡different ¡running ¡<mes ¡

– Threads ¡in ¡a ¡warp ¡devote ¡<me ¡to ¡1 ¡instruc<on ¡per ¡ clock ¡cycle ¡even ¡if ¡not ¡all ¡run ¡it ¡(others ¡nop) ¡

__global__ ¡void ¡kernel_1(int ¡*a) ¡{ ¡ ¡ ¡ ¡ ¡int ¡<d ¡= ¡threadIdx.x; ¡ ¡ ¡ ¡ ¡int ¡cell ¡= ¡<d ¡% ¡32; ¡ ¡ ¡ ¡ ¡a[cell]++; ¡ } ¡ __global__ ¡void ¡kernel_2(int ¡*a) ¡{ ¡ ¡ ¡ ¡ ¡int ¡cell ¡= ¡threadIdx.x ¡% ¡32; ¡ ¡ ¡ ¡ ¡switch(cell) ¡{ ¡ ¡ ¡ ¡ ¡case ¡0: ¡a[0]++; ¡break; ¡ ¡ ¡ ¡ ¡case ¡1: ¡a[1]++; ¡break; ¡ ¡ ¡ ¡ ¡... ¡ ¡ ¡//con<nues ¡to ¡case ¡7 ¡ ¡ ¡ ¡ ¡default: ¡a[cell]++; ¡ ¡ ¡} ¡ } ¡

slide-42
SLIDE 42

Lab ¡ac<vity ¡2: ¡Thread ¡divergence ¡ ¡

  • Compare ¡two ¡apparently ¡equivalent ¡kernels: ¡
  • Observe ¡vastly ¡different ¡running ¡<mes ¡

– Threads ¡in ¡a ¡warp ¡devote ¡<me ¡to ¡1 ¡instruc<on ¡per ¡ clock ¡cycle ¡even ¡if ¡not ¡all ¡run ¡it ¡(others ¡nop) ¡

__global__ ¡void ¡kernel_1(int ¡*a) ¡{ ¡ ¡ ¡ ¡ ¡int ¡<d ¡= ¡threadIdx.x; ¡ ¡ ¡ ¡ ¡int ¡cell ¡= ¡<d ¡% ¡32; ¡ ¡ ¡ ¡ ¡a[cell]++; ¡ } ¡ __global__ ¡void ¡kernel_2(int ¡*a) ¡{ ¡ ¡ ¡ ¡ ¡int ¡cell ¡= ¡threadIdx.x ¡% ¡32; ¡ ¡ ¡ ¡ ¡switch(cell) ¡{ ¡ ¡ ¡ ¡ ¡case ¡0: ¡a[0]++; ¡break; ¡ ¡ ¡ ¡ ¡case ¡1: ¡a[1]++; ¡break; ¡ ¡ ¡ ¡ ¡... ¡ ¡ ¡//con<nues ¡to ¡case ¡7 ¡ ¡ ¡ ¡ ¡default: ¡a[cell]++; ¡ ¡ ¡} ¡ } ¡

slide-43
SLIDE 43

Lab ¡ac<vity ¡3: ¡Memory ¡types ¡ ¡

  • “Ray ¡tracing” ¡that ¡tests ¡intersec<ons ¡with ¡

array ¡of ¡objects ¡in ¡the ¡same ¡order ¡

  • Speeds ¡up ¡with ¡switch ¡to ¡constant ¡memory ¡

– ¡values ¡are ¡transmiXed ¡to ¡en<re ¡half ¡warp ¡ – ¡allows ¡caching ¡

  • Performance ¡is ¡worse ¡if ¡threads ¡access ¡
  • bjects ¡in ¡different ¡orders ¡

Based ¡on ¡Chap ¡6 ¡of ¡[Sanders ¡and ¡Kandrot, ¡“CUDA ¡by ¡example”, ¡2011] ¡

slide-44
SLIDE 44

Lab ¡ac<vity ¡3: ¡Memory ¡types ¡ ¡

  • “Ray ¡tracing” ¡that ¡tests ¡intersec<ons ¡with ¡

array ¡of ¡objects ¡in ¡the ¡same ¡order ¡

  • Speeds ¡up ¡with ¡switch ¡to ¡constant ¡memory ¡

– ¡values ¡are ¡transmiXed ¡to ¡en<re ¡half ¡warp ¡ – ¡allows ¡caching ¡

  • Performance ¡is ¡worse ¡if ¡threads ¡access ¡
  • bjects ¡in ¡different ¡orders ¡

Based ¡on ¡Chap ¡6 ¡of ¡[Sanders ¡and ¡Kandrot, ¡“CUDA ¡by ¡example”, ¡2011] ¡

slide-45
SLIDE 45

Survey ¡results: ¡Good ¡news ¡

  • Asked ¡to ¡describe ¡CPU/GPU ¡interac<on: ¡

– 9 ¡of ¡11 ¡men<on ¡both ¡data ¡movement ¡and ¡ invoking ¡kernel ¡ – Another ¡just ¡men<ons ¡invoking ¡the ¡kernel ¡

  • Asked ¡to ¡explain ¡experiment ¡illustra<ng ¡data ¡

movement ¡cost: ¡

– 9 ¡of ¡12 ¡say ¡comparing ¡computa<on ¡and ¡ communica<on ¡cost ¡ – 2 ¡more ¡talk ¡about ¡comparing ¡different ¡opera<ons ¡

slide-46
SLIDE 46

Survey ¡results: ¡Good ¡news ¡

  • Asked ¡to ¡describe ¡CPU/GPU ¡interac<on: ¡

– 9 ¡of ¡11 ¡men<on ¡both ¡data ¡movement ¡and ¡ invoking ¡kernel ¡ – Another ¡just ¡men<ons ¡invoking ¡the ¡kernel ¡

  • Asked ¡to ¡explain ¡experiment ¡illustra<ng ¡data ¡

movement ¡cost: ¡

– 9 ¡of ¡12 ¡say ¡comparing ¡computa<on ¡and ¡ communica<on ¡cost ¡ – 2 ¡more ¡talk ¡about ¡comparing ¡different ¡opera<ons ¡

slide-47
SLIDE 47

Survey ¡results: ¡Not ¡so ¡good ¡news ¡

  • Asked ¡to ¡explain ¡experiment ¡illustra<ng ¡thread ¡

divergence: ¡

– 2 ¡of ¡9 ¡were ¡correct ¡ – 2 ¡more ¡seemed ¡to ¡understand, ¡but ¡misused ¡ terminology ¡ – 3 ¡more ¡remembered ¡performance ¡effect, ¡but ¡said ¡ nothing ¡about ¡the ¡cause ¡ ¡ ¡ ¡

slide-48
SLIDE 48

Conclusions ¡

  • Unit ¡was ¡mostly ¡successful, ¡but ¡thread ¡

divergence ¡is ¡a ¡harder ¡concept ¡

  • Students ¡interested ¡in ¡CUDA ¡and ¡about ¡half ¡

the ¡class ¡requested ¡more ¡of ¡it ¡

  • BoXom ¡line: ¡A ¡brief ¡introduc<on ¡is ¡possible ¡

even ¡to ¡students ¡with ¡limited ¡background ¡

slide-49
SLIDE 49

Classroom ¡hints ¡

  • Need ¡graphics ¡card ¡on ¡local ¡machine ¡(at ¡least ¡

for ¡GoL) ¡

  • For ¡my ¡unit, ¡show ¡GoL ¡before ¡doing ¡the ¡lab ¡
slide-50
SLIDE 50

Alternate ¡models ¡

  • Lewis ¡and ¡Clark, ¡Portland ¡State ¡

– Lecture ¡introducing ¡CUDA ¡ – Lab/HW ¡using ¡it ¡to ¡speed ¡up ¡Game ¡of ¡Life ¡

  • Daniel ¡Ernst ¡

– Longer ¡unit ¡with ¡both ¡OpenMP ¡and ¡CUDA ¡ – General ¡emphasis ¡on ¡tuning ¡data ¡layout ¡and ¡ access ¡paXern ¡

slide-51
SLIDE 51

“TODO” ¡list ¡

  • New ¡example ¡for ¡types ¡of ¡memory ¡
  • Explain ¡thread ¡divergence ¡beXer ¡
  • Middle ¡ground: ¡adding ¡programming ¡to ¡mine ¡
  • r ¡conceptual ¡material ¡to ¡L&C ¡version ¡
  • Por<ng ¡code ¡to ¡other ¡base ¡languages ¡(Java) ¡
  • Other ¡programming ¡example ¡(?) ¡

Please ¡share! ¡

slide-52
SLIDE 52

Module ¡3a ¡ Chapel ¡in ¡Algorithms ¡

(Based ¡on ¡experiences ¡of ¡Kyle ¡Burke ¡ and ¡our ¡joint ¡tutorial ¡at ¡SC ¡Ed ¡ Program, ¡2012) ¡

slide-53
SLIDE 53

What ¡is ¡Chapel? ¡

  • Parallel ¡programming ¡language ¡developed ¡

with ¡programmer ¡produc<vity ¡in ¡mind ¡

  • Originally ¡Cray’s ¡project ¡under ¡DARPA’s ¡High ¡

Produc<vity ¡Compu<ng ¡Systems ¡program ¡

  • Suitable ¡for ¡shared-­‑ ¡or ¡distributed ¡memory ¡

systems ¡

  • Installs ¡easily ¡on ¡Linux ¡and ¡Mac ¡OS; ¡use ¡

Cygwin ¡to ¡install ¡on ¡Windows ¡

slide-54
SLIDE 54

Why ¡Chapel? ¡

  • Flexible ¡syntax; ¡only ¡need ¡to ¡teach ¡features ¡

that ¡you ¡need ¡

  • Provides ¡high-­‑level ¡opera<ons ¡
  • Designed ¡with ¡parallelism ¡in ¡mind ¡
slide-55
SLIDE 55

Flexible ¡syntax ¡

  • Supports ¡scrip<ng-­‑like ¡programs: ¡

writeln(“Hello ¡World!”); ¡

  • Also ¡provides ¡objects ¡and ¡modules ¡
slide-56
SLIDE 56

Provides ¡high-­‑level ¡opera<ons ¡

  • Reduc<ons ¡and ¡scans ¡(more ¡later) ¡
  • Func<on ¡promo<on: ¡

¡B ¡= ¡f(A); ¡ ¡//applies ¡f ¡elementwise ¡for ¡any ¡func<on ¡f ¡

  • Includes ¡built-­‑in ¡operators: ¡

¡C ¡= ¡A ¡+ ¡1; ¡ ¡D ¡= ¡A ¡+ ¡B; ¡ ¡E ¡= ¡A ¡* ¡B; ¡ ¡... ¡

slide-57
SLIDE 57

Designed ¡with ¡parallelism ¡in ¡mind ¡

  • Opera<ons ¡on ¡previous ¡slides ¡parallelized ¡

automa<cally ¡

  • Create ¡asynchronous ¡task ¡w/ ¡single ¡keyword ¡
  • Built-­‑in ¡synchroniza<on ¡for ¡tasks ¡and ¡variables ¡
slide-58
SLIDE 58

“Hello ¡World” ¡in ¡Chapel ¡

  • Create ¡file ¡hello.chpl ¡containing ¡

¡writeln(“Hello ¡World!”); ¡

  • Compile ¡with ¡

¡chpl ¡–o ¡hello ¡hello.chpl ¡

  • Run ¡with ¡

¡./hello ¡

slide-59
SLIDE 59

Variables ¡and ¡Constants ¡

  • Variable ¡declara<on ¡format: ¡

[config] ¡var/const ¡iden<fier ¡: ¡type; ¡

var ¡x ¡: ¡int; ¡ const ¡pi ¡: ¡real ¡= ¡3.14; ¡ ¡ config ¡const ¡numSides ¡: ¡int ¡= ¡4; ¡ ¡

slide-60
SLIDE 60

Serial ¡Control ¡Structures ¡

  • if ¡statements, ¡while ¡loops, ¡and ¡do-­‑while ¡loops ¡

are ¡all ¡preXy ¡standard ¡

  • Difference: ¡Statement ¡bodies ¡must ¡either ¡use ¡

braces ¡or ¡an ¡extra ¡keyword: ¡

¡if(x ¡== ¡5) ¡then ¡y ¡= ¡3; ¡else ¡y ¡= ¡1; ¡ ¡while(x ¡< ¡5) ¡do ¡x++; ¡ ¡

slide-61
SLIDE 61

Example: ¡Reading ¡un<l ¡eof ¡

var ¡x ¡: ¡int; ¡ while ¡stdin.read(x) ¡{ ¡ ¡ ¡writeln(“Read ¡value ¡“, ¡x); ¡ } ¡ ¡

slide-62
SLIDE 62

Procedures/Func<ons ¡

  • mit for generic function

proc addOne(in val : int, inout val2 : int) : int { } return val + 1; val2 = val + 1;

arg_type argument return type (omit if none

  • r if can be inferred)
slide-63
SLIDE 63

Arrays ¡

  • Indices ¡determined ¡by ¡a ¡range: ¡

¡var ¡A ¡: ¡[1..5] ¡int; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡//declares ¡A ¡as ¡array ¡of ¡5 ¡ints ¡ ¡var ¡B ¡: ¡[-­‑3..3] ¡int; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡//has ¡indices ¡-­‑3 ¡thru ¡3 ¡ ¡var ¡C ¡: ¡[1..10, ¡1..10] ¡int; ¡ ¡//mul<-­‑dimensional ¡array ¡

  • Accessing ¡individual ¡cells: ¡

¡A[1] ¡= ¡A[2] ¡+ ¡23; ¡

  • Arrays ¡have ¡run<me ¡bounds ¡checking ¡
slide-64
SLIDE 64

For ¡Loops ¡

  • Ranges ¡also ¡used ¡in ¡for ¡loops: ¡

¡for ¡i ¡in ¡1..10 ¡do ¡statement; ¡ ¡for ¡i ¡in ¡1..10 ¡{ ¡ ¡ ¡loop ¡body ¡ ¡} ¡

  • Can ¡also ¡use ¡array ¡or ¡anything ¡iterable ¡
slide-65
SLIDE 65

Parallel ¡Loops ¡

  • Two ¡kinds ¡of ¡parallel ¡loops: ¡

¡forall ¡i ¡in ¡1..10 ¡do ¡statement; ¡ ¡//omit ¡do ¡w/ ¡braces ¡ ¡coforall ¡i ¡in ¡1..10 ¡do ¡statement; ¡

  • forall ¡creates ¡1 ¡task ¡per ¡processing ¡unit ¡
  • coforall ¡creates ¡1 ¡per ¡loop ¡itera<on ¡
  • Used ¡when ¡each ¡itera<on ¡requires ¡lots ¡of ¡work ¡and/or ¡

they ¡must ¡be ¡done ¡in ¡parallel ¡

slide-66
SLIDE 66

Asynchronous ¡Tasks ¡

  • Easy ¡asynchronous ¡task ¡crea<on: ¡

¡begin ¡statement; ¡ ¡

  • Easy ¡fork-­‑join ¡parallelism: ¡

¡cobegin ¡{ ¡ ¡ ¡statement1; ¡ ¡ ¡statement2; ¡ ¡ ¡... ¡ ¡} ¡ ¡//creates ¡task ¡per ¡statement ¡and ¡waits ¡here ¡ ¡

slide-67
SLIDE 67

Sync ¡blocks ¡

  • sync ¡blocks ¡wait ¡for ¡tasks ¡created ¡inside ¡it ¡
  • These ¡are ¡equivalent: ¡

¡ ¡sync ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡cobegin ¡{ ¡

¡begin ¡statement1; ¡ ¡ ¡ ¡ ¡ ¡ ¡statement1; ¡ ¡begin ¡statement2; ¡ ¡ ¡ ¡ ¡ ¡ ¡statement2; ¡ ¡... ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡... ¡ } ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡

slide-68
SLIDE 68

Sync ¡variables ¡

  • sync ¡variables ¡have ¡value ¡and ¡empty/full ¡state ¡

– store ¡≤ ¡1 ¡value ¡and ¡block ¡opera<ons ¡can’t ¡proceed ¡

  • Can ¡be ¡used ¡as ¡lock: ¡

¡var ¡lock ¡: ¡sync ¡int; ¡ ¡lock ¡= ¡1; ¡ ¡ ¡ ¡//acquires ¡lock ¡ ¡... ¡ ¡var ¡temp ¡= ¡lock; ¡ ¡//releases ¡the ¡lock ¡

slide-69
SLIDE 69

Analysis ¡of ¡Algorithms ¡

  • Chapel ¡material ¡

– Assign ¡basic ¡tutorial ¡ – Teach ¡forall ¡& ¡cobegin ¡(also ¡algorithmic ¡nota<on) ¡

  • Projects ¡

– Par<<on ¡integers ¡ – BubbleSort ¡ – MergeSort ¡ – Nearest ¡Neighbors ¡

slide-70
SLIDE 70

Algorithms ¡Project: ¡List ¡Par<<on ¡

  • Par<<on ¡a ¡list ¡to ¡two ¡equal-­‑summing ¡halves. ¡
  • Brute-­‑force ¡algorithm ¡(don't ¡know ¡P ¡vs ¡NP ¡yet) ¡
  • Ques<ons: ¡

– What ¡are ¡longest ¡lists ¡you ¡can ¡test? ¡ – What ¡about ¡in ¡parallel? ¡

  • Trick: ¡enumerate ¡possibili<es ¡and ¡use ¡forall ¡
slide-71
SLIDE 71

Algorithms ¡Project: ¡BubbleSort ¡

 Instead ¡of ¡lez-­‑to-­‑right, ¡test ¡all ¡pairs ¡in ¡two ¡steps! ¡  ¡Two ¡nested ¡forall ¡loops ¡(in ¡sequence) ¡inside ¡a ¡for ¡loop ¡

slide-72
SLIDE 72

Algorithms ¡Project: ¡MergeSort ¡

  • Parallel ¡divide-­‑and-­‑conquer: ¡use ¡cobegin ¡
  • Elegant ¡division: ¡split ¡the ¡Domain ¡
  • Speedup ¡not ¡as ¡no<ceable ¡
  • Example ¡of ¡expensive ¡parallel ¡overhead ¡
slide-73
SLIDE 73

Algorithms ¡Project: ¡Nearest ¡Neighbors

  • Find ¡closest ¡pair ¡of ¡(2-­‑D) ¡points. ¡
  • Two ¡algorithms: ¡

– Brute ¡Force ¡

  • (use ¡a ¡forall ¡like ¡bubbleSort) ¡

– Divide-­‑and-­‑Conquer ¡

  • (use ¡cobegin) ¡
  • A ¡bit ¡tricky ¡
  • Value ¡of ¡parallelism: ¡much ¡easier ¡to ¡program ¡

the ¡brute-­‑force ¡method ¡

slide-74
SLIDE 74

Algorithms ¡Takeaway ¡

  • Learning ¡curve ¡of ¡Chapel ¡is ¡so ¡low, ¡students ¡

can ¡start ¡using ¡parallelism ¡very ¡quickly ¡

slide-75
SLIDE 75

Module ¡3b ¡ Reduc<ons ¡

(Reduc<on ¡framework ¡from ¡Lin ¡and ¡ Snyder, ¡Principles ¡of ¡parallel ¡ programming, ¡2009.) ¡

slide-76
SLIDE 76

Summing ¡values ¡in ¡an ¡array ¡

2 2 1 4 3 2 1 3 16 10 6 3 7 4

slide-77
SLIDE 77

Summing ¡values ¡in ¡an ¡array ¡

6 2 1 4 3 2 1 3 3 7 4 2 16 10

slide-78
SLIDE 78

Summing ¡values ¡in ¡an ¡array ¡

16 2 1 4 3 2 1 3 3 7 4 2 6 10

slide-79
SLIDE 79

Summing ¡values ¡in ¡an ¡array ¡

16 2 1 4 3 2 1 3 3 7 4 2 6 10

slide-80
SLIDE 80

Summing ¡values ¡in ¡an ¡array ¡

3 7 4 2 16 6 10 2 1 4 3 2 1 3

slide-81
SLIDE 81

Finding ¡max ¡of ¡an ¡array ¡

3 2 1 4 3 2 1 3 2 2 4 4 4 3

slide-82
SLIDE 82

Finding ¡the ¡maximum ¡index ¡

4,2

2 1 4 3 2 1 3

1,1 4,2 3,3 1,4 0,6 3,5 3,5 2,7 2,7 2,0 2,0 4,2 4,2 3,5

slide-83
SLIDE 83

Finding ¡the ¡maximum ¡index ¡

2

2 1 4 3 2 1 3

1,1 4,2 3,3 1,4 0,6 3,5 3,5 2,7 2,7 2,0 2,0 4,2 4,2 3,5 4,2

slide-84
SLIDE 84

Parts ¡of ¡a ¡reduc<on ¡

  • Tally: ¡Intermediate ¡state ¡of ¡computa<on ¡
  • Combine: ¡Combine ¡2 ¡tallies ¡
  • Reduce-­‑gen: ¡Generate ¡result ¡from ¡tally ¡
  • Init: ¡Create ¡“empty” ¡tally ¡
  • Accumulate: ¡Add ¡1 ¡value ¡to ¡tally ¡
slide-85
SLIDE 85

Parts ¡of ¡a ¡reduc<on ¡

  • Tally: ¡Intermediate ¡state ¡of ¡computa<on ¡

¡ ¡ ¡ ¡ ¡ ¡ ¡(value, ¡index) ¡

  • Combine: ¡Combine ¡2 ¡tallies ¡

¡ ¡ ¡ ¡ ¡ ¡ ¡take ¡whichever ¡pair ¡has ¡larger ¡value ¡

  • Reduce-­‑gen: ¡Generate ¡result ¡from ¡tally ¡
  • ¡

¡ ¡ ¡ ¡ ¡return ¡the ¡index ¡

  • Init: ¡Create ¡“empty” ¡tally ¡
  • Accumulate: ¡Add ¡1 ¡value ¡to ¡tally ¡
slide-86
SLIDE 86

Two ¡issues ¡

  • Need ¡to ¡convert ¡ini<al ¡values ¡into ¡tallies ¡
  • May ¡want ¡separate ¡opera<on ¡for ¡values ¡local ¡

to ¡a ¡single ¡processor ¡

these values tally "Empty" Tally of

slide-87
SLIDE 87

Two ¡issues ¡

  • Need ¡to ¡convert ¡ini<al ¡values ¡into ¡tallies ¡
  • May ¡want ¡separate ¡opera<on ¡for ¡values ¡local ¡

to ¡a ¡single ¡processor ¡

tally "Empty" these values Tally of

slide-88
SLIDE 88

Parts ¡of ¡a ¡reduc<on ¡

  • Tally: ¡Intermediate ¡state ¡of ¡computa<on ¡
  • Combine: ¡Combine ¡2 ¡tallies ¡
  • Reduce-­‑gen: ¡Generate ¡result ¡from ¡tally ¡
  • Init: ¡Create ¡“empty” ¡tally ¡
  • Accumulate: ¡Add ¡1 ¡value ¡to ¡tally ¡
slide-89
SLIDE 89

Parallel ¡reduc<on ¡framework ¡

36 24 12 12 2 6 6 1 3 8 4 7 5 3 5 8 7 12 36 7 c c c a a a a a a a a rg i = Init: Create "empty" tally a = Accumulate: Add 1 value to tally c = Combine: Combine 2 tallies rg = Reduce−gen: Generate result from tally Tally: Intermediate state of computation i i i i

slide-90
SLIDE 90

Defining ¡reduc<ons ¡

  • Tally: ¡Intermediate ¡state ¡of ¡computa<on ¡
  • Combine: ¡Combine ¡2 ¡tallies ¡
  • Reduce-­‑gen: ¡Generate ¡result ¡from ¡tally ¡
  • Init: ¡Create ¡“empty” ¡tally ¡
  • Accumulate: ¡Add ¡1 ¡value ¡to ¡tally ¡

Sample ¡problems: ¡+ ¡

slide-91
SLIDE 91

Defining ¡reduc<ons ¡

  • Tally: ¡Intermediate ¡state ¡of ¡computa<on ¡
  • Combine: ¡Combine ¡2 ¡tallies ¡
  • Reduce-­‑gen: ¡Generate ¡result ¡from ¡tally ¡
  • Init: ¡Create ¡“empty” ¡tally ¡
  • Accumulate: ¡Add ¡1 ¡value ¡to ¡tally ¡

Sample ¡problems: ¡+, ¡histogram ¡

slide-92
SLIDE 92

Defining ¡reduc<ons ¡

  • Tally: ¡Intermediate ¡state ¡of ¡computa<on ¡
  • Combine: ¡Combine ¡2 ¡tallies ¡
  • Reduce-­‑gen: ¡Generate ¡result ¡from ¡tally ¡
  • Init: ¡Create ¡“empty” ¡tally ¡
  • Accumulate: ¡Add ¡1 ¡value ¡to ¡tally ¡

Sample ¡problems: ¡+, ¡histogram, ¡max ¡

slide-93
SLIDE 93

Defining ¡reduc<ons ¡

  • Tally: ¡Intermediate ¡state ¡of ¡computa<on ¡
  • Combine: ¡Combine ¡2 ¡tallies ¡
  • Reduce-­‑gen: ¡Generate ¡result ¡from ¡tally ¡
  • Init: ¡Create ¡“empty” ¡tally ¡
  • Accumulate: ¡Add ¡1 ¡value ¡to ¡tally ¡

Sample ¡problems: ¡+, ¡histogram, ¡max, ¡2nd ¡largest ¡ ¡

slide-94
SLIDE 94

Defining ¡reduc<ons ¡

  • Tally: ¡Intermediate ¡state ¡of ¡computa<on ¡
  • Combine: ¡Combine ¡2 ¡tallies ¡
  • Reduce-­‑gen: ¡Generate ¡result ¡from ¡tally ¡
  • Init: ¡Create ¡“empty” ¡tally ¡
  • Accumulate: ¡Add ¡1 ¡value ¡to ¡tally ¡

Sample ¡problems: ¡+, ¡histogram, ¡max, ¡2nd ¡largest, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡length ¡of ¡longest ¡run ¡ ¡

slide-95
SLIDE 95

Can ¡go ¡beyond ¡these... ¡

  • indexOf ¡(find ¡index ¡of ¡first ¡occurrence) ¡
  • sequence ¡alignment ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡[Srinivas ¡Aluru] ¡
  • n-­‑body ¡problem ¡ ¡ ¡ ¡

¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡[Srinivas ¡Aluru] ¡

slide-96
SLIDE 96

Rela<onship ¡to ¡dynamic ¡programming ¡

  • Challenges ¡in ¡dynamic ¡programming: ¡

– What ¡are ¡the ¡table ¡entries? ¡ – How ¡to ¡compute ¡a ¡table ¡entry ¡from ¡previous ¡entries? ¡

  • Challenges ¡in ¡reduc<on ¡framework: ¡

– What ¡is ¡the ¡tally? ¡ – How ¡to ¡compute ¡a ¡new ¡tallies ¡from ¡previous ¡ones? ¡

slide-97
SLIDE 97

Reduc<ons ¡in ¡Chapel ¡

  • Express ¡reduc<on ¡opera<on ¡in ¡single ¡line: ¡

¡var ¡s ¡= ¡+ ¡reduce ¡A; ¡//A ¡is ¡array, ¡s ¡gets ¡sum ¡

  • Supports ¡+, ¡*, ¡^ ¡(xor), ¡&&, ¡||, ¡max, ¡min, ¡... ¡
  • minloc ¡and ¡maxloc ¡return ¡a ¡tuple ¡with ¡value ¡

and ¡its ¡index: ¡

¡var ¡(val, ¡loc) ¡= ¡minloc ¡reduce ¡A; ¡

slide-98
SLIDE 98

Reduc<on ¡example ¡

  • Can ¡also ¡use ¡reduce ¡on ¡func<on ¡plus ¡a ¡range ¡
  • Ex: ¡Approximate ¡π/2 ¡using ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡: ¡

¡config ¡const ¡numRect ¡= ¡10000000; ¡

¡const ¡width ¡= ¡2.0 ¡/ ¡numRect; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡//rectangle ¡width ¡ ¡const ¡baseX ¡= ¡-­‑1 ¡-­‑ ¡width/2; ¡ ¡const ¡halfPI ¡= ¡+ ¡reduce ¡[i ¡in ¡1..numRect] ¡ ¡ ¡ ¡(width ¡* ¡sqrt(1.0 ¡– ¡(baseX ¡+ ¡i*width)**2)); ¡

1− x

2 −1 1

dx

slide-99
SLIDE 99

Defining ¡a ¡custom ¡reduc<on ¡

  • Create ¡object ¡to ¡represent ¡intermediate ¡state ¡
  • Must ¡support ¡

– accumulate: ¡adds ¡a ¡single ¡element ¡to ¡the ¡state ¡ – combine: ¡adds ¡another ¡intermediate ¡state ¡ – generate: ¡converts ¡state ¡object ¡into ¡final ¡output ¡

slide-100
SLIDE 100

Classes ¡in ¡Chapel ¡

class ¡Circle ¡{ ¡

var ¡radius ¡: ¡real; ¡ proc ¡area() ¡: ¡real ¡{ ¡

return ¡3.14 ¡* ¡radius ¡* ¡radius; ¡

} ¡

} ¡ var ¡c1, ¡c2 ¡: ¡Circle; ¡ ¡ ¡//creates ¡2 ¡Circle ¡references ¡ c1 ¡= ¡new ¡Circle(10); ¡ ¡/* ¡uses ¡system-­‑supplied ¡constructor ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡to ¡create ¡a ¡Circle ¡object ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡and ¡makes ¡c1 ¡refer ¡to ¡it ¡*/ ¡ c2 ¡= ¡c1; ¡ ¡ ¡ ¡ ¡//makes ¡c2 ¡refer ¡to ¡the ¡same ¡object ¡ delete ¡c1; ¡ ¡ ¡ ¡//memory ¡must ¡be ¡manually ¡freed ¡ ¡

slide-101
SLIDE 101

Inheritance ¡

class ¡Circle ¡: ¡Shape ¡{ ¡ ¡//Circle ¡inherits ¡from ¡Shape ¡ ¡ ¡... ¡ } ¡ var ¡s ¡: ¡Shape; ¡ s ¡= ¡new ¡Circle(10.0); ¡ ¡ ¡//automa<c ¡cast ¡to ¡base ¡class ¡ var ¡area ¡= ¡s.area(); ¡ ¡ ¡/* ¡call ¡recipient ¡determined ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡by ¡object’s ¡dynamic ¡type ¡*/ ¡

slide-102
SLIDE 102

Example ¡“custom” ¡reduc<on ¡

class ¡MyMin ¡: ¡ReduceScanOp ¡{ ¡//finds ¡min ¡element ¡(equiv. ¡to ¡built-­‑in ¡“min”) ¡ ¡type ¡eltType; ¡ ¡ ¡ ¡ ¡ ¡//type ¡of ¡elements ¡ ¡var ¡soFar ¡: ¡eltType ¡= ¡max(eltType); ¡//minimum ¡so ¡far ¡ ¡proc ¡accumulate(val ¡: ¡eltType) ¡{ ¡ ¡ ¡ ¡if(val ¡< ¡soFar) ¡{ ¡soFar ¡= ¡val; ¡} ¡ ¡} ¡ ¡proc ¡combine(other ¡: ¡MyMin) ¡{ ¡ ¡ ¡ ¡if(other.soFar ¡< ¡soFar) ¡{ ¡soFar ¡= ¡other.soFar; ¡} ¡ ¡} ¡ ¡proc ¡generate() ¡{ ¡return ¡soFar; ¡} ¡ } ¡ ¡

slide-103
SLIDE 103

And ¡that’s ¡not ¡all... ¡ ¡ ¡(scans) ¡

  • Instead ¡of ¡just ¡gecng ¡overall ¡value, ¡also ¡compute ¡

value ¡for ¡every ¡prefix ¡

  • Useful ¡answering ¡queries ¡like ¡ ¡

¡ ¡ ¡ ¡“What ¡is ¡the ¡sum ¡of ¡elements ¡2 ¡thru ¡7?” ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡= ¡sum[7] ¡– ¡sum[1] ¡

16 2 1 4 3 2 1 3 2 3 7 10 sum A 14 11 14

slide-104
SLIDE 104

And ¡that’s ¡not ¡all... ¡ ¡ ¡(scans) ¡

  • Instead ¡of ¡just ¡gecng ¡overall ¡value, ¡also ¡compute ¡

value ¡for ¡every ¡prefix ¡

  • Useful ¡answering ¡queries ¡like ¡ ¡

¡ ¡ ¡ ¡“What ¡is ¡the ¡sum ¡of ¡elements ¡2 ¡thru ¡7?” ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡= ¡sum[7] ¡– ¡sum[1] ¡

16 2 1 4 3 2 1 3 2 3 7 10 sum A 14 11 14

slide-105
SLIDE 105

Compu<ng ¡the ¡scan ¡in ¡parallel ¡

14

2 1 4 3 3 2 1

3 7 10 16 6 2 4 Upward pass to compute reduction . Downward pass to also compute scan 10 3 10

slide-106
SLIDE 106

Compu<ng ¡the ¡scan ¡in ¡parallel ¡

.

2 1 4 3 3 2 1

3 7 10 16 6 2 4 Upward pass to compute reduction 3 10 10 14 Downward pass to also compute scan

slide-107
SLIDE 107

Downward ¡pass ¡with ¡func<on ¡labels ¡

3 3 8 6 5 2 9 1 4 a a a a a a a a i = init a = accumulate input:

  • utput:

i 11 17 11 19 24 33 34 38 19 19 33 34 24 17 3

slide-108
SLIDE 108

Many ¡op<ons ¡for ¡module ¡3 ¡

  • Using ¡Chapel ¡for ¡ease ¡of ¡paralleliza<on ¡
  • Reduc<ons ¡on ¡paper ¡(defining ¡and/or ¡using) ¡
  • Also ¡implemen<ng ¡reduc<ons ¡in ¡Chapel ¡

Side ¡ques<on: ¡Where ¡to ¡put ¡it? ¡

slide-109
SLIDE 109

Caveats ¡

  • S<ll ¡in ¡development ¡

– Reduc<ons ¡serialized ¡on ¡mul<core ¡(as ¡of ¡1.6) ¡ – Error ¡messages ¡thin ¡ – New ¡versions ¡every ¡6 ¡months ¡– ¡some ¡big ¡changes ¡ – Not ¡many ¡libraries ¡

  • No ¡development ¡environment ¡

– Command-­‑line ¡compila<on ¡in ¡Linux ¡

slide-110
SLIDE 110

“TODO” ¡list ¡

  • Notes, ¡slides, ¡assignments, ¡etc ¡
  • Evidence ¡on ¡<e ¡to ¡dynamic ¡programming ¡
  • Sample ¡adop<on ¡strategies ¡
  • More ¡applica<ons ¡of ¡reduc<ons ¡and ¡scans ¡

Please ¡share! ¡

slide-111
SLIDE 111

Other ¡resources ¡

  • CS ¡in ¡Parallel ¡

hXp://csinparallel.org ¡

  • Dan ¡Grossman’s ¡CS ¡2 ¡notes ¡

hXp://homes.cs.washington.edu/~djg/teachingMaterials/spac/ ¡

  • NSF/IEEE-­‑TCPP ¡Curriculum ¡Ini<a<ve ¡

hXp://www.cs.gsu.edu/~tcpp/curriculum/ ¡

slide-112
SLIDE 112

Thanks ¡for ¡your ¡<me ¡

dbunde@knox.edu ¡

hXp://faculty.knox.edu/dbunde/teaching/CCSC-­‑MW13 ¡