IMPROVING PROGRAMMABILITY AND PERFORMANCE PORTABILITY ON MANY-CORE PROCESSORS
|
|
- Bernhard Hofmeister
- vor 6 Jahren
- Abrufe
Transkript
1 IMPROVING PROGRAMMABILITY AND PERFORMANCE PORTABILITY ON MANY-CORE PROCESSORS michel steuwer aus Duisburg
2 Die Manycore Ära 10,000,000 1,000, ,000 10,000 1,000 Transistors (in 1000s) Clock Frequency (in Mhz) Power (in Watt) Number of Cores Intel CPUs von 1970 bis Inspiriert von Herb Sutter The Free Lunch is Over: A Fundamental Turn Towards Concurrency in Software
3 Die Manycore Ära multicore CPUs GPUs Beschleuniger FPGAs
4 Agenda Meine Dissertation adressiert zwei zentrale Herausforderungen: I. Die Herausforderung der Programmierbarkeit II. Die Herausforderung der Performance-Portabilität
5 TEIL I Die Herausforderung der Programmierbarkeit
6 Programmierung mit OpenCL Beispiel: Parallele Summation eines Arrays in OpenCL kernel void reduce(global float* g_idata, global float* g_odata, unsigned int n, local float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_global_id(0); l_data[tid] = (i < n)? g_idata[i] : 0; barrier(clk_local_mem_fence); // do reduction in local memory for (unsigned int s=1; s < get_local_size(0); s*= 2) { if ((tid % (2*s)) == 0) { l_data[tid] += l_data[tid + s]; barrier(clk_local_mem_fence); // write result for this work-group to global memory if (tid == 0) g_odata[get_group_id(0)] = l_data[0];
7 Programmierung mit OpenCL Beispiel: Parallele Summation eines Arrays in OpenCL Kernel Funktion wird parallel von vielen work-items ausgeführt kernel void reduce(global float* g_idata, global float* g_odata, unsigned int n, local float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_global_id(0); l_data[tid] = (i < n)? g_idata[i] : 0; barrier(clk_local_mem_fence); // do reduction in local memory for (unsigned int s=1; s < get_local_size(0); s*= 2) { if ((tid % (2*s)) == 0) { l_data[tid] += l_data[tid + s]; barrier(clk_local_mem_fence); // write result for this work-group to global memory if (tid == 0) g_odata[get_group_id(0)] = l_data[0]; Work-items werden durch eine globale id identifizier
8 Programmierung mit OpenCL Beispiel: Parallele Summation eines Arrays in OpenCL Work-items werden zu work-groups zusammengefasst Lokale id innerhalb einer work-group kernel void reduce(global float* g_idata, global float* g_odata, unsigned int n, local float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_global_id(0); l_data[tid] = (i < n)? g_idata[i] : 0; barrier(clk_local_mem_fence); // do reduction in local memory for (unsigned int s=1; s < get_local_size(0); s*= 2) { if ((tid % (2*s)) == 0) { l_data[tid] += l_data[tid + s]; barrier(clk_local_mem_fence); // write result for this work-group to global memory if (tid == 0) g_odata[get_group_id(0)] = l_data[0];
9 Programmierung mit OpenCL Beispiel: Parallele Summation eines Arrays in OpenCL Großer, aber langsamer globaler Speicher Kleiner, aber schneller lokaler Speicher kernel void reduce(global float* g_idata, global float* g_odata, unsigned int n, local float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_global_id(0); l_data[tid] = (i < n)? g_idata[i] : 0; barrier(clk_local_mem_fence); // do reduction in local memory for (unsigned int s=1; s < get_local_size(0); s*= 2) { if ((tid % (2*s)) == 0) { l_data[tid] += l_data[tid + s]; barrier(clk_local_mem_fence); // write result for this work-group to global memory if (tid == 0) g_odata[get_group_id(0)] = l_data[0]; Barrieren für Speicherkonsistenz
10 Programmierung mit OpenCL Beispiel: Parallele Summation eines Arrays in OpenCL kernel void reduce(global float* g_idata, global float* g_odata, unsigned int n, local float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_global_id(0); l_data[tid] = (i < n)? g_idata[i] : 0; barrier(clk_local_mem_fence); // do reduction in local memory for (unsigned int s=1; s < get_local_size(0); s*= 2) { if ((tid % (2*s)) == 0) { l_data[tid] += l_data[tid + s]; barrier(clk_local_mem_fence); // write result for this work-group to global memory if (tid == 0) g_odata[get_group_id(0)] = l_data[0]; Funktional korrekte Implementierungen in OpenCL sind schwierig!
11 DAS SKELCL PROGRAMMIERMODEL
12 Das SkelCL Programmiermodel Drei Abstraktionen zu OpenCL hinzugefügt: Parallele Datencontainer für eine einheitliche Speicherverwaltung zwischen CPU und (mehreren) GPUs implizite Speichertransfers zwischen CPU und GPU lazy copying minimiert den Datentransfer Wiederkehrende Muster paralleler Programmierung (Algorithmische Skelette) für eine vereinfachte Beschreibung paralleler Berechnungen zip ( ) [x1,, xn] [y1,, yn] = [x1 y1,, xn yn] reduce ( ) id [x1,, xn] = id x1 xn Daten Verteilungen für einen transparenten Datentransfer in Systemen mit mehreren GPUs. CPU CPU CPU 0 GPUs 1 0 GPUs 1 0 GPUs 1 single copy block
13 Die SkelCL Softwarebibliothek am Beispiel dotproduct A B = reduce (+) 0 (zip ( ) A B) #include <SkelCL/SkelCL.h> #include <SkelCL/Zip.h> #include <SkelCL/Reduce.h> #include <SkelCL/Vector.h> float dotproduct(const float* a, const float* b, int n) { using namespace skelcl; skelcl::init( 1_device.type(deviceType::ANY) ); auto mult = zip([](float x, float y) { return x*y; ); auto sum = reduce([](float x, float y) { return x+y;, 0); Vector<float> A(a, a+n); Vector<float> B(b, b+n); Vector<float> C = sum( mult(a, B) ); return C.front();
14 Neue Algorithmische Skelette Stencil Berechnungen Beispiel: Gaußscher Weichzeichner Allpairs Berechnungen Example: Matrix Multiplication 2 B T gauss M = stencil f 1 0M wo f die Funktion is welche den Gaußschen Weichzeichner beschreibt Unterstützung für mehre GPUs: CPU 1 3 A C (b) A B = allpairs dotproduct A B T Optimierung für zipreduce Muster: dotproduct a b = zipreduce (+) 0 ( ) a b 0 GPUs 1 overlap Verteilung Unterstützung für mehrere GPUs mit block und copy Verteilung
15 SkelCL Evaluation Geschwindigkeit mandelbrot linear algebra (dot product) matrix multiplication image processing (gaussian blur) medical imaging (LM OSEM) physics simulation (FDTD) 2.0 Relative Runtime OpenCL SkelCL OpenCL SkelCL OpenCL SkelCL OpenCL SkelCL OpenCL SkelCL OpenCL SkelCL SkelCL nahe an der Geschwindigkeit von OpenCL! (Ausnahme: dot product mehr dazu in Teil II)
16 SkelCL Evaluation Produktivität CPU code GPU code Relative Lines of Code mandelbrot linear algebra (dot product) matrix multiplication image processing (gaussian blur) medical imaging (LM OSEM) OpenCL SkelCL OpenCL SkelCL OpenCL SkelCL OpenCL SkelCL OpenCL SkelCL SkelCL Programme sind signifikant kürzer!
17 TEIL II Die Herausforderung der Performance-Portabilität
18 EIN NEUER ANSATZ ZUR PERFORMANCE PORTABLEN CODEGENERIERUNG
19 OpenCL und Performance-Portabilität Beispiel: Parallele Summation eines Arrays in OpenCL Vergleich von 7 OpenCL Implementierungen von Nvidia 200 Hardware Bandwidth Limit Bandwidth (GB/s) Impl. 1 Impl. 2 Impl. 3 Impl. 4 Impl. 5 Impl. 6 Impl. 7 cublas (a) Nvidia s GTX 480 GPU.
20 OpenCL und Performance-Portabilität 200 Hardware Bandwidth Limit Beispiel: Parallele Summation eines Arrays in OpenCL Vergleich von 7 OpenCL Implementierungen von Nvidia Bandwidth (GB/s) Impl. 1 Impl. 2 Impl. 3 Impl. 4 Impl. 5 Impl. 6 Impl. 7 cublas (a) Nvidia s GTX 480 GPU. 300 Hardware Bandwidth Limit 30 Hardware Bandwidth Limit Bandwidth (GB/s) Bandwidth (GB/s) Impl. 1 Impl. 2 Impl. 3 Impl. 4 Impl. 5 Impl. 6 Impl. 7 clblas 0 Impl. 1 Impl. 2 Impl. 3 Impl. 4 Failed Failed Failed Impl. 5 Impl. 6 Impl. 7 MKL (b) AMD s HD 7970 GPU. (c) Intel s E5530 dual-socket CPU. Performance in OpenCL ist nicht portabel!
21 Performance portable Codegenerierung mit Transformationsregeln BlackScholes Dot product Vector reduction... High-level programming High-level Expression Algorithmic Patterns iterate split map... reorder join reduce Algorithmic choices & Hardware optimizations Exploration with rewriting rules Low-level Expression OpenCL Patterns map-workgroup vectorize... tolocal map-local Code generation OpenCL Program Hardware Paradigms local memory workgroups... barriers vector units Figure 5.3: Overview of our code generation approach. Problems expressed
22 Beispiel: Parallele Summation vecsum = reduce (+) 0 rewrite rules code generation kernel void reduce6(global float* g_idata, global float* g_odata, unsigned int n, local volatile float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_group_id(0) * (get_local_size(0)*2) + get_local_id(0); unsigned int gridsize = WG_SIZE * get_num_groups(0); l_data[tid] = 0; while (i < n) { l_data[tid] += g_idata[i]; if (i + WG_SIZE < n) l_data[tid] += g_idata[i+wg_size]; i += gridsize; barrier(clk_local_mem_fence); vecsum = reduce join map-workgroup join toglobal (map-local (map-seq id)) split 1 join map-warp join map-lane (reduce-seq (+) 0) split 2 reorder-stride 1 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 2 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 4 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 8 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 16 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 32 split 64 join map-local (reduce-seq (+) 0) split 2 reorder-stride 64 join tolocal (map-local (reduce-seq (+) 0)) split (blocksize/128) reorder-stride 128 split blocksize Listing 5.13: Expression resembling the seventh implementation of parallel if (WG_SIZE >= 256) { if (tid < 128) { l_data[tid] += l_data[tid+128]; barrier(clk_local_mem_fence); if (WG_SIZE >= 128) { if (tid < 64) { l_data[tid] += l_data[tid+ 64]; barrier(clk_local_mem_fence); if (tid < 32) { if (WG_SIZE >= 64) { l_data[tid] += l_data[tid+32]; if (WG_SIZE >= 32) { l_data[tid] += l_data[tid+16]; if (WG_SIZE >= 16) { l_data[tid] += l_data[tid+ 8]; if (WG_SIZE >= 8) { l_data[tid] += l_data[tid+ 4]; if (WG_SIZE >= 4) { l_data[tid] += l_data[tid+ 2]; if (WG_SIZE >= 2) { l_data[tid] += l_data[tid+ 1]; if (tid == 0) g_odata[get_group_id(0)] = l_data[0];
23 Beispiel: Parallele Summation vecsum = reduce (+) 0 rewrite rules code generation kernel void reduce6(global float* g_idata, global float* g_odata, unsigned int n, local volatile float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_group_id(0) * (get_local_size(0)*2) + get_local_id(0); unsigned int gridsize = WG_SIZE * get_num_groups(0); l_data[tid] = 0; while (i < n) { l_data[tid] += g_idata[i]; if (i + WG_SIZE < n) l_data[tid] += g_idata[i+wg_size]; i += gridsize; barrier(clk_local_mem_fence); vecsum = reduce join map-workgroup join toglobal (map-local (map-seq id)) split 1 join map-warp join map-lane (reduce-seq (+) 0) split 2 reorder-stride 1 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 2 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 4 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 8 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 16 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 32 split 64 join map-local (reduce-seq (+) 0) split 2 reorder-stride 64 join tolocal (map-local (reduce-seq (+) 0)) split (blocksize/128) reorder-stride 128 split blocksize Listing 5.13: Expression resembling the seventh implementation of parallel if (WG_SIZE >= 256) { if (tid < 128) { l_data[tid] += l_data[tid+128]; barrier(clk_local_mem_fence); if (WG_SIZE >= 128) { if (tid < 64) { l_data[tid] += l_data[tid+ 64]; barrier(clk_local_mem_fence); if (tid < 32) { if (WG_SIZE >= 64) { l_data[tid] += l_data[tid+32]; if (WG_SIZE >= 32) { l_data[tid] += l_data[tid+16]; if (WG_SIZE >= 16) { l_data[tid] += l_data[tid+ 8]; if (WG_SIZE >= 8) { l_data[tid] += l_data[tid+ 4]; if (WG_SIZE >= 4) { l_data[tid] += l_data[tid+ 2]; if (WG_SIZE >= 2) { l_data[tid] += l_data[tid+ 1]; if (tid == 0) g_odata[get_group_id(0)] = l_data[0];
24 Algorithmische Primitive map A,B,I :(A! B)! [A] I! [B] I zip A,B,I :[A] I! [B] I! [A B] I reduce A,I :((A A)! A)! A! [A] I! [A] 1 split A,I :(n :size)! [A] n I! [[A] n ] I join A,I,J :[[A] I ] J! [A] I J iterate A,I,J :(n :size)! ((m :size)! [A] I m! [A] m )! [A] I n J! [A] J
25 High-Level Programme scal = a.map ( a) asum = reduce (+) 0 map abs dot = xs ys.(reduce (+) 0 map ( )) (zip xs ys) gemv = mat xs ys.map (+) ( zip (map (scal dot xs) mat) (scal ys) )
26 Beispiel: Parallele Summation vecsum = reduce (+) 0 rewrite rules code generation kernel void reduce6(global float* g_idata, global float* g_odata, unsigned int n, local volatile float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_group_id(0) * (get_local_size(0)*2) + get_local_id(0); unsigned int gridsize = WG_SIZE * get_num_groups(0); l_data[tid] = 0; while (i < n) { l_data[tid] += g_idata[i]; if (i + WG_SIZE < n) l_data[tid] += g_idata[i+wg_size]; i += gridsize; barrier(clk_local_mem_fence); vecsum = reduce join map-workgroup join toglobal (map-local (map-seq id)) split 1 join map-warp join map-lane (reduce-seq (+) 0) split 2 reorder-stride 1 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 2 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 4 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 8 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 16 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 32 split 64 join map-local (reduce-seq (+) 0) split 2 reorder-stride 64 join tolocal (map-local (reduce-seq (+) 0)) split (blocksize/128) reorder-stride 128 split blocksize Listing 5.13: Expression resembling the seventh implementation of parallel if (WG_SIZE >= 256) { if (tid < 128) { l_data[tid] += l_data[tid+128]; barrier(clk_local_mem_fence); if (WG_SIZE >= 128) { if (tid < 64) { l_data[tid] += l_data[tid+ 64]; barrier(clk_local_mem_fence); if (tid < 32) { if (WG_SIZE >= 64) { l_data[tid] += l_data[tid+32]; if (WG_SIZE >= 32) { l_data[tid] += l_data[tid+16]; if (WG_SIZE >= 16) { l_data[tid] += l_data[tid+ 8]; if (WG_SIZE >= 8) { l_data[tid] += l_data[tid+ 4]; if (WG_SIZE >= 4) { l_data[tid] += l_data[tid+ 2]; if (WG_SIZE >= 2) { l_data[tid] += l_data[tid+ 1]; if (tid == 0) g_odata[get_group_id(0)] = l_data[0];
27 Beispiel: Parallele Summation vecsum = reduce (+) 0 rewrite rules code generation kernel void reduce6(global float* g_idata, global float* g_odata, unsigned int n, local volatile float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_group_id(0) * (get_local_size(0)*2) + get_local_id(0); unsigned int gridsize = WG_SIZE * get_num_groups(0); l_data[tid] = 0; while (i < n) { l_data[tid] += g_idata[i]; if (i + WG_SIZE < n) l_data[tid] += g_idata[i+wg_size]; i += gridsize; barrier(clk_local_mem_fence); vecsum = reduce join map-workgroup join toglobal (map-local (map-seq id)) split 1 join map-warp join map-lane (reduce-seq (+) 0) split 2 reorder-stride 1 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 2 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 4 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 8 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 16 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 32 split 64 join map-local (reduce-seq (+) 0) split 2 reorder-stride 64 join tolocal (map-local (reduce-seq (+) 0)) split (blocksize/128) reorder-stride 128 split blocksize Listing 5.13: Expression resembling the seventh implementation of parallel if (WG_SIZE >= 256) { if (tid < 128) { l_data[tid] += l_data[tid+128]; barrier(clk_local_mem_fence); if (WG_SIZE >= 128) { if (tid < 64) { l_data[tid] += l_data[tid+ 64]; barrier(clk_local_mem_fence); if (tid < 32) { if (WG_SIZE >= 64) { l_data[tid] += l_data[tid+32]; if (WG_SIZE >= 32) { l_data[tid] += l_data[tid+16]; if (WG_SIZE >= 16) { l_data[tid] += l_data[tid+ 8]; if (WG_SIZE >= 8) { l_data[tid] += l_data[tid+ 4]; if (WG_SIZE >= 4) { l_data[tid] += l_data[tid+ 2]; if (WG_SIZE >= 2) { l_data[tid] += l_data[tid+ 1]; if (tid == 0) g_odata[get_group_id(0)] = l_data[0];
28 Algorithmische Transformationsregeln Transformationsregeln sind semantikerhaltend Drücken Auswahl bei der algorithmische Implementierungen aus Split-Join Zerlegung: map f! join map (map f) split n Map Zusammenschluss: map f map g! map (f g) Reduktionsregeln: reduce fz! reduce fz reducepart fz reducepart fz! reducepart fz reorder reducepart fz! join map (reducepart fz) split n reducepart fz! iterate n (reducepart fz)
29 OpenCL Primitive Primitive mapglobal OpenCL Konzept Work-items mapworkgroup / maplocal Work-groups mapseq / reduceseq Sequentielle Implementierungen tolocal / toglobal Speicherbereiche mapvec / splitvec / joinvec Vektorisierung
30 OpenCL Transformationsregeln Drücken hardware-spezifische Optimierungen aus Map: map f! mapworkgroup f maplocal f mapglobal f mapseq f Lokaler/ Globaler Speicher: maplocal f! tolocal (maplocal f) maplocal f! toglobal (maplocal f) Vektorisierung: map f! joinvec map (mapvec f) splitvec n Map-Reduktion Zusammenschluss: reduceseq fz mapseq g! reduceseq ( (acc, x). f(acc, g x)) z
31 Beispiel: Parallele Summation vecsum = reduce (+) 0 rewrite rules code generation kernel void reduce6(global float* g_idata, global float* g_odata, unsigned int n, local volatile float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_group_id(0) * (get_local_size(0)*2) + get_local_id(0); unsigned int gridsize = WG_SIZE * get_num_groups(0); l_data[tid] = 0; while (i < n) { l_data[tid] += g_idata[i]; if (i + WG_SIZE < n) l_data[tid] += g_idata[i+wg_size]; i += gridsize; barrier(clk_local_mem_fence); vecsum = reduce join map-workgroup join toglobal (map-local (map-seq id)) split 1 join map-warp join map-lane (reduce-seq (+) 0) split 2 reorder-stride 1 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 2 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 4 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 8 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 16 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 32 split 64 join map-local (reduce-seq (+) 0) split 2 reorder-stride 64 join tolocal (map-local (reduce-seq (+) 0)) split (blocksize/128) reorder-stride 128 split blocksize Listing 5.13: Expression resembling the seventh implementation of parallel if (WG_SIZE >= 256) { if (tid < 128) { l_data[tid] += l_data[tid+128]; barrier(clk_local_mem_fence); if (WG_SIZE >= 128) { if (tid < 64) { l_data[tid] += l_data[tid+ 64]; barrier(clk_local_mem_fence); if (tid < 32) { if (WG_SIZE >= 64) { l_data[tid] += l_data[tid+32]; if (WG_SIZE >= 32) { l_data[tid] += l_data[tid+16]; if (WG_SIZE >= 16) { l_data[tid] += l_data[tid+ 8]; if (WG_SIZE >= 8) { l_data[tid] += l_data[tid+ 4]; if (WG_SIZE >= 4) { l_data[tid] += l_data[tid+ 2]; if (WG_SIZE >= 2) { l_data[tid] += l_data[tid+ 1]; if (tid == 0) g_odata[get_group_id(0)] = l_data[0];
32 Beispiel: Parallele Summation vecsum = reduce (+) 0 rewrite rules code generation kernel void reduce6(global float* g_idata, global float* g_odata, unsigned int n, local volatile float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_group_id(0) * (get_local_size(0)*2) + get_local_id(0); unsigned int gridsize = WG_SIZE * get_num_groups(0); l_data[tid] = 0; while (i < n) { l_data[tid] += g_idata[i]; if (i + WG_SIZE < n) l_data[tid] += g_idata[i+wg_size]; i += gridsize; barrier(clk_local_mem_fence); vecsum = reduce join map-workgroup join toglobal (map-local (map-seq id)) split 1 join map-warp join map-lane (reduce-seq (+) 0) split 2 reorder-stride 1 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 2 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 4 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 8 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 16 join map-lane (reduce-seq (+) 0) split 2 reorder-stride 32 split 64 join map-local (reduce-seq (+) 0) split 2 reorder-stride 64 join tolocal (map-local (reduce-seq (+) 0)) split (blocksize/128) reorder-stride 128 split blocksize Listing 5.13: Expression resembling the seventh implementation of parallel if (WG_SIZE >= 256) { if (tid < 128) { l_data[tid] += l_data[tid+128]; barrier(clk_local_mem_fence); if (WG_SIZE >= 128) { if (tid < 64) { l_data[tid] += l_data[tid+ 64]; barrier(clk_local_mem_fence); if (tid < 32) { if (WG_SIZE >= 64) { l_data[tid] += l_data[tid+32]; if (WG_SIZE >= 32) { l_data[tid] += l_data[tid+16]; if (WG_SIZE >= 16) { l_data[tid] += l_data[tid+ 8]; if (WG_SIZE >= 8) { l_data[tid] += l_data[tid+ 4]; if (WG_SIZE >= 4) { l_data[tid] += l_data[tid+ 2]; if (WG_SIZE >= 2) { l_data[tid] += l_data[tid+ 1]; if (tid == 0) g_odata[get_group_id(0)] = l_data[0];
33 Muster basierte OpenCL Codegenerierung Generiere OpenCL Code für jedes OpenCL Primitiv mapglobal fxs for (int g_id = get_global_id(0); g_id < n; g_id += get_global_size(0)) { output[g_id] = f(xs[g_id]); reduceseq fzxs T acc = z; for (int i = 0; i < n; ++i) { acc = f(acc, xs[i]);..
34 Transformationsregeln definieren einen Suchraum gültiger Implementierungen reduce (+) 0 reduce (+) 0 reducepart (+) 0
35 Transformationsregeln definieren einen Suchraum gültiger Implementierungen reduce (+) 0 reduce (+) 0 reducepart (+) 0 reduce (+) 0 reducepart (+) 0 reorder reduce (+) 0 iterate n (reducepart (+) 0)
36 Transformationsregeln definieren einen Suchraum gültiger Implementierungen reduce (+) 0 reduce (+) 0 reducepart (+) 0 reduce (+) 0 reducepart (+) 0 reorder reduce (+) 0 iterate n (reducepart (+) 0)
37 Transformationsregeln definieren einen Suchraum gültiger Implementierungen reduce (+) 0 reduce (+) 0 reducepart (+) 0 reduce (+) 0 reducepart (+) 0 reorder reduce (+) 0 iterate n (reducepart (+) 0) reduce (+) 0 join map (reducepart (+) 0) split n
38 Transformationsregeln definieren einen Suchraum gültiger Implementierungen reduce (+) 0 reduce (+) 0 reducepart (+) 0 reduce (+) 0 reducepart (+) 0 reorder reduce (+) 0 iterate n (reducepart (+) 0) reduce (+) 0 join map (reducepart (+) 0) split n Vollautomatische Suche nach guten Implementierungen möglich! (Eine einfache Suchstrategie ist in der Dissertation beschrieben)
39 Evaluation Geschwindigkeit gegenüber einer funktional portablen Implementierung 4 Nvidia GPU AMD GPU Intel CPU Speedup small large small large small large small large scal asum dot gemv Black Scholes MD Bis zu 20x Speedup gegenüber der funktional portablen clblas Implementierung
40 Evaluation Geschwindigkeit gegenüber Hardware spezifischen Implementierungen Speedup over CUBLAS CUBLAS Generated small large small large small large small large scal asum dot gemv Speedup over clblas clblas Generated small large small large small large small large scal asum dot gemv Speedup over MKL MKL Generated small large small large small large small large scal asum dot gemv (a) Nvidia GPU (b) AMD GPU (c) Intel CPU Automatisch generierter Code vs. handoptimierten Code Konkurrenzfähige Ergebnisse vs. hochoptimierte Implementierungen Bis zu 4.5x Speedup für gemv auf der AMD GPU
41 Zusammenfassung Um die Herausforderung der Programmierbarkeit zu adressieren: Ein neuer Ansatz zur Programmierung von Systemen mit mehreren GPUs Zwei neue formell definierte und implementierte algorithmische Skelette Um die Herausforderung der Performance-Portabilität zu adressieren: Ein formelles System zur Transformation muster-basierter Programme Ein Codegenerator der Performance-Portabilität erreicht
42 Ergebnisse der Suche Automatisch Gefundene Ausdrücke asum = reduce (+) 0 map abs Nvidia GPU AMD GPU Intel CPU x.(reduceseq join join mapworkgroup ( toglobal maplocal (reduceseq ( (a, b). a+(abs b)) 0) reorderstride 2048 ) split 128 split 2048) x x.(reduceseq join joinvec join mapworkgroup ( maplocal (reduceseq (mapvec 2( (a, b). a+(abs b))) 0 reorderstride 2048 ) split 128 splitvec 2 split 4096) x x.(reduceseq join mapworkgroup (join joinvec maplocal ( reduceseq (mapvec 4( (a, b). a+(abs b))) 0 ) splitvec 4 split 32768) split 32768) x Gesucht für: Nvidia GTX 480 GPU, AMD Radeon HD 7970 GPU, Intel Xeon E5530 CPU
43 Ergebnisse der Suche Effizienz der Suche Absolute performance in GB/s Absolute performance in GB/s Absolute performance in GB/s Number of evaluated expressions Number of evaluated expressions Number of evaluated expressions (a) Nvidia GPU (b) AMD GPU (c) Intel CPU Die Suche hat auf jeder Platform weniger als 1 Stunde gedauert Durchschnittliche Zeit zur Ausführung eines Kandidaten weniger als 1/2 Sekunde
44 Fazit des Beispiels Optimieren in OpenCL ist kompliziert Verständnis für die Zielarchitektur benötigt Veränderungen im Program nicht offensichtlich kernel void reduce6(global float* g_idata, global float* g_odata, unsigned int n, local volatile float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_group_id(0) * (get_local_size(0)*2) + get_local_id(0); unsigned int gridsize = WG_SIZE * get_num_groups(0); l_data[tid] = 0; while (i < n) { l_data[tid] += g_idata[i]; if (i + WG_SIZE < n) l_data[tid] += g_idata[i+wg_size]; i += gridsize; barrier(clk_local_mem_fence); kernel void reduce0(global float* g_idata, global float* g_odata, unsigned int n, local float* l_data) { unsigned int tid = get_local_id(0); unsigned int i = get_global_id(0); l_data[tid] = (i < n)? g_idata[i] : 0; barrier(clk_local_mem_fence); for (unsigned int s=1; s < get_local_size(0); s*= 2) { if ((tid % (2*s)) == 0) { l_data[tid] += l_data[tid + s]; barrier(clk_local_mem_fence); if (tid == 0) g_odata[get_group_id(0)] = l_data[0]; Nicht Optimierte Implementierung if (WG_SIZE >= 256) { if (tid < 128) { l_data[tid] += l_data[tid+128]; barrier(clk_local_mem_fence); if (WG_SIZE >= 128) { if (tid < 64) { l_data[tid] += l_data[tid+ 64]; barrier(clk_local_mem_fence); if (tid < 32) { if (WG_SIZE >= 64) { l_data[tid] += l_data[tid+32]; if (WG_SIZE >= 32) { l_data[tid] += l_data[tid+16]; if (WG_SIZE >= 16) { l_data[tid] += l_data[tid+ 8]; if (WG_SIZE >= 8) { l_data[tid] += l_data[tid+ 4]; if (WG_SIZE >= 4) { l_data[tid] += l_data[tid+ 2]; if (WG_SIZE >= 2) { l_data[tid] += l_data[tid+ 1]; if (tid == 0) g_odata[get_group_id(0)] = l_data[0]; Voll Optimierte Implementierung
45 Matrix Multiplikation C A B A x B = map(λ rowa map(λ colb dotproduct(rowa, colb), transpose(b)), A)
46 Suche für Matrix Multiplikation Phases: Algorithmic Exploration OpenCL speci c Exploration Parameter Exploration Code Generation......
47 Suchraum für Matrix Multiplikation 600 Fermi Kepler Tahiti 1500 Throughput (GFlop/s) Nur einige generierte OpenCL Programme mit sehr guter Performance
48 Performance Entwicklung für Matrix Multiplikation Selbst mit einer einfachen zufälligen Strategie kann man erwarten schnell ein Program mit guter Performance zu finden
49 Evaluation für Matrix Multiplikation Generated MAGMA cublas Nvidia GeForce GTX 480 (Fermi) Generated MAGMA cublas Nvidia GeForce GTX TITAN Black (Kepler) Throughput (Gflop/s) Generated clmagma clblas clblas Tuned Input Size 3000 AMD Radeon HD 7970 (Tahiti) Performance nahe oder sogar besser als handoptimierte MAGMA Bibliothek
50 Performance-Portabilität von Matrix Multiplikation 100 Executed on Fermi Kepler Tahiti Relative performance X X X X X X Executed with input size 0 X X 1K 2K 1K 2K 1K 2K Fermi Kepler Tahiti X X 1K 2K 1K 2K 1K 2K Fermi Kepler Tahiti The six specialized OpenCL kernels X X 1K 2K 1K 2K 1K 2K Fermi Kepler Tahiti Generierte Programmer sind spezialisiert für GPU und Eingabegröße
Verbesserung der Programmierbarkeit und Performance-Portabilität von Manycore-Prozessoren 1
Steffen Hölldobler et. al. (Hrsg.): Ausgezeichnete Informatikdissertationen 2015, Lecture Notes in Informatics (LNI), Gesellschaft für Informatik, Bonn 2016 269 Verbesserung der Programmierbarkeit und
Mehr> High-Level Programmierung heterogener paralleler Systeme
> High-Level Programmierung heterogener paralleler Systeme Projektseminar im SoSe 2012 Prof. Sergei Gorlatch, Michel Steuwer, Tim Humernbrum AG Parallele und Verteilte Systeme, Westfälische Wilhelms-Universität
MehrOpenCL. Programmiersprachen im Multicore-Zeitalter. Tim Wiersdörfer
OpenCL Programmiersprachen im Multicore-Zeitalter Tim Wiersdörfer Inhaltsverzeichnis 1. Was ist OpenCL 2. Entwicklung von OpenCL 3. OpenCL Modelle 1. Plattform-Modell 2. Ausführungs-Modell 3. Speicher-Modell
MehrGeneral Purpose Computation on GPUs
General Purpose Computation on GPUs Matthias Schneider, Robert Grimm Universität Erlangen-Nürnberg {matthias.schneider, robert.grimm}@informatik.stud.uni-erlangen.de M. Schneider, R. Grimm 1 Übersicht
MehrProgrammierbeispiele und Implementierung. Name: Michel Steuwer E-Mail: michel.steuwer@wwu.de
> Programmierbeispiele und Implementierung Name: Michel Steuwer E-Mail: michel.steuwer@wwu.de 2 > Übersicht > Matrix Vektor Multiplikation > Mandelbrotmenge / Apfelmännchen berechnen > Kantendetektion
MehrCompute Unified Device Architecture CUDA
Compute Unified Device Architecture 06. Februar 2012 1 / 13 Gliederung 2 / 13 : Compute Unified Device Architecture entwickelt von Nvidia Corporation spezifiziert Software- und Hardwareeigenschaften Ziel:
MehrPhysikalische Berechnungen mit General Purpose Graphics Processing Units (GPGPUs)
Fakultätsname XYZ Fachrichtung XYZ Institutsname XYZ, Professur XYZ Physikalische Berechnungen mit General Purpose Graphics Processing Units (GPGPUs) im Rahmen des Proseminars Technische Informatik Juni
MehrCUDA. Moritz Wild, Jan-Hugo Lupp. Seminar Multi-Core Architectures and Programming. Friedrich-Alexander-Universität Erlangen-Nürnberg
CUDA Seminar Multi-Core Architectures and Programming 1 Übersicht Einleitung Architektur Programmierung 2 Einleitung Computations on GPU 2003 Probleme Hohe Kenntnisse der Grafikprogrammierung nötig Unterschiedliche
MehrBeispielvortrag: HPCG auf Intel Haswell-EP
Beispielvortrag: HPCG auf Intel Haswell-EP Johannes Hofmann 1 Seminarvortrag Architekturen von Multi- und Vielkern-Prozessoren Erlangen, 19.4.2016 1 Computer Architecture, University Erlangen-Nuremberg
MehrDer Goopax Compiler GPU-Programmierung in C++ ZKI AK-Supercomputing, Münster, 27.03.2014, Ingo Josopait
Der Goopax Compiler GPU-Programmierung in C++ AMD R9 290X: 5.6 TFLOPS (SP MulAdd) Programmierung ~10000 Threads Entwicklungsumgebungen Entwicklungsumgebungen CUDA, OpenCL Compiler: kernel GPU Maschinencode
MehrYilmaz, Tolga MatNr: Mesaud, Elias MatNr:
Yilmaz, Tolga MatNr: 157317 Mesaud, Elias MatNr: 151386 1. Aufbau und Funktionsweise einer Grafikkarte 2. CPU vs. GPU 3. Software 4. Beispielprogramme Kompilierung und Vorführung 5. Wo wird Cuda heutzutage
MehrLEISTUNGSVERGLEICH VON FPGA, GPU UND CPU FÜR ALGORITHMEN ZUR BILDBEARBEITUNG PROSEMINAR INF-B-610
LEISTUNGSVERGLEICH VON FPGA, GPU UND CPU FÜR ALGORITHMEN ZUR BILDBEARBEITUNG PROSEMINAR INF-B-610 Dominik Weinrich dominik.weinrich@tu-dresden.de Dresden, 30.11.2017 Gliederung Motivation Aufbau und Hardware
MehrOpenCL. OpenCL. Boris Totev, Cornelius Knap
OpenCL OpenCL 1 OpenCL Gliederung Entstehungsgeschichte von OpenCL Was, warum und überhaupt wieso OpenCL CUDA, OpenGL und OpenCL GPUs OpenCL Objekte Work-Units OpenCL Adressbereiche OpenCL API Codebeispiel
MehrPGI Accelerator Model
PGI Accelerator Model Philip Höhlein, Nils Werner Supervision: R. Membarth, P. Kutzer, F. Hannig Hardware-Software-Co-Design Universität Erlangen-Nürnberg Philip Höhlein, Nils Werner 1 Übersicht Motivation
MehrRST-Labor WS06/07 GPGPU. General Purpose Computation On Graphics Processing Units. (Grafikkarten-Programmierung) Von: Marc Blunck
RST-Labor WS06/07 GPGPU General Purpose Computation On Graphics Processing Units (Grafikkarten-Programmierung) Von: Marc Blunck Ablauf Einführung GPGPU Die GPU GPU Architektur Die Programmierung Programme
MehrGPGPU-Architekturen CUDA Programmiermodell Beispielprogramm. Einführung CUDA. Ralf Seidler. Friedrich-Alexander-Universität Erlangen-Nürnberg
Einführung CUDA Friedrich-Alexander-Universität Erlangen-Nürnberg PrakParRA, 18.11.2010 Outline 1 GPGPU-Architekturen 2 CUDA Programmiermodell 3 Beispielprogramm Outlook 1 GPGPU-Architekturen 2 CUDA Programmiermodell
MehrCilk Sprache für Parallelprogrammierung. IPD Snelting, Lehrstuhl für Programmierparadigmen
Cilk Sprache für Parallelprogrammierung IPD Snelting, Lehrstuhl für Programmierparadigmen David Soria Parra Geschichte Geschichte Entwickelt 1994 am MIT Laboratory for Computer Science Cilk 1: Continuations
MehrOpenCL. Seminar Programmiersprachen im Multicore-Zeitalter Universität Siegen Tim Wiersdörfer tim.wiersdoerfer@student.uni-siegen.
OpenCL Seminar Programmiersprachen im Multicore-Zeitalter Universität Siegen Tim Wiersdörfer tim.wiersdoerfer@student.uni-siegen.de Abstract: In diesem Dokument wird ein grundlegender Einblick in das relativ
MehrPraxiseinheit: Realisierung einer hardwarebeschleunigten Disparitätenberechnung zur automatischen Auswertung von Stereobildern
Praxiseinheit: Realisierung einer hardwarebeschleunigten Disparitätenberechnung zur automatischen Auswertung von Stereobildern Institut für Betriebssysteme und Rechnerverbund TU Braunschweig 25.10., 26.10.
MehrMasterpraktikum Scientific Computing
Masterpraktikum Scientific Computing High-Performance Computing Thomas Auckenthaler Wolfgang Eckhardt Prof. Dr. Michael Bader Technische Universität München, Germany Outline Organisatorisches Entwicklung
MehrEffektive Nutzung der Simulationsumgebung Anregungen für die Praxis
1 2017 ANSYS, 14. Inc. Juni 2017 in June Winterthur 20, 2017 22. SCHWEIZER CADFEM ANSYS SIMULATION CONFERENCE Effektive Nutzung der Simulationsumgebung Anregungen für die Praxis Martin Mann Sales & Acount
MehrAutomatische OpenCL-Code-Analyse zur Bestimmung von Speicherzugriffsmustern
Automatische OpenCL-Code-Analyse zur Bestimmung von Speicherzugriffsmustern Bachelorarbeit Moritz Lüdecke 8. Juli 2014 INSTITUT FÜR TECHNISCHE INFORMATIK - LEHRSTUHL FÜR RECHNERARCHITEKTUR UND PARALLELVERARBEITUNG
MehrEntwicklung algorithmischer Skelette für CUDA am Beispiel von Affintiy Propagation
Entwicklung algorithmischer Skelette für CUDA am Beispiel von Affintiy Propagation Christoph Winter Fakultät für Informatik und Mathematik Ostbayerische Technische Hochschule Regensburg 93049 Regensburg
MehrMulti- und Many-Core
Multi- und Many-Core Benjamin Warnke Arbeitsbereich Wissenschaftliches Rechnen Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität Hamburg 2016-12-15 Benjamin
MehrOpenCL Implementierung von OpenCV Funktionen
Multi-Core Architectures and Programming OpenCL Implementierung von OpenCV Funktionen julian.mueller@e-technik.stud.uni-erlangen.de Hardware/Software Co-Design August 18, 2011 1 Table of content 1 OpenCL
MehrEvaluation. Einleitung. Implementierung Integration. Zusammenfassung Ausblick
Christopher Schleiden Bachelor Kolloquium 15.09.2009 Einleitung Evaluation Implementierung Integration Zusammenfassung Ausblick Einleitung laperf Lineare Algebra Bibliothek für C++ Möglichkeit zur Integration
MehrProgrammierung von Graphikkarten
Programmierung von Graphikkarten Stefan Lang Interdisziplinäres Zentrum für Wissenschaftliches Rechnen Universität Heidelberg INF 368, Raum 532 D-69120 Heidelberg phone: 06221/54-8264 email: Stefan.Lang@iwr.uni-heidelberg.de
MehrSeminar GPU-Programmierung/Parallelverarbeitung
Seite iv Literaturverzeichnis 1) Bengel, G.; et al.: Masterkurs Parallele und Verteilte Systeme. Vieweg + Teubner, Wiesbaden, 2008. 2) Breshears, C.: The Art of Concurrency - A Thread Monkey's Guide to
MehrGrafikkarten-Architektur
> Grafikkarten-Architektur Parallele Strukturen in der GPU Name: Sebastian Albers E-Mail: s.albers@wwu.de 2 > Inhalt > CPU und GPU im Vergleich > Rendering-Pipeline > Shader > GPGPU > Nvidia Tesla-Architektur
MehrCUDA. (Compute Unified Device Architecture) Thomas Trost. May 31 th 2016
CUDA (Compute Unified Device Architecture) Thomas Trost May 31 th 2016 Introduction and Overview platform and API for parallel computing on GPUs by NVIDIA relatively straightforward general purpose use
MehrGPGPU mit NVIDIA CUDA
01.07.12 GPGPU mit NVIDIA CUDA General-Purpose on Formatvorlagecomputing des Graphics Processing durch Units Untertitelmasters mit KlickenCompute bearbeiten NVIDIA Unified Device Architecture Gliederung
MehrFPGA Systementwurf. Rosbeh Etemadi. Paderborn University. 29. Mai 2007
Paderborn Center for Parallel l Computing Paderborn University 29. Mai 2007 Übersicht 1. FPGAs 2. Entwicklungssprache VHDL 3. Matlab/Simulink 4. Entwicklungssprache Handel-C 5. Fazit Übersicht FPGAs 1.
MehrGrundlagen von CUDA, Sprachtypische Elemente
Grundlagen von CUDA, Sprachtypische Elemente Stefan Maskanitz 03.07.2009 CUDA Grundlagen 1 Übersicht 1. Einleitung 2. Spracheigenschaften a. s, Blocks und Grids b. Speicherorganistion c. Fehlerbehandlung
MehrChapel Dennis Appelt. Seminar: Sprachen für Parallelverarbeitung.
Chapel Dennis Appelt Seminar: Sprachen für Parallelverarbeitung INSTITUTE FOR PROGRAM STRUCTURES AND DATA ORGANIZATION, FACULTY OF INFORMATICS KIT University of the State of Baden-Wuerttemberg and National
MehrGPU-Programmierung: OpenCL
Seminar: Multicore Programmierung Sommerstemester 2009 04.06.2009 Inhaltsverzeichnis 1 GPU-Programmierung von Grafikkarten von GPU-Computing 2 Architektur Spracheigenschaften Vergleich mit CUDA Beispiel
MehrNumerik und Rechnen. Martin Heide & Dominik Holler. 12. Juni 2006
12. Juni 2006 Bibliothek für Lineare Algebra GPGPU-Programming: Low-Level High-Level Bibliothek Bibliothek für Lineare Algebra Gliederung 1 Bibliothek für Lineare Algebra 2 Skalare Bibliothek für Lineare
MehrParallele Algorithmen mit OpenCL. Universität Osnabrück, Henning Wenke, 2013-05-08
Parallele Algorithmen mit OpenCL Universität Osnabrück, Henning Wenke, 2013-05-08 Aufräumen Ressourcen in umgekehrter Abhängigkeitsreihenfolge freigeben Objekte haben Reference-Count (RC), initial 1 clrelease
MehrGPGPU-Programming. Constantin Timm Informatik 12 TU Dortmund 2012/04/09. technische universität dortmund. fakultät für informatik informatik 12
12 GPGPU-Programming Constantin Timm Informatik 12 TU Dortmund 2012/04/09 Diese Folien enthalten Graphiken mit Nutzungseinschränkungen. Das Kopieren der Graphiken ist im Allgemeinen nicht erlaubt. Motivation
MehrHigh-level software transformations
12 Peter Marwedel TU Dortmund Informatik 12 Germany Graphics: Alexandra Nolte, Gesine Marwedel, 2003 High-level software transformations Impact of memory allocation on efficiency Array p[j][k] Row major
MehrParallel Computing. Einsatzmöglichkeiten und Grenzen. Prof. Dr. Nikolaus Wulff
Parallel Computing Einsatzmöglichkeiten und Grenzen Prof. Dr. Nikolaus Wulff Vorüberlegungen Wann ist paralleles Rechnen sinnvoll? Wenn die Performance/Geschwindigkeit steigt. Wenn sich größere Probleme
MehrTecNews: Sandy Bridge
TecNews: Sandy Bridge Werner Fischer, Technology Specialist Thomas-Krenn.AG Thomas Krenn Herbstworkshop & Roadshow 2011 23.09. in Freyung 06.10. in Wien (A) 10.10. in Frankfurt 11.10. in Düsseldorf 12.10.
Mehrtechnische universität dortmund Lehrstuhl für Hochfrequenztechnik Übertragungssysteme
Lehrstuhl für Hochfrequenztechnik GPU-beschleunigte numerische Simulation faseroptischer Übertragungssysteme, Marius Helf, Peter Krummrich Übersicht Motivation Split-Step p Fourier Methode Ansätze für
MehrAutomatische Parallelisierung
MPI und OpenMP in HPC Anwendungen findet man immer häufiger auch den gemeinsamen Einsatz von MPI und OpenMP: OpenMP wird zur thread-parallelen Implementierung des Codes auf einem einzelnen Rechenknoten
MehrDie beste Infrastruktur ist nur so schnell, wie der Code der darauf läuft. Fallbeispiel Wettervorhersage
Die beste Infrastruktur ist nur so schnell, wie der Code der darauf läuft Fallbeispiel Wettervorhersage VPE Swiss Workshop, HSR 24. Januar 2013 David Müller, Tobias Gysi Vision trifft Realität. Supercomputing
MehrGPUs. Arbeitsbereich Wissenschaftliches Rechnen Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität Hamburg
GPUs Arbeitsbereich Wissenschaftliches Rechnen Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität Hamburg Vorgelegt von: Johannes Coym E-Mail-Adresse: 4coym@informatik.uni-hamburg.de
MehrEinführung. GPU-Versuch. Andreas Schäfer Friedrich-Alexander-Universität Erlangen-Nürnberg
GPU-Versuch andreas.schaefer@cs.fau.de Friedrich-Alexander-Universität Erlangen-Nürnberg Praktikum Parallele Rechnerarchitekturen SS2014 Outline 1 Einführung 2 Outlook 1 Einführung 2 Eine kurze Geschichte
MehrKick-Off Paralleles Programmieren
Fakultät Informatik Institut für Software- und Multimediatechnik, Lehrstuhl für Softwaretechnologie Kick-Off Paralleles Programmieren Thomas Kühn Motivation Moore's Law The complexity for minimum component
MehrMulticore Herausforderungen an das Software-Engineering. Prof. Dr.-Ing. Michael Uelschen Hochschule Osnabrück 15.09.2010
Multicore Herausforderungen an das Software-Engineering Prof. Dr.-Ing. Michael Uelschen Hochschule Osnabrück 15.09.2010 Inhalt _ Motivation _ Herausforderung 1: Hardware _ Herausforderung 2: Software-Partitionierung
MehrUniversität Karlsruhe (TH)
Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 OpenMP-Programmierung Teil III Multikern-Praktikum Wintersemester 06-07 Inhalt Was ist OpenMP? Parallele Regionen Konstrukte zur Arbeitsteilung
MehrExascale Computing. = Exascale braucht Manycore-Hardware...und was für Software??? 46/58
Exascale Computing Die FLOP/s-Tabelle: Name Faktor erreicht heute Giga 10 9 1976 CPU-Kern Tera 10 12 1997 Graphikkarte (GPU) Peta 10 15 2009 Supercomputer Exa 10 18 2020(?) Der gegenwärtig schnellste Rechner
MehrOutline. Cell Broadband Engine. Application Areas. The Cell
Outline 21.March 2006 Benjamin Keck Why Cell?!? Application Areas Architectural Overview Programming Model Programming on the PPE C/C++ Intrinsics 1 2 The Cell Supercomputer on a chip Multi-Core Microprocessor
Mehr2 Rechnerarchitekturen
2 Rechnerarchitekturen Rechnerarchitekturen Flynns Klassifikation Flynnsche Klassifikation (Flynn sche Taxonomie) 1966 entwickelt, einfaches Modell, bis heute genutzt Beschränkung der Beschreibung auf
MehrModellierung und Simulation optischer Strahlführungen. Diplomarbeit Timon Bätz
Modellierung und Simulation optischer Strahlführungen Diplomarbeit Timon Bätz Übersicht Ziele Physikalische Hintergründe Architektur und Implementierung Ergebnisse Ausblick Demo 2 Ziele Entwicklung eines
MehrGPGPU-Architekturen CUDA Programmiermodell Beispielprogramm Organiosatorisches. Tutorial CUDA. Ralf Seidler
Friedrich-Alexander-Universität Erlangen-Nürnberg 05.10.2010 Outline 1 GPGPU-Architekturen 2 CUDA Programmiermodell 3 Beispielprogramm 4 Organiosatorisches Outlook 1 GPGPU-Architekturen 2 CUDA Programmiermodell
MehrKlausur zu High Performance Computing 09. Juli 2011, SS 2011
Alexander Vondrous, Britta Nestler, Fakultät IWI, Hochschule Karlsruhe Klausur zu High Performance Computing 09. Juli 2011, SS 2011 Es sind keine Hilfsmittel zugelassen. Bearbeitungszeit: 90 Minuten Aufgabe
MehrCell Broadband Engine & CellSs: ein Programmiermodel für den Cell Prozessor
Cell Broadband Engine & CellSs: ein Programmiermodel für den Cell Prozessor Hardware-Software-Co-Design Universität Erlangen-Nürnberg mark.duchon@mb.stud.uni-erlangen.de Ziegler_Matthias@web.de andreas.fall@googlemail.com
MehrCell Broadband Engine
Cell Broadband Engine 21.March 2006 Benjamin Keck Outline Why Cell?!? Application Areas Architectural Overview SPU Programming Model Programming on the PPE C/C++ Intrinsics The Cell Supercomputer on a
MehrFPGA Beschleuniger. Your Name. Armin Jeyrani Mamegani Your Organization (Line #2)
FPGA Beschleuniger 15.12.2008 Armin Jeyrani Mamegani Your Name HAW Hamburg Your Title Department Your Organization Informatik (Line #1) Your Organization (Line #2) Einleitung Wiederholung aus AW1: Handy
MehrMachine Learning Hardware
Machine Learning Hardware Dominik Scherer 06.11.2017 Seminar Neuste Trends in Big Data Analytics Betreuer: Dr. Julian Kunkel Motivation Maschinelles Lernen in vielen Bereichen angewendet, z.b. Spracherkennung
MehrNeue Dual-CPU Server mit Intel Xeon Scalable Performance (Codename Purley/Skylake-SP)
Neue Dual-CPU Server mit Intel Xeon Scalable Performance (Codename Purley/Skylake-SP) @wefinet Werner Fischer, Thomas-Krenn.AG Webinar, 17. Oktober 2017 Intel Xeon Scalable Performance _ Das ist NEU: Neue
MehrEffiziente GPU-Algorithmen
Effiziente GPU-Algorithmen Martin Vielsmaier 24. November 2011 Inhalt Warum GPGPU? Geschichte SIMD OpenCL Begriffe Speichermodell OpenCL C Algorithmen Matrixmultiplikation Sortieren Variable-length encoding
MehrProzessor- und Rechnerarchitekturen (Master)
Prozessor- und Rechnerarchitekturen (Master) Themen am 28.06.17: Semesterrückblick, Terminplanung Ihrer Vorträge ProRecArc17_V10 Ulrich Schaarschmidt HS Düsseldorf, SS 2017 V1 (5.4.): Termine + mögliche
MehrC++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14
C++ Teil 6 Sven Groß 27. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 27. Mai 2016 1 / 14 Themen der letzten Vorlesung Musterlösung A2 Wdh.: Zeiger und Felder Kopieren von Feldern Dynamische Speicherverwaltung
MehrPRIP-Preis. Effizientes Object Tracking durch Programmierung von Mehrkernprozessoren und Grafikkarten
Masterarbeit @ PRIP-Preis Effizientes Object Tracking durch Programmierung von Mehrkernprozessoren und Grafikkarten Michael Rauter Pattern Recognition and Image Processing Group Institute of Computer Aided
MehrSoftware Engineering für moderne parallele Plattformen 9. GPGPUs: Grafikkarten als Parallelrechner
Software Engineering für moderne parallele Plattformen 9. GPGPUs: Grafikkarten als Parallelrechner Dipl.-Inform. Korbinian Molitorisz M. Sc. Luis Manuel Carril Rodriguez KIT Universität des Landes Baden-Württemberg
MehrGPGPUs am Jülich Supercomputing Centre
GPGPUs am Jülich Supercomputing Centre 20. April 2012 Jochen Kreutz Jülich Supercomputing Centre (JSC) Teil des Forschungszentrums Jülich und des Institute for Advanced Simulation (IAS) betreibt Supercomputer
MehrGrundlagen der Informatik 6. Arrays I
6. Arrays I Motivation Array (konstante Länge) Speicherbereich Eingabe von Arrays Grundlagen der Informatik (Alex Rempel) 1 Motivation Beispiel: Bildschirmpixel zeichnen Auflösung 800x600, d.h. insgesamt
MehrInformatik II Übung, Woche 10
Giuseppe Accaputo 10. März, 2016 Plan für heute 1. Typumwandlung (Typecasts) 2. Ordnerstruktur für Übungen 3. Vorbesprechung Übung 3 4. Nachbesprechung Übung 2 (inkl. Live Programmierung) Informatik II
MehrGrundlagen der Programmiersprache C für Studierende der Naturwissenschaften
Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften Teil 7: Matrizen, Vektoren und dynamische Speicherverwaltung Martin Nolte Abteilung für Angewandte Mathematik Universität Freiburg
MehrFerienakademie Erik Muttersbach
Ferienakademie 2009 - Erik Muttersbach 1. Einführung 2. Kernels, Threads, Blocks 3. CUDA Execution Model 4. Software Stack 5. Die CUDA Runtime API 6. Speichertypen/ Zugriff 7. Profiling und Optimierung
MehrSeminarvortrag: Direktivenbasierte Programmierung von Beschleunigern mit OpenMP 4.5 und OpenACC 2.5 im Vergleich
Seminarvortrag: Direktivenbasierte Programmierung von Beschleunigern mit Direktivenbasierte Programmierung von Beschleunigern mit Agenda Einführung / Motivation Überblick zu OpenMP und OpenACC Asynchronität
MehrMotivation (GP)GPU CUDA Zusammenfassung. CUDA und Python. Christian Wilms. Integriertes Seminar Projekt Bildverarbeitung
CUDA und Python Christian Wilms Integriertes Seminar Projekt Bildverarbeitung Universität Hamburg WiSe 2013/14 12. Dezember 2013 Christian CUDA und Python 1 Gliederung 1 Motivation 2 (GP)GPU 3 CUDA 4 Zusammenfassung
MehrParallele Algorithmen mit OpenCL. Universität Osnabrück, Henning Wenke,
Parallele Algorithmen mit OpenCL Universität Osnabrück, Henning Wenke, 2013-04-17 Kapitel I OpenCL Einführung Allgemeines Open Compute Language: API für einheitliche parallele Programmierung heterogener
MehrOpenMP. Viktor Styrbul
OpenMP Viktor Styrbul Inhaltsverzeichnis Was ist OpenMP Warum Parallelisierung Geschichte Merkmale von OpenMP OpenMP-fähige Compiler OpenMP Ausführungsmodell Kernelemente von OpenMP Zusammenfassung Was
MehrIDS Lizenzierung für IDS und HDR. Primärserver IDS Lizenz HDR Lizenz
IDS Lizenzierung für IDS und HDR Primärserver IDS Lizenz HDR Lizenz Workgroup V7.3x oder V9.x Required Not Available Primärserver Express V10.0 Workgroup V10.0 Enterprise V7.3x, V9.x or V10.0 IDS Lizenz
MehrIntroduction to Python. Introduction. First Steps in Python. pseudo random numbers. May 2016
to to May 2016 to What is Programming? All computers are stupid. All computers are deterministic. You have to tell the computer what to do. You can tell the computer in any (programming) language) you
MehrArchitekturen von Multi- und Manycore-Prozessoren
Architekturen von Multi- und Manycore-Prozessoren Johannes Hofmann Einführungsveranstaltung, 12.04.2016 Inhalt Es gibt zwei Varianten zum absolvieren des Seminars: Evaluation eines Benchmarks aus der Mantevo-Suite
Mehr2. Der ParaNut-Prozessor "Parallel and more than just another CPU core"
2. Der ParaNut-Prozessor "Parallel and more than just another CPU core" Neuer, konfigurierbarer Prozessor Parallelität auf Daten- (SIMD) und Thread-Ebene Hohe Skalierbarkeit mit einer Architektur neues
MehrThinkStation P-Series Anwendungsbreiche
39 ThinkStation P-Series Anwendungsbreiche Thinkstation Vertikale Lösungen Öl & Gas Produktentwicklung Media & Entertainment Finanz, Wertpapierhandel Medizin & Forschung 40 2014 LENOVO INTERNAL. ALL RIGHTS
MehrCoupling GIS and hydraulics using the example of the Dornbirnerach
Coupling GIS and hydraulics using the example of the Dornbirnerach Michaela Jud Department for Geoinformatics Technical University of Munich (TUM), Germany San Diego, 13 th of July 2011 Storm event august
MehrDatenflussrechnen mit FPGAs für die biomedizinische Bildverarbeitung
Datenflussrechnen mit FPGAs für die biomedizinische Bildverarbeitung Frederik Grüll, Udo Kebschull Infrastruktur und Rechnersysteme in der Informationsverarbeitung Goethe-Universität Frankfurt ZKI-Frühjahrstagung
MehrDigitale Farbbildverarbeitung mit der GPU
4. Kollaboration Forum NEMO-SpectroNet Digitale Farbbildverarbeitung mit der GPU Dipl.-Ing. (FH) Peter Keppler Vertriebsleiter Systemlösungen PORTRAIT STEMMER IMAGING Bildverarbeitung mit Mehrwert. STEMMER
MehrEinführung in die Programmiersprache C
Einführung in die Programmiersprache C 6 Cache-freundliche Programmierung (1) Alexander Sczyrba Robert Homann Georg Sauthoff Universität Bielefeld, Technische Fakultät Quadratische Matrizen Musterlösung
MehrEinführung in die Programmierung Wintersemester 2016/17
Einführung in die Programmierung Wintersemester 2016/17 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund : Gültigkeitsbereiche Inhalt Lokale und globale
MehrSoftware Engineering für moderne, parallele Plattformen
Software Engineering für moderne, parallele Plattformen b. Ergänzungen zur Performanz Dr. Victor Pankratius Dr. Victor Pankratius IPD Lehrstuhl für Programmiersysteme-Tichy KIT die Kooperation von Forschungszentrum
MehrMulticore-Architekturen
Universität Erlangen- Nürnberg Technische Universität München Universität Stuttgart Multicore-Architekturen Vortrag im Rahmen der Ferienakademie 2009 Kurs 1: Programmierkonzepte für Multi-Core Rechner
MehrThema: Hardware-Shader
Seminar Grafikprogrammierung Thema: Hardware-Shader Christian Bauer 03.07.08 Überblick Entwicklung Die Shader im Detail Programmierung GPGPU Zusammenfassung & Ausblick 1/19 Entwicklung (1) Früher: Berechnung
MehrTransparente Nutzung von Multi-GPU Cluster unter Java/OpenMP
Transparente Nutzung von Multi-GPU Cluster unter Java/OpenMP Dipl. Inf. Thorsten Blaß Programming Systems Group Martensstraße 3 91058 Erlangen Ausblick Motivation Einführung Java/OpenMP (JaMP) JaMP Sprache
MehrDiplomarbeit. Neue Möglichkeiten durch programmierbare Shader. Unter der Leitung von: Prof. Dr.-Ing. Detlef Krömker
Diplomarbeit 5HDO7LPH6SHFLDO (IIHFWV Neue Möglichkeiten durch programmierbare Shader Unter der Leitung von: Prof. Dr.-Ing. Detlef Krömker Betreut von: Paul Grimm, Ralf Dörner Beginn: 01.04.02 Abgabe: 30.09.02
MehrABSCHLUSSARBEIT FAKULTÄT INFORMATIK UND WIRTSCHAFTSINFORMATIK SEMI-GLOBAL MATCHING IN O PENCL
ABSCHLUSSARBEIT FAKULTÄT INFORMATIK UND WI RTSC HAFT SINFOR MATIK SEMI-GLOBAL MATCHING IN OPENCL ERKLÄRUNG Kurzfassung Abstract Inhaltsverzeichnis 1 EINFÜHRUNG... 1 2 THEORETISCHE GRUNDLAGEN... 3 3 IMPLEMENTIERUNG...
MehrProgrammierung von Many-Cores. Seminar: Software Engineering für Exascale Computing
Programmierung von Many-Cores Seminar: Software Engineering für Exascale Computing Patrizia Peller April 18, 2013 Programmierung von Many-Cores Hardware-Architekturen Anforderungen an Programmiersprachen
MehrInformatik 1 ( ) D-MAVT F2010. Schleifen, Felder. Yves Brise Übungsstunde 5
Informatik 1 (251-0832-00) D-MAVT F2010 Schleifen, Felder Nachbesprechung Blatt 3 Aufgabe 1 ASCII... A > a Vorsicht: Lösen Sie sich von intuitiven Schlussfolgerungen. A ist nicht grösser als a, denn in
MehrCUDA. Jürgen Pröll. Multi-Core Architectures and Programming. Friedrich-Alexander-Universität Erlangen-Nürnberg Jürgen Pröll 1
CUDA Jürgen Pröll Multi-Core Architectures and Programming Jürgen Pröll 1 Image-Resize: sequentiell resize() mit bilinearer Interpolation leicht zu parallelisieren, da einzelne Punkte voneinander unabhängig
MehrEinführung in die Programmierung
: Inhalt Einführung in die Programmierung Wintersemester 2010/11 Lokale und globale Variablen Namensräume Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund
MehrANALYSE DER LATENZEN IM KOMMUNIKATIONSSTACK EINES PCIE-GEKOPPELTEN FPGA-BESCHLEUNIGERS. Sascha Kath
ANALYSE DER LATENZEN IM KOMMUNIKATIONSSTACK EINES PCIE-GEKOPPELTEN FPGA-BESCHLEUNIGERS Sascha Kath Dresden, Gliederung 1. Motivation & Zielstellung 2. Systembeschreibung 3. Implementierung und Messungen
MehrIndustrial USB3.0 Miniature Camera with color and monochrome sensor
Welcome to the presentation Industrial USB3.0 Miniature Camera with color and monochrome sensor & Data rates of modern image sensors S. 1/12 Vortrag_Spectronet_USB3.0_Datenverarbeitung_ENGLISCH_Vorlage_für_pdf_v1_MH20032014
MehrTHE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic
THE GO PROGRAMMING LANGUAGE Part 1: Michael Karnutsch & Marko Sulejic Gliederung Geschichte / Motivation Compiler Formatierung, Semikolons Variablen, eigene Typen Kontrollstrukturen Funktionen, Methoden
MehrProbeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten
Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, 13.00-14.45 Uhr Bearbeitungszeit: 105 Minuten Schalten Sie ihr Mobiltelefon aus. Bei der Klausur ist als einziges
MehrUniversität Karlsruhe (TH)
Universität Karlsruhe (TH) Forschungsuniversität gegründet 5 Software Engineering für moderne, parallele Plattformen b. Ergänzungen zur Performanz Dr. Victor Pankratius Agenda Das Roofline Model [Williams
MehrÜbersicht. Speichertypen. Speicherverwaltung und -nutzung. Programmieren in C
Übersicht Speichertypen Speicherverwaltung und -nutzung Speichertypen Beim Laden eines Programms in den Speicher (Programmausführung) kommen 3 verschiedene Speicherbereiche zum Einsatz: Text Segment (Code
Mehr