Iteration Spaces : Sequential f ( x , y ) ; f o r y i n...

37
HPCE / dt10 / 2013 / 13.1 Iteration Spaces : Sequential Iteration space over a 2D set of points Loop control-flow forces execution order for x in [0,4) for y in [0,2) f(x,y); (0,0) (0,1) (1,0) (1,1) (2,0) (2,1) (3,0) (3,1)

Transcript of Iteration Spaces : Sequential f ( x , y ) ; f o r y i n...

Page 1: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.1

Iteration Spaces : Sequential

• Iteration space over a 2D set of points

• Loop control-flow forces execution order

for x in [0,4)

for y in [0,2)

f(x,y);

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 2: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.2

Iteration Spaces : Nested Parallel

• Two parallel for loops – remove control-flow dependency

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

par_for x in [0,4)

par_for y in [0,2)

f(x,y);

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 3: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.3

Iteration Spaces : Nested Parallel

• Two parallel for loops – remove control-flow dependency

• Nesting order controls how TBB can split loops

– If y is inner loop, will tend to agglomerate vertically

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

par_for x in [0,4)

par_for y in [0,2)

f(x,y);

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 4: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.4

Iteration Spaces : Nested Parallel

• Two parallel for loops – remove control-flow dependency

• Nesting order controls how TBB can split loops

– If x is inner loop, will tend to agglomerate horizontally

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

par_for y in [0,2)

par_for x in [0,4)

f(x,y);

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 5: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.5

Iteration Spaces : Parallel 2D

• Single parallel for loop describing entire iteration space

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

par_for_2d (x,y) in [0,4)×[0,2)

f(x,y);

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 6: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.6

Iteration Spaces : Parallel 2D

• Single parallel for loop describing entire iteration space

• Scheduler is free to group tasks horizontally or vertically

– Consider both loops at once, rather than one loop then another

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

par_for_2d (x,y) in [0,4)×[0,2)

f(x,y);

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 7: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.7

Iteration Spaces : GPU Threads

• Each point in iteration space corresponds to a GPU thread

dim3 size(4,2);

f<<<1,size>>>();

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 8: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.8

Iteration Spaces : GPU Threads

• Each point in iteration space corresponds to a GPU thread

• No adaptive agglomeration needed for the GPU

– Warps and blocks already provide architectural agglomeration

dim3 size(4,2);

f<<<1,size>>>();

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 9: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.9

Iteration Spaces : GPU Threads

• Each point in iteration space corresponds to a GPU thread

• No adaptive agglomeration needed for the GPU

• Co-ordinates are built into hardware registers: not parameters

__global__ void f()

{

int x=threadIdx.x;

int y=threadIdx.y;

}

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 10: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.10

Iteration Spaces : GPU Hierarchy

• Multiple blocks of threads are organised into grids of blocks

dim3 blockSize(2,2);

dim3 gridSize(2,1);

f<<<gridSize,blockSize>>>();

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 11: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.11

Iteration Spaces : GPU Hierarchy

• Multiple blocks of threads are organised into grids of blocks

• Each block of threads executes in one processor on GPU

• There are many processors on a GPU: need multiple blocks

dim3 blockSize(2,2);

dim3 gridSize(2,1);

f<<<gridSize,blockSize>>>();

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 12: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.12

Iteration Spaces : GPU Hierarchy

• Multiple blocks of threads are organised into grids of blocks

• Use grid and block index to get global index of thread

(0,0)

(1,0)

(0,1)

(1,1)

(0,2)

(1,2)

(0,3)

(1,3)

__global__ void f()

{

int x=blockIdx.x*blockDim.x+threadIdx.x;

int y=blockIdx.y*blockDim.y+threadIdx.y;

}

(0,0)

(0,1)

(1,0)

(1,1)

(2,0)

(2,1)

(3,0)

(3,1)

Page 13: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.13

The Memory Hierarchy

• Three types of read-write storage available within the GPU

– Registers (private) : Only accessible to one thread

– Shared memory (local) : Accessible to all threads in a block

– Global memory : Accessible to any thread on the GPU

• Two types of read-only storage available

– Constant memory : Caches constants, e.g. Pi, lookup tables

– Texture memory : Supports interpolated table lookups

– Both are cached views of global memory

Page 14: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.14

Storage: Speed versus size

• Registers : very fast to access, fairly abundant on GPUs

– SIMD registers : dedicated path between registers and ALUs

• Shared memory : fast to access, not very large though

– Fast path between registers and shared memory

– Can move data between threads within the same block

• Global memory : big, shared by everyone

– Very high latency – hundreds of clock cycles

– Relatively high bandwidth if accesses are ordered carefully

– If many threads access global memory some will stall

• Use shared memory as a scratchpad memory

– Manually stage data from global into shared memory

– Same effect as a cache, but less transparent and more efficient

Page 15: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.15

Register Allocation

• GPU has register file with fixed number of lanes per register

AL

U-0

AL

U-1

AL

U-2

AL

U-3

Page 16: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.16

Register Allocation

• GPU has register file with fixed number of lanes per register

• At run-time sets of registers are dedicated to a warp

A[0] A[1] A[2] A[3] A[4] B[0] B[1] B[2] B[3] B[4] C[0] C[1] C[2] C[3] C[4] -

AL

U-0

AL

U-1

AL

U-2

AL

U-3

r1 = r3 + r4

Page 17: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.17

Register Allocation

• Instruction arguments are mapped to registers at run-time

A[0] A[1] A[2] A[3] A[4] B[0] B[1] B[2] B[3] B[4] C[0] C[1] C[2] C[3] C[4] -

AL

U-0

AL

U-1

AL

U-2

AL

U-3

r1 = r3 + r4

Page 18: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.18

Register Allocation

• Instruction arguments are mapped to registers at run-time

• If each thread uses fewer registers, larger blocks are possible

A[0] A[1] A[2] B[0] B[1] B[2] C[0] C[1] C[2] D[0] D[1] D[2] E[0] R[1] E[2] -

AL

U-0

AL

U-1

AL

U-2

AL

U-3

r0 = r1 + r2

Page 19: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.19

Register Allocation

• Block size does not have to be a multiple of warp size

• Can have a warp with one active thread – not very efficient

A[0] A[1] A[2] A[3] A[4] B[0] B[1] B[2] B[3] B[4] C[0] C[1] C[2] C[3] C[4] -

AL

U-0

AL

U-1

AL

U-2

AL

U-3

r1 = r3 + r4

Page 20: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.20

Shared memory banks

• ALUs are connected to one register lane

• Shared memory has one bank per lane via a crossbar

r0

r1

r2

r3

ALU-0

ALU-1

ALU-2

ALU-3

Local Bank 0

Local Bank 1

Local Bank 2

Local Bank 3

Cro

ssbar

__global__ void MyKernel()

{

i=i+1;

v=myMem[i];

}

Page 21: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.21

Shared memory banks

• ALUs are connected to one register lane

• Shared memory has one bank per lane via a crossbar

r0

r1

r2

r3

ALU-0

ALU-1

ALU-2

ALU-3

Local Bank 0

Local Bank 1

Local Bank 2

Local Bank 3

Cro

ssbar

__global__ void MyKernel()

{

i=i+1;

v=myMem[i];

}

Page 22: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.22

Shared memory banks

• ALUs are connected to one register lane

• Shared memory has multiple banks connected via crossbar

• Crossbar: fast communication between threads in same block

r0

r1

r2

r3

ALU-0

ALU-1

ALU-2

ALU-3

Local Bank 0

Local Bank 1

Local Bank 2

Local Bank 3

Cro

ssbar

__global__ void MyKernel()

{

i=i+1;

v=myMem[i];

}

Page 23: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.23

Putting it all together • Individual processor within GPU

• Schedules instructions which are applied to warps of threads

• Contains all warps executing within a given block

Registers

ALUs

Shared Mem

Co

ntr

ol

Page 24: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.24

Putting it all together • GPU chip contains multiple processors working in parallel

• All threads from a single block are in one processor

• Blocks from a single grid can executed on many processors

GPU Chip

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Page 25: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.25

Putting it all together • Threads within processor can communicate via shared memory

• Cannot read and write shared memory from other processors

GPU Chip

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Page 26: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.26

Putting it all together • Processors within GPU share a chip-wide global interconnect

• Used for things like managing blocks, instruction fetch, etc.

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Page 27: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.27

Putting it all together • Processors within GPU share a chip-wide global interconnect

• Used for things like managing blocks, instruction fetch, etc.

• Also connects GPU processors to off-chip global memory

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3

Page 28: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.28

Putting it all together • Global DRAM contains multiple parallel memory banks

• To maximise bandwidth all threads should access different banks

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3

Page 29: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.29

Putting it all together • Global DRAM contains multiple parallel memory banks

• To maximise bandwidth all threads should access different banks

• Allows all threads within GPU to communicate

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3

Page 30: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.30

Putting it all together • Global RAM has high bandwidth, but there are lots of processors

• If memory traffic is too high, then some processors must wait

• Need lots of warps ready to run: hide latency of global memory

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3

Page 31: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.31

Putting it all together • Global interconnect also connects GPU to the outside world

• Typically a high-bandwidth PCIe connection to a host PC

• GPU is quite simple: no OS, no networking, no disk

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3

Host PC

Page 32: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.32

Putting it all together • Host PC can read and write to global memory

• Send input: cudaMemcpy(dst,src,size,cudaMemcpyHostToDevice)

• Get input: cudaMemcpy(dst,src,size,cudaMemcpDeviceToHost)

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3

Host PC

RAM

cudaMemcpy

Page 33: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.33

Putting it all together • Host PC must launch grids of threads: the CPU can’t do it

• Launching a single block with 1 thread is very inefficient

– Will be much slower than a CPU

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3 __global__ MyKernel()

MyKernel<<<1,1>>>();

Registers

ALUs

Shared Mem

Co

ntr

ol

Page 34: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.34

Putting it all together • Each block should contains enough threads to occupy processor

• Threads should be a multiple of warp-size: use all SIMD lanes

• Need multiple warps available: hide ALU and memory latency

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3 __global__ MyKernel()

MyKernel<<<1,N>>>();

Registers

ALUs

Shared Mem

Co

ntr

ol

Page 35: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.35

Putting it all together • We want to try and use multiple processors at once

• Each block must executed on one processor: need many blocks

• Launch grids of blocks, which will be scheduled on all processors

GPU Chip

Global Interconnect

Registers

ALUs

Shared Mem

Co

ntr

ol

GPU DRAM

Bank 0 Bank 1 Bank 2 Bank 3 __global__ MyKernel()

MyKernel<<<2,N>>>();

Registers

ALUs

Shared Mem

Co

ntr

ol

Registers

ALUs

Shared Mem

Co

ntr

ol

Page 36: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.36

General Lessons : Iteration Spaces

• Computation is organised into a hierarchy of iteration spaces

– Thread : granularity of control-flow = one SIMD lane

– Warp/Wavefront : granularity of scheduling = one Program Counter

– Block (Workgroup) : collection of threads within one processor

– Grid (Global Workgroup) : collection of blocks with shared code

• Need to have an appropriate sizes for each level

– Thread : Startup cost vs amount of work done

• If your kernel doesn’t contain a loop, how much work can it do?

– Block : balance registers/thread against threads/block

• Want lots of warps ready to run; hide ALU and memory latency

– Grid : Want enough grids to utilise all processors

• Balance no. of threads vs startup cost of thread

Page 37: Iteration Spaces : Sequential f ( x , y ) ; f o r y i n ...cas.ee.ic.ac.uk/people/dt10/teaching/2012/hpce/hpce-lec13-gpu... · f < < < gr i dSi z e , bl oc k Si z e >

HPCE / dt10 / 2013 / 13.37

General Lessons : Communication

• Registers : Local to just one thread

– Each thread has a unique copy of variables in the kernel

• Shared Memory : Shared within just one block

– Can be used to communicate between threads

– Threads within warp should try to read/write non-conflicting banks

• Global Memory : Shared amongst all threads in a GPU

– Threads can communicate with any thread in any grid

– Allocated and freed by host using cudaMalloc / cudaFree

– State is maintained between grid executions

• Host Memory : Local to CPU – “normal” RAM

– GPU and CPU have different address spaces

– Use cudaMemcpy to move data between them