s7142-multi-gpu programming models - nvidia · 2017. 5. 14. · need to compute larger, e.g. bigger...
TRANSCRIPT
![Page 1: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/1.jpg)
Jiri Kraus, Senior Devtech Compute
Sreeram Potluri, Senior CUDA Software Engineer
MULTI-GPU PROGRAMMING MODELS
![Page 2: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/2.jpg)
3
MOTIVATION
Need to compute larger, e.g. bigger networks, car models, …
Need to compute faster, e.g. weather prediction
Better energy efficiency with dense nodes with multiple GPUs
Why use multiple GPUs?
![Page 3: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/3.jpg)
4
DGX-1
Two fully connected quads, connected at corners
160GB/s per GPU bidirectional to Peers
Load/store access to Peer Memory
Full atomics to Peer GPUs
High speed copy engines for bulk data copy
PCIe to/from CPU
GPU1GPU0
GPU3GPU2
GPU4GPU5
GPU6GPU7
CPU 0
0 - 19
CPU 1
20-39
![Page 4: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/4.jpg)
5
EXAMPLE: JACOBI SOLVER
Solves the 2D-Laplace Equation on a rectangle
∆𝒖 𝒙, 𝒚 = 𝟎 ∀ 𝒙, 𝒚 ∈ Ω\𝜹Ω
Dirichlet boundary conditions (constant values on boundaries) on left and right boundary
Periodic boundary conditions on top and bottom boundary
![Page 5: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/5.jpg)
6
EXAMPLE: JACOBI SOLVER
While not converged
Do Jacobi step:
for( int iy = 1; iy < ny-1; iy++ )
for( int ix = 1; ix < ny-1; ix++ )
a_new[iy*nx+ix] = -0.25 *
-( a[ iy *nx+(ix+1)] + a[ iy *nx+ix-1]
+ a[(iy-1)*nx+ ix ] + a[(iy+1)*nx+ix ] );
Apply periodic boundary conditions
Swap a_new and a
Next iteration
Single GPU
![Page 6: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/6.jpg)
7
DOMAIN DECOMPOSITION
Minimize number of neighbors:
Communicate to less neighbors
Optimal for latency bound communication
Minimize surface area/volume ratio:
Communicate less data
Optimal for bandwidth bound communication
Different Ways to split the work between processes:
Contiguous if data is row-major
Contiguous if data is column-major
![Page 7: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/7.jpg)
8
While not converged
Do Jacobi step:
for (int iy = iy_start; iy < iy_end; iy++ )
for( int ix = 1; ix < ny-1; ix++ )
a_new[iy*nx+ix] = -0.25 *
-( a[ iy *nx+(ix+1)] + a[ iy *nx+ix-1]
+ a[(iy-1)*nx+ ix ] + a[(iy+1)*nx+ix ] );
Apply periodic boundary conditions
Exchange halo with 2 neighbors
Swap a_new and a
Next iteration
EXAMPLE: JACOBI SOLVERMulti GPU
One-step with
ring exchange
![Page 8: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/8.jpg)
9
SINGLE THREADED MULTI GPU PROGRAMMINGwhile ( l2_norm > tol && iter < iter_max ) {
for ( int dev_id = 0; dev_id < num_devices; ++dev_id ) {
const int top = dev_id > 0 ? dev_id - 1 : (num_devices-1); const int bottom = (dev_id+1)%num_devices;
cudaSetDevice( dev_id );
cudaMemsetAsync(l2_norm_d[dev_id], 0 , sizeof(real) );
jacobi_kernel<<<dim_grid,dim_block>>>( a_new[dev_id], a[dev_id], l2_norm_d[dev_id],
iy_start[dev_id], iy_end[dev_id], nx );
cudaMemcpyAsync( l2_norm_h[dev_id], l2_norm_d[dev_id], sizeof(real), cudaMemcpyDeviceToHost );
cudaMemcpyAsync( a_new[top]+(iy_end[top]*nx), a_new[dev_id]+iy_start[dev_id]*nx, nx*sizeof(real), ...);
cudaMemcpyAsync( a_new[bottom], a_new[dev_id]+(iy_end[dev_id]-1)*nx, nx*sizeof(real), ...);
}
l2_norm = 0.0;
for ( int dev_id = 0; dev_id < num_devices; ++dev_id ) {
cudaSetDevice( dev_id ); cudaDeviceSynchronize();
l2_norm += *(l2_norm_h[dev_id]);
}
l2_norm = std::sqrt( l2_norm );
for ( int dev_id = 0; dev_id < num_devices; ++dev_id ) std::swap(a_new[dev_id],a[dev_id]);
iter++;
}
![Page 9: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/9.jpg)
10
EXAMPLE JACOBITop/Bottom Halo
5/10/2
017
cudaMemcpyAsync(
a_new[top]+(iy_end[top]*nx),
a_new[dev_id]+iy_start[dev_id]*nx, nx*sizeof(real), ...);
![Page 10: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/10.jpg)
11
EXAMPLE JACOBITop/Bottom Halo
5/10/2
017
1cudaMemcpyAsync(
a_new[top]+(iy_end[top]*nx),
a_new[dev_id]+iy_start[dev_id]*nx, nx*sizeof(real), ...);
1
![Page 11: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/11.jpg)
12
EXAMPLE JACOBITop/Bottom Halo
5/10/2
017
1
12
2cudaMemcpyAsync(
a_new[top]+(iy_end[top]*nx),
a_new[dev_id]+iy_start[dev_id]*nx, nx*sizeof(real), ...);
cudaMemcpyAsync(
a_new[bottom],
a_new[dev_id]+(iy_end[dev_id]-1)*nx, nx*sizeof(real), ...);
cudaMemcpyAsync(
a_new[top]+(iy_end[top]*nx),
a_new[dev_id]+iy_start[dev_id]*nx, nx*sizeof(real), ...);
![Page 12: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/12.jpg)
13
SCALABILTY METRICS FOR SUCCESS
Serial Time: 𝑇𝑠: How long it takes to run the problem with a single process
Parallel Time: 𝑇𝑝: How long it takes to run the problem with multiple processes
Number of Processes: 𝑃: The number of Processes operating on the task at hand
Speedup: 𝑆 =𝑇𝑠
𝑇𝑝: How much faster is the parallel version vs. serial. (optimal is 𝑃)
Efficiency: 𝐸 =𝑆
𝑃: How efficient are the processors used (optimal is 1)
![Page 13: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/13.jpg)
14
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
0
0,5
1
1,5
2
2,5
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
Runti
me (
s)
#GPUs
Chart Title
Single Threaded Copy Parallel Efficiency
DGX1 - 1024 x 1024, 1000 iterations
![Page 14: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/14.jpg)
15
MULTI GPU JACOBI NVVP TIMELINESingle Threaded Copy 4 P100 on DGX-1
![Page 15: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/15.jpg)
16
MULTI GPU JACOBI NVVP TIMELINESingle Threaded Copy 4 P100 on DGX-1
![Page 16: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/16.jpg)
17
GPUDIRECT P2P
Maximizes intra node inter GPU Bandwidth
Avoids Host memory and system topology bottlenecks
GPU1GPU0
GPU3GPU2
GPU4GPU5
GPU6GPU7
MEM
MEM
MEM
MEM
MEM
MEM
MEM
MEMM
EM
MEM
MEM
MEM
MEM
MEM
MEM
MEM
![Page 17: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/17.jpg)
18
GPUDIRECT P2P
for ( int dev_id = 0; dev_id < num_devices; ++dev_id ) {
cudaSetDevice( dev_id );
const int top = dev_id > 0 ? dev_id - 1 : (num_devices-1);
int canAccessPeer = 0;
cudaDeviceCanAccessPeer ( &canAccessPeer, dev_id, top );
if ( canAccessPeer )
cudaDeviceEnablePeerAccess ( top, 0 );
const int bottom = (dev_id+1)%num_devices;
if ( top != bottom ) {
cudaDeviceCanAccessPeer ( &canAccessPeer, dev_id, bottom );
if ( canAccessPeer )
cudaDeviceEnablePeerAccess ( bottom, 0 );
}
}
Enable P2P
![Page 18: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/18.jpg)
19
MULTI GPU JACOBI NVVP TIMELINESingle Threaded Copy 4 P100 on DGX-1 with P2P
![Page 19: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/19.jpg)
20
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Single Threaded Copy Single Threaded Copy P2P
DGX1 - 1024 x 1024, 1000 iterations
![Page 20: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/20.jpg)
21
1D RING EXCHANGE
Halo updates for 1D domain decomposition with periodic boundary conditions
Unidirectional rings are important building block for collective algorithms
…
![Page 21: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/21.jpg)
22
MAPPING 1D RING EXCHANGE TO DGX-1
GPU1GPU0
GPU3GPU2
GPU4GPU5
GPU6GPU7
Dom.
0
Dom.
1
Dom.
2
Dom.
3
Dom.
4
Dom.
5
Dom.
6
Rank
7
![Page 22: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/22.jpg)
23
MAPPING 1D RING EXCHANGE TO DGX-1
GPU1GPU0
GPU3GPU2
GPU4GPU5
GPU6GPU7
Dom.
0
Dom.
1
Dom.
2
Dom.
3
Dom.
4
Dom.
5
Dom.
6
Rank
7
export CUDA_VISIBLE_DEVICES="0,1,2,3,7,6,5,4“
![Page 23: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/23.jpg)
24
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Single Threaded Copy Single Threaded Copy P2P (no opt) Single Threaded Copy P2P
DGX1 - 1024 x 1024, 1000 iterations
![Page 24: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/24.jpg)
25
MULTI GPU JACOBI NVVP TIMELINESingle Threaded Copy 4 P100 on DGX-1 with P2P
![Page 25: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/25.jpg)
26
MULTI THREADED MULTI GPU PROGRAMMING
int num_devices = 0;
cudaGetDeviceCount( &num_devices );
#pragma omp parallel num_threads( num_devices )
{
int dev_id = omp_get_thread_num();
cudaSetDevice( dev_id );
}
Using OpenMP
![Page 26: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/26.jpg)
27
MULTI GPU JACOBI NVVP TIMELINEMulti Threaded Copy 4 P100 on DGX-1 with P2P
![Page 27: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/27.jpg)
28
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Single Threaded Copy P2P Multi Threaded Copy (no thread pinning)
DGX1 - 1024 x 1024, 1000 iterations
![Page 28: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/28.jpg)
29
GPU/CPU AFFINITY
GPU1GPU0
GPU3GPU2
GPU4GPU5
GPU6GPU7
CPU 0
0 - 19
CPU 1
20-39
thread
0
thread
1
thread
2
thread
3
thread
4
thread
5
thread
6
thread
7
![Page 29: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/29.jpg)
30
GPU/CPU AFFINITY
$ nvidia-smi topo -m
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 mlx5_0 mlx5_2 mlx5_1 mlx5_3 CPU Affinity
GPU0 X NV1 NV1 NV1 NV1 SOC SOC SOC PIX SOC PHB SOC 0-19
GPU1 NV1 X NV1 NV1 SOC NV1 SOC SOC PIX SOC PHB SOC 0-19
GPU2 NV1 NV1 X NV1 SOC SOC NV1 SOC PHB SOC PIX SOC 0-19
GPU3 NV1 NV1 NV1 X SOC SOC SOC NV1 PHB SOC PIX SOC 0-19
GPU4 NV1 SOC SOC SOC X NV1 NV1 NV1 SOC PIX SOC PHB 20-39
GPU5 SOC NV1 SOC SOC NV1 X NV1 NV1 SOC PIX SOC PHB 20-39
GPU6 SOC SOC NV1 SOC NV1 NV1 X NV1 SOC PHB SOC PIX 20-39
GPU7 SOC SOC SOC NV1 NV1 NV1 NV1 X SOC PHB SOC PIX 20-39
mlx5_0 PIX PIX PHB PHB SOC SOC SOC SOC X SOC PHB SOC
mlx5_2 SOC SOC SOC SOC PIX PIX PHB PHB SOC X SOC PHB
mlx5_1 PHB PHB PIX PIX SOC SOC SOC SOC PHB SOC X SOC
mlx5_3 SOC SOC SOC SOC PHB PHB PIX PIX SOC PHB SOC X
Legend:
Querying system topology with nvidia-smi topo –m
CPU
0CPU
1
![Page 30: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/30.jpg)
31
GPU/CPU AFFINITY
export OMP_PROC_BIND=TRUE
export CUDA_VISIBLE_DEVICES="0,1,2,3,7,6,5,4“
export OMP_PLACES="{0},{1},{2},{3},{20},{21},{22},{23}"
Using CUDA_VISIBLE_DEVICES and OpenMP env. vars.
![Page 31: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/31.jpg)
33
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Single Threaded Copy P2P Multi Threaded Copy (no thread pinning) Multi Threaded Copy
DGX1 - 1024 x 1024, 1000 iterations
![Page 32: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/32.jpg)
34
MULTI GPU JACOBI NVVP TIMELINEMulti Threaded Copy 4 P100 on DGX-1 with P2P
![Page 33: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/33.jpg)
35
COMMUNICATION + COMPUTATION OVERLAP
Process Whole Domain COMM
No O
verl
ap
Process inner domain
COMMProcess boundary
domain Dependency
Boundary and inner
domain processing can
overlap
Overl
ap
Possible gain
![Page 34: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/34.jpg)
36
COMMUNICATION + COMPUTATION OVERLAP
//Compute bulk
cudaStreamWaitEvent(compute_stream,push_top_done[(iter%2)][dev_id],0);
cudaStreamWaitEvent(compute_stream,push_bottom_done[(iter%2)][dev_id],0);
jacobi_kernel<<<dim_grid,dim_block,0,compute_stream>>>(a_new[dev_id],a,l2_norm_d,(iy_start+1),(iy_end[dev_id]-1),nx);
//Compute boundaries
cudaStreamWaitEvent( push_top_stream, reset_l2norm_done, 0 );
cudaStreamWaitEvent( push_top_stream, push_bottom_done[(iter%2)][top], 0 );
jacobi_kernel<<<nx/128+1,128,0,push_top_stream>>>( a_new[dev_id],a,l2_norm_d,iy_start,(iy_start+1),nx);
cudaStreamWaitEvent(push_bottom_stream,reset_l2norm_done,0);
cudaStreamWaitEvent(push_bottom_stream,push_top_done[(iter%2)][bottom], 0 ) ;
jacobi_kernel<<<nx/128+1,128,0,push_bottom_stream>>>( a_new[dev_id],a,l2_norm_d,(iy_end[dev_id]-1),iy_end[dev_id],nx);
//Apply periodic boundary conditions and exchange halo
cudaMemcpyAsync(a_new[top]+(iy_end[top]*nx),a_new[dev_id]+iy_start*nx,nx*sizeof(real),cudaMemcpyDeviceToDevice,push_top_stream);
cudaEventRecord(push_top_done[((iter+1)%2)][dev_id],push_top_stream);
cudaMemcpyAsync(a_new[bottom],a_new[dev_id]+(iy_end[dev_id]-1)*nx,nx*sizeof(real),cudaMemcpyDeviceToDevice,push_bottom_stream);
cudaEventRecord(push_bottom_done[((iter+1)%2)][dev_id],push_bottom_stream);
![Page 35: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/35.jpg)
37
COMMUNICATION + COMPUTATION OVERLAP
int leastPriority = 0;
int greatestPriority = leastPriority;
cudaDeviceGetStreamPriorityRange ( &leastPriority, &greatestPriority );
cudaStreamCreateWithPriority ( &compute_stream, cudaStreamDefault, leastPriority );
cudaStreamCreateWithPriority ( &push_top_stream, cudaStreamDefault, greatestPriority );
cudaStreamCreateWithPriority ( &push_bottom_stream, cudaStreamDefault, greatestPriority );
High Priority Streams
![Page 36: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/36.jpg)
38
MULTI GPU JACOBI NVVP TIMELINEMulti Threaded Copy Overlap 4 P100 on DGX-1 with P2P
![Page 37: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/37.jpg)
39
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Single Threaded Copy P2P Multi Threaded Copy Multi Threaded Copy Overlap
DGX1 - 1024 x 1024, 1000 iterations
![Page 38: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/38.jpg)
40
MULTI GPU JACOBI NVVP TIMELINEMulti Threaded Copy Overlap 4 P100 on DGX-1 with P2P
![Page 39: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/39.jpg)
41
MULTI THREADED MULTI GPU PROGRAMMING
while ( l2_norm > tol && iter < iter_max ) {
cudaMemsetAsync(l2_norm_d, 0 , sizeof(real), compute_stream );
#pragma omp barrier
cudaStreamWaitEvent( compute_stream, compute_done[iter%2][top], 0 );
cudaStreamWaitEvent( compute_stream, compute_done[iter%2][bottom], 0 );
jacobi_kernel<<<dim_grid,dim_block,0,compute_stream>>>(
a_new[dev_id], a, l2_norm_d, iy_start, iy_end[dev_id], nx,
a_new[top], iy_end[top], a_new[bottom], 0 );
cudaEventRecord( compute_done[(iter+1)%2][dev_id], compute_stream );
cudaMemcpyAsync(l2_norm,l2_norm_d,sizeof(real),cudaMemcpyDeviceToHost,compute_stream);
// l2_norm reduction btw threads skipped ...
#pragma omp barrier
std::swap(a_new[dev_id],a); iter++;
}
Using OpenMP and P2P Mappings
![Page 40: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/40.jpg)
42
MULTI THREADED MULTI GPU PROGRAMMING
__global__ void jacobi_kernel( ... ) {
for (int iy = bIdx.y*bDim.y+tIdx.y + iy_start; iy < iy_end; iy += bDim.y* gDim.y) {
for (int ix = bIdx.x*bDim.x+tIdx.x + 1; ix < (nx-1); ix += bDim.x*gDim.x) {
const real new_val = 0.25 * ( a[ iy * nx + ix + 1 ] + a[ iy * nx + ix - 1 ]
+ a[ (iy+1) * nx + ix ] + a[ (iy-1) * nx + ix ] );
a_new[ iy * nx + ix ] = new_val;
if ( iy_start == iy ) { a_new_top [ top_iy *nx + ix ] = new_val; }
if ( (iy_end - 1) == iy ) { a_new_bottom[ bottom_iy*nx + ix ] = new_val; }
real residue = new_val - a[ iy * nx + ix ];
atomicAdd( l2_norm, residue*residue );
}}
}
Using OpenMP and P2P Mappings
![Page 41: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/41.jpg)
43
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Single Threaded Copy P2P Multi Threaded Copy Multi Threaded Copy Overlap Multi Threaded P2P
DGX1 - 1024 x 1024, 1000 iterations
![Page 42: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/42.jpg)
44
MULTI GPU JACOBI NVVP TIMELINEMulti Threaded P2P 4 P100 on DGX-1 with P2P
![Page 43: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/43.jpg)
45
MULTI THREADED MULTI GPU PROGRAMMING
cudaMemcpyAsync( l2_norm_h,l2_norm_d,sizeof(real),cudaMemcpyDeviceToHost,compute_stream );
#pragma omp barrier
#pragma omp single
{ l2_norm = 0.0; }
#pragma omp barrier
cudaStreamSynchronize( compute_stream );
#pragma omp critical
{ l2_norm += *(l2_norm_h); }
#pragma omp barrier
#pragma omp single
{ l2_norm = std::sqrt( l2_norm ); }
#pragma omp barrier
L2 norm reduction
Can be hidden if L2 norm
check is delayed.
![Page 44: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/44.jpg)
46
MULTI GPU JACOBI NVVP TIMELINEMulti Threaded P2P 4 P100 on DGX-1 with P2P
![Page 45: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/45.jpg)
47
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Single Threaded Copy P2P Multi Threaded Copy Multi Threaded Copy Overlap Multi Threaded P2P (norm opt)
DGX1 - 1024 x 1024, 1000 iterations
![Page 46: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/46.jpg)
48
MESSAGE PASSING INTERFACE - MPI
Standard to exchange data between processes via messages
Defines API to exchanges messages
Point to Point: e.g. MPI_Send, MPI_Recv
Collectives: e.g. MPI_Reduce
Multiple implementations (open source and commercial)
Bindings for C/C++, Fortran, Python, …
E.g. MPICH, OpenMPI, MVAPICH, IBM Platform MPI, Cray MPT, …
![Page 47: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/47.jpg)
49
MPI - SKELETON#include <mpi.h>
int main(int argc, char *argv[]) {
int rank,size;
/* Initialize the MPI library */
MPI_Init(&argc,&argv);
/* Determine the calling process rank and total number of ranks */
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
/* Call MPI routines like MPI_Send, MPI_Recv, ... */
...
/* Shutdown MPI library */
MPI_Finalize();
return 0;
}
![Page 48: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/48.jpg)
50
MPICompiling and Launching
$ mpicc -o myapp myapp.c
$ mpirun -np 4 ./myapp <args>
myapp myapp myapp myapp
rank = 0 rank = 1 rank = 2 rank = 3
![Page 49: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/49.jpg)
51
EXAMPLE JACOBITop/Bottom Halo
5/10/2
017
MPI_Sendrecv(a_new+iy_start*nx, nx, MPI_FLOAT, top , 0,
a_new+(iy_end*nx), nx, MPI_FLOAT, bottom, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
![Page 50: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/50.jpg)
52
EXAMPLE JACOBITop/Bottom Halo
5/10/2
017
1
1
MPI_Sendrecv(a_new+iy_start*nx, nx, MPI_FLOAT, top , 0,
a_new+(iy_end*nx), nx, MPI_FLOAT, bottom, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
![Page 51: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/51.jpg)
53
EXAMPLE JACOBITop/Bottom Halo
5/10/2
017
1
12
2MPI_Sendrecv(a_new+iy_start*nx, nx, MPI_FLOAT, top , 0,
a_new+(iy_end*nx), nx, MPI_FLOAT, bottom, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Sendrecv(a_new+(iy_end-1)*nx, nx, MPI_FLOAT, bottom, 0,
a_new, nx, MPI_FLOAT, top, 0, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
![Page 52: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/52.jpg)
54
HANDLING MULTIPLE MULTI GPU NODES
0 1 7… 8 9 15… 16 12 23… 24 25 31…
![Page 53: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/53.jpg)
55
HANDLING MULTIPLE MULTI GPU NODESHow to determine the local rank? – MPI-3
5/10/2017
MPI_Comm local_comm;
MPI_Info info;
MPI_Info_create(&info);
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, rank, info, &local_comm);
int local_rank = -1;
MPI_Comm_rank(local_comm,&local_rank);
MPI_Comm_free(&local_comm);
MPI_Info_free(&info);
![Page 54: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/54.jpg)
56
HANDLING MULTIPLE MULTI GPU NODES
Shared Comm Shared Comm Shared Comm Shared Comm
0 1 7…
0 1 7… 8 9 15… 16 12 23… 24 25 31…
0 1 7… 0 1 7… 0 1 7…
![Page 55: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/55.jpg)
57
HANDLING MULTIPLE MULTI GPU NODESGPU-affinity
Use local rank:
int local_rank = -1;
MPI_Comm_rank(local_comm,&local_rank);
int num_devices = 0;
cudaGetDeviceCount(&num_devices);
cudaSetDevice(local_rank % num_devices);
5/10/2017
![Page 56: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/56.jpg)
58
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Multi Threaded Copy Overlap MPI
DGX1 - 1024 x 1024, 1000 iterations
![Page 57: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/57.jpg)
59
MULTI GPU JACOBI NVVP TIMELINEMPI 4 P100 on DGX-1
![Page 58: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/58.jpg)
60
COMMUNICATION + COMPUTATION OVERLAP
launch_jacobi_kernel( a_new, a, l2_norm_d, iy_start, (iy_start+1), nx, push_top_stream );
launch_jacobi_kernel( a_new, a, l2_norm_d, (iy_end-1), iy_end, nx, push_bottom_stream );
launch_jacobi_kernel( a_new, a, l2_norm_d, (iy_start+1), (iy_end-1), nx, compute_stream );
const int top = rank > 0 ? rank - 1 : (size-1);
const int bottom = (rank+1)%size;
cudaStreamSynchronize( push_top_stream );
MPI_Sendrecv( a_new+iy_start*nx, nx, MPI_REAL_TYPE, top , 0,
a_new+(iy_end*nx), nx, MPI_REAL_TYPE, bottom, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE );
cudaStreamSynchronize( push_bottom_stream );
MPI_Sendrecv( a_new+(iy_end-1)*nx, nx, MPI_REAL_TYPE, bottom, 0,
a_new, nx, MPI_REAL_TYPE, top, 0, MPI_COMM_WORLD,
MPI_STATUS_IGNORE );
5/10/2017
![Page 59: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/59.jpg)
61
MULTI GPU JACOBI NVVP TIMELINEMPI Overlaping 4 P100 on DGX-1
![Page 60: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/60.jpg)
62
MULTI GPU JACOBI RUNTIME
0,00%
20,00%
40,00%
60,00%
80,00%
100,00%
120,00%
1 2 3 4 5 6 7 8
Para
llel Eff
icie
ncy
#GPUs
Chart Title
Multi Threaded Copy Overlap MPI MPI Overlap
DGX1 - 1024 x 1024, 1000 iterations
![Page 61: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/61.jpg)
63
NOT COVERED IN THIS TALK I
Enables MPI communication to follow CUDA stream ordering
Avoids unwanted CPU/GPU synchronization
S7128 - HOW TO ENABLE NVIDIA CUDA STREAM SYNCHRONOUS COMMUNICATIONS USING GPUDIRECT - Monday, May 8, 2:00 PM - 2:50 AM (recorded)
Thursday, May 11, 2:00 PM - 2:50 PM: S7356 - MVAPICH2-GDR: PUSHING THE FRONTIER OF HPC AND DEEP LEARNING - Room 211B
MPI with GPUDirect Async support (under development)
![Page 62: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/62.jpg)
64
NOT COVERED IN THIS TALK IINCCL: Accelerating multi-GPU collective communications
GOAL:
• A library for collective communication using CUDA kernels for reduction and data movement.
APPROACH:
• Allreduce, Reduce, Broadcast, ReduceScatter and Allgather primitives, similar to MPI primitives.
• CUDA oriented : works on CUDA pointers only, enqueues operations to CUDA streams.
• Supports any mapping between processes, threads and GPUs per thread to integrate into any hybrid model.
S7155 - OPTIMIZED INTER-GPU COLLECTIVE OPERATIONS WITH NCCL - Tuesday, May 9, 9:00 AM - 9:50 AM (recorded)
5/10/2017
![Page 63: S7142-Multi-GPU Programming Models - NVIDIA · 2017. 5. 14. · Need to compute larger, e.g. bigger networks, car models, ... Halo updates for 1D domain decomposition with periodic](https://reader034.vdocument.in/reader034/viewer/2022052018/603143292659f206f67a8c30/html5/thumbnails/63.jpg)
65
CONCLUSION
Wednesday, May 10, 2:00 PM - 3:00 PM: H7119 - CONNECT WITH THE EXPERTS: MULTI-GPU PROGRAMMING – LL Pod B
Thursday, May 11, 2:00 PM - 2:50 PM: S7356 - MVAPICH2-GDR: PUSHING THE FRONTIER OF HPC AND DEEP LEARNING - Room 211B
Programming Models GPUDirect P2P Multi Node
Single Threaded CUDA Improves Perf. No
Multi Threaded CUDA + OpenMP/TBB/… Improves Perf. No
Multi Threaded P2P CUDA + OpenMP/TBB/… Required No
MPI CUDA + MPI Improves Perf. Yes