gpu-computing - uni-hamburg.de · ddn storage mit 60 tb raw kapazität ausschließlich zur...
TRANSCRIPT
GPU-Computing im Rahmen der Vorlesung
Hochleistungsrechnen
Michael Vetter Universität Hamburg
Scientific Visualization and Parallel Processing
Übersicht
04.12.2012 Michael Vetter [email protected]
hamburg.de
2
Hintergrund und Entwicklung von GPGPU
Programmierumgebungen & Werkzeuge (CUDA)
Programmierbeispiel (Matrix-Matrix Multiplikation)
Einsatz von GPUs im Hochleistungsrechnen
Referenzen
Foliensatz basiert auf einer Vorlage von Prof. Dr. Ludwig,
viele Beispiele und Graphiken aus [4] entnommen
Was ist Rendering
Michael Vetter [email protected]
hamburg.de
Geometry
Processing Rasterization
Screen
Coordinates
(integer)
User-Specified
3-D Coordinates
(floating pt.)
(3.5, 0.4, 6.1) (4.1, 0.5, 2.7)
(3.7, 0.9, 8.3)
Pixels with
correct color
(240, 390) (298, 396)
(273, 407)
Quelle (mod.): A. Lastra (UNC) Transformation
und Beleuchtung
Flächenfüllung
und Texturierung
04.12.2012 3
Hintergrund
4
Bis 2000 bei Graphikkarten „fixed function pipeline“
Transform & Lighting Engine (Geforce256, 99/00)
Michael Vetter [email protected]
hamburg.de
04.12.2012
General Purpose Graphics Programming
5
Programmierung auf Basis der Graphik Pipeline
Datenarrays in Texturen
Filter als Fragment Shader
Stream Programming
Michael Vetter [email protected]
hamburg.de
04.12.2012
Weiterentwicklung
7
Nutzung der GPU als Parallelprozessor
Vorangetrieben durch Universitäten und Forschung
Weiterhin alles Graphik basiert (OpenGL)
Entwicklung von Hochsprachen:
Cg – C for Graphics
HLSL – High Level Shading Language
GLSL – OpenGL Shading Language
BrookGPU – Stream Programming
Michael Vetter [email protected]
hamburg.de
04.12.2012
GLSL Beispiel
Programmierbare Vertex-Shader und Pixel-Shader („fragment shader“) sind seit OpenGL 2.0 (2004) standardisiert: GLSL (OpenGL Shading Language)
Literatur:
R. J. Rost, B. Licea-Kange: OpenGL Shading Language, Addison-Wesley, 2010
SAXPY (Single-precision Alpha X Plus Y) in C … in GLSL (fragment shader)
float saxpy (
float2 coords : TEXCOORD0,
uniform sampler2D textureY,
uniform sampler2D textureX,
uniform float alpha ) : COLOR
{
float x = x_orig[i]; float x = tex2D(textureX,coords);
float y = y_orig[i]; float y = tex2D(textureY,coords);
y_new[i] = y + alpha * x; float result = y + alpha * x;
return result;
} Operationen erfordern Iteration: Operationen werden beim Zeichnen eines
for-Schleife (serielle Ausführung) texturierten Rechtecks parallel ausgeführt
Michael Vetter [email protected]
hamburg.de
04.12.2012 8
GPU Programmierung Heute
9
Unified Shading Architecture
Unified Hardware (Processors)
Verschiedene Entwicklungsumgebungen
Nvidia CUDA
AMD Stream
Brook GPU / Brook+
Rapid Mind Platform
PGI Accelerator Compiler Suite
Middleware und Support Bibliotheken
Mathematik Bibliotheken (lineare Algebra)
Michael Vetter [email protected]
hamburg.de
04.12.2012
CUDA Konzept
10
Compute Unified Device Architecture
Unified Hardware (Processors) and Software
Erste Grafikkarte verfügbar seit Ende 2006
Dedicated Many-Core Co-Prozessor
Programmier Model:
SIMD SIMT (Single-Instruction Multiple-Thread)
Keine Graphik API mehr
Highlevel Entwicklung in C/C++, Fortran, …
Single
instruction
Multiple
instruction
Single data SISD MISD
Multiple
data
SIMD MIMD
Michael Vetter [email protected]
hamburg.de
04.12.2012
CUDA Werkzeuge
11
CUDA Toolkit / SDK Treiber, SDK, Compiler, Beispiele
Profiler, Occupancy Calculator, Debugger
Unterstützt werden: C/C++, FORTRAN, OpenCL, DirectCompute
Bibliotheken CUBLAS (Basic Linear Algebra Subprograms)
CUFFT (Fourier Transformation, Basis: fftw)
CUDPP (Data Parallel Primitives), THRUST (STL)
Entwicklungsumgebungen Visual Studio + NEXUS (Parallel Nsight)
Michael Vetter
hamburg.de
04.12.2012
Streaming Multiprozessor
14
16 Streaming Multiprozessoren
32 CUDA Kerne
FP / INT Unit
16 Load / Store Units
64k shared memory / L1 Cache
4 Special Function Units (SFU)
(sin, cos, sqr, …)
Concurrent Thread Execution
IEEE 754-2008 (FMA)
ECC Speicher
Michael Vetter [email protected]
hamburg.de
04.12.2012
CUDA Programming Model Threads, Blocks and Grids
Thre
ad (
0,0
)
Thre
ad (
1,0
)
Th
rea
d (
2,0
)
Thre
ad (
1,0
)
Thre
ad (
1,1
)
Th
rea
d (
1,2
)
Block (0,0) Grid
Block (1,0) Block (1,1)
Block (0,1) Block (0,0)
Michael Vetter [email protected]
hamburg.de
04.12.2012 17
Allocate memory in device DRAM
Copy initial data to device
Process data by one or more kernel calls
Copy back results to host DRAM
Free allocated device DRAM
CUDA Programming Model Typical CUDA workflow
Device
Grid 1
Host
Grid 2
Kernel
1
Kernel
2
Tim
e
Michael Vetter [email protected]
hamburg.de
04.12.2012 18
Private local memory Per thread
Registers or in global memory
Shared memory Shared by all threads within a block
On-Chip
Global memory Accessible by all threads
Persistent across kernel calls
Special memory:
Constant memory (cached)
Texture memory (cached)
CUDA Programming Model Memory Model
Block
Grid
Michael Vetter [email protected]
hamburg.de
04.12.2012 20
Threads are organised into warps
Warp consists of 32 Threads (on current hardware)
Divergent threads only occur within warps
Switching between warps comes at no cost, because all threads have their own set of registers
Care needs to be taken when accessing shared or global memory by threads of a warp
CUDA Hardware Architecture Warps
...Tim
e
warp 6 instruction 23
warp 10 instruction 6
warp 1 instruction 13
warp 6 instruction 24
warp 1 instruction 14
SM multithreaded
instruction scheduler
Taken from NVIDIA
Michael Vetter [email protected]
hamburg.de
04.12.2012 21
Requires specific problem type:
Enough data parallelism
Enough data to work on
Enough computation per data element
Often data transfer between host and device DRAM is limiting factor
Keep data on GPU
Fine tuning is done on a very low programming level
Need to understand hardware
GPU hardware is simpler than CPU
Hard to maintain
Limitations of CUDA
Michael Vetter [email protected]
hamburg.de
04.12.2012 22
Beispiel: Matrix-Matrix Multiplikation
23
2 quadratische Matrizen
der Größe „Width“
Michael Vetter [email protected]
hamburg.de
04.12.2012
Optimierung
33
Optimierung ist enorm wichtig!
Maximierung der Auslastung (Occupancy):
Speicherdurchsatz (Bandbreite)
Anweisungsdurchsatz
Auslastung
Beispiel: Speicher Optimierung
Transfer zwischen Host – Device
Speichertypen (global, shared, constant)
Coalesced vs. non-coalesced Zugriff
Michael Vetter [email protected]
hamburg.de
04.12.2012
OpenCL
34
Compute Language für CPUs und GPUs
Offener Standard für heterogene Umgebungen
Khronos Group (Apple)
OpenCL 1.0 (8.12.2008)
OpenGL and OpenCL share Resources
OpenCL is designed to efficiently share with OpenGL
Textures, Buffer Objects and Renderbuffers
Data is shared, not copied
Michael Vetter [email protected]
hamburg.de
04.12.2012
OpenCL Beispiel
36
// OpenCL Objects
cl_device_id device;
cl_context context;
cl_command_queue queue;
cl_program program;
cl_kernel kernel;
cl_mem buffer;
// Setup OpenCL
clGetDeviceIDs(NULL, CL_DEVICE_TYPE_DEFAULT, 1, &device, NULL);
context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL);
queue = clCreateCommandQueue(context, device,
(cl_command_queue_properties)0, NULL);
// Setup Buffer
buffer = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR,
sizeof(cl_float)*10240, data, NULL);
Michael Vetter [email protected]
hamburg.de
04.12.2012
OpenCL Beispiel cont.
37
// Build the kernel
program = clCreateProgramWithSource(context, 1, (const
char**)&source, NULL, NULL);
clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
kernel = clCreateKernel(program, "calcSin", NULL);
// Execute the kernel
clSetKernelArg(kernel, 0, sizeof(buffer), &buffer);
size_t global_dimensions[] = {LENGTH,0,0};
clEnqueueNDRangeKernel(queue, kernel, 1, NULL,
global_dimensions, NULL, 0, NULL, NULL);
// Read back the results
clEnqueueReadBuffer(queue, buffer, CL_TRUE, 0,
sizeof(cl_float)*LENGTH, data, 0, NULL, NULL);
// Clean up
Michael Vetter [email protected]
hamburg.de
04.12.2012
Einsatz von GPUs im HPC
38
Top100 (11/2012)
50 Systeme mit Nvidia/Tesla
3 System mit ATI (22)
Einsatzgebiete:
Astronomie und Astrophysik
Biologie, Chemie
Finanzwirtschaft
Michael Vetter [email protected]
hamburg.de
04.12.2012
GPU Cluster in der Top100 (11/2012)
39
Tianhe-1a (Top500 Platz 8) R 2.566 R 4.701 (TFlops)
NUDT TH MPP, X5670 2.93Ghz 6C,
Nvidia GF104
Titan (Top500 Platz 1) R 17.590 R 27.112 (TFlops)
Cray XK7 , Opteron 6274 16C 2.200GHz,
Cray Gemini interconnect, NVIDIA K20x
max peak max peak
Michael Vetter [email protected]
hamburg.de
04.12.2012
GPU Cluster
40
MPI zur Kommunikation der Knoten untereinande
Sehr gute Auslastung und Effizienz/Strom Verhältnis
Schwierig: Umsetzung und Optimierung
Michael Vetter [email protected]
hamburg.de
04.12.2012
FORTRAN und CUDA
41
FORTRAN noch weit verbreitet (z.B. Klimaforschung)
CUBLAS, CUFFT (NVIDIA)
CUDA implementation of BLAS routines with Fortran API
F2C-ACC (NOAA Earth System Research Laboratory)
Generates C or CUDA output from Fortran95 input
HMPP Workbench (CAPS Enterprise)
Directive-based source-to-source compiler
PGI Compiler Suite
Directive-based
Compiler
Michael Vetter
hamburg.de
04.12.2012
Fortran CUDA Beispiel
42
PGI Accelerator Compiler OpenMP-like implicit programming model for X64+GPU-systems
!$acc region
do k = 1,n1
do i = 1,n3
c(i,k) = 0.0
do j = 1,n2
c(i,k) = c(i,k) + a(i,j) * b(j,k)
enddo
enddo
enddo
!$acc end region
Example http://www.pgroup.com
Michael Vetter [email protected]
hamburg.de
04.12.2012
Fortran CUDA Beispiel
43
PGI CUDA Fortran Compiler
! Kernel definition attributes(global) subroutine ksaxpy( n, a, x, y ) real, dimension(*) :: x,y real, value :: a integer, value :: n, i i = (blockidx%x-1) * blockdim%x + threadidx%x if( i <= n ) y(i) = a * x(i) + y(i) end subroutine ! Host subroutine subroutine solve( n, a, x, y ) real, device, dimension(*) :: x, y real :: a integer :: n ! call the kernel call ksaxpy<<<n/64, 64>>>( n, a, x, y ) end subroutine
Example http://www.pgroup.com
Michael Vetter [email protected]
hamburg.de
04.12.2012
GPU-Computing am RRZ/SVPP
Arbeitsgruppe:
Scientific Visualization and Parallel Processing der Informatik
GPU-Cluster:
96 CPU-Cores und 24 Nvidia Tesla M2070Q verteilt auf 8 Knoten
DDN Storage mit 60 TB RAW Kapazität
ausschließlich zur Entwicklung und Erprobung, kein produktiver Betrieb
Forschung:
Entwicklung von Verfahren zur Visualisierung wissenschaftlicher Daten
Lehre:
Vorlesung „Datenvisualisierung und GPU-Computing“ von Prof. Dr.-Ing.
Olbrich im Sommersemester
04.12.2012 44 Michael Vetter [email protected]
hamburg.de
Zusammenfassung
45
Stetig steigende Entwicklung seit 2000
Beschleunigt seit Einführung von CUDA (2007)
IEEE 754-2008 Unterstützung / ECC Speicher
Für FORTRAN Source2Source Compiler
Optimierung ist enorm wichtig
Alternativen zu CUDA:
OpenCL
Intel‘s Knights Family
OpenACC
C++ AMP
Michael Vetter [email protected]
hamburg.de
04.12.2012
Referenzen
46
[1] http://developer.nvidia.com/object/gpucomputing.html
[2] http://www.gpucomputing.net
[3] http://www.gpgpu.org/developer
[4] “Programming Massively Parallel Processors: A Hands-On Approach”, Kirk & Hwu
[5] “Cuda by Example: An Introduction to General-Purpose GPU Programming”, Sanders & Kandrot
[6] “GPU Computing Gems”, Hwu
Michael Vetter [email protected]
hamburg.de
04.12.2012