Paralelismo en C++
Paralelismo en C++Parallel STL y más allá
Luis Miguel Sá[email protected]
Universidad Carlos III de Madrid
18 de noviembre de 2015
cbed Luis Miguel Sánchez. ARCOS@uc3m 1/47
Paralelismo en C++¿Qué es paralelismo?
1 ¿Qué es paralelismo?
2 STL: Standard Template Library
3 Parallel STL
4 ¿Y ahora que más?
cbed Luis Miguel Sánchez. ARCOS@uc3m 2/47
Paralelismo en C++¿Qué es paralelismo?
Concurrencia vs. Paralelismo
cbed Luis Miguel Sánchez. ARCOS@uc3m 3/47
Paralelismo en C++¿Qué es paralelismo?
¿Cómo funciona el paralelismo?
cbed Luis Miguel Sánchez. ARCOS@uc3m 4/47
Fuente: https://en.wikipedia.org/wiki/OpenMP
Paralelismo en C++¿Qué es paralelismo?
Vectorización
cbed Luis Miguel Sánchez. ARCOS@uc3m 5/47
Fuente: https://software.intel.com/en-us/blogs/2012/01/31/vectorization-find-out-what-it-is-find-out-more
Paralelismo en C++¿Qué es paralelismo?
Ley de Moore
cbed Luis Miguel Sánchez. ARCOS@uc3m 6/47
Fuente: http://education.mrsec.wisc.edu/SlideShow/slides/computer/Moores_Law.html
Paralelismo en C++¿Qué es paralelismo?
Free lunch is over - Herb Sutter (2004)
cbed Luis Miguel Sánchez. ARCOS@uc3m 7/47
Paralelismo en C++¿Qué es paralelismo?
Temperatura alcanzada por un procesador
cbed Luis Miguel Sánchez. ARCOS@uc3m 8/47
Can soon put more transistors on a chip than canafford to turn on. - Patterson 2007
Paralelismo en C++¿Qué es paralelismo?
Temperatura alcanzada por un procesador
cbed Luis Miguel Sánchez. ARCOS@uc3m 8/47
Can soon put more transistors on a chip than canafford to turn on. - Patterson 2007
Paralelismo en C++¿Qué es paralelismo?
¿Y cómo utilizo el paralelismo en C++?
Frameworks basados en directivas #pragma.OpenMP, OpenACC, OpenSS, etc.
Bibliotecas externasTBB, Cilk Plus, PPL, Fast-Flow, SYCL, etc.
Biblioteca estándar STL paralelas.
cbed Luis Miguel Sánchez. ARCOS@uc3m 9/47
Paralelismo en C++STL: Standard Template Library
1 ¿Qué es paralelismo?
2 STL: Standard Template Library
3 Parallel STL
4 ¿Y ahora que más?
cbed Luis Miguel Sánchez. ARCOS@uc3m 10/47
Paralelismo en C++STL: Standard Template Library
Standard Template Library (STL)
Originalmente diseñada por Alexander Stepanov.Objetivo original: “la representación más general, máseficiente y más flexible de conceptos”.
Representar conceptos separados de forma separada en elcódigo.Combinar conceptos libremente siempre que tenga sentido.
Modelo básico:Contenedores: Estructuras que almacenan datos.Iteradores: Permite recorrer contenedores.Algoritmos: Manipulan datos independientemente decontenedores.
cbed Luis Miguel Sánchez. ARCOS@uc3m 11/47
Paralelismo en C++STL: Standard Template Library
Algoritmos en STL
Gran variedad: 90 algoritmos.
Clasificación:De secuencia: Modificación y no-modificación.Particionamiento, ordenación y búsqueda binaria.Operaciones de conjunto y montículo.Operaciones de mínimo y máximo.Operaciones numéricas.
cbed Luis Miguel Sánchez. ARCOS@uc3m 12/47
Paralelismo en C++STL: Standard Template Library
Ejemplos de uso de las STL
Aplica un objeto función a cada elemento de una secuencia.
vector<int> v{1,2,3,4,5,6,7,8};for_each(begin(v), end(v), [](int x) {
cout << x;});
Transforma una secuencia en otra aplicando una operación
vector<int> v{1,2,3,4,5,6,7,8};vector<int> w;transform(begin(v), end(v), back_inserter(w),
[](int x) {return x*x});vector<int> z;transform(begin(v), end(v), begin(w), end(w),
back_inserter(z),[](int x, int y) { return x+y; });
cbed Luis Miguel Sánchez. ARCOS@uc3m 13/47
Paralelismo en C++Parallel STL
1 ¿Qué es paralelismo?
2 STL: Standard Template Library
3 Parallel STL
4 ¿Y ahora que más?
cbed Luis Miguel Sánchez. ARCOS@uc3m 14/47
Paralelismo en C++Parallel STL
Parallel STL roadmap
cbed Luis Miguel Sánchez. ARCOS@uc3m 15/47
Fuente: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0024r0.html
Paralelismo en C++Parallel STL
Trabajos anteriores a la especificación
Thrusthttp://thrust.github.io
Boost.Computehttp://github.com/boostorg/compute
Bolthttp://github.com/HSA-Libraries/Bolt
libstdc++ Parallel Modehttp://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html
AMP Algorithms Libraryhttp://ampalgorithms.codeplex.com
cbed Luis Miguel Sánchez. ARCOS@uc3m 16/47
Paralelismo en C++Parallel STL
¿Qué algoritmos se incluyen?
cbed Luis Miguel Sánchez. ARCOS@uc3m 17/47
Fuente: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4507.pdf
Paralelismo en C++Parallel STL
Versiones de algoritmos
Todos los algoritmos paralelos toman como primer parámetrouna política de ejecución.
Ejemplo: ordenando un vector
using namespace std;vector<double> v = read_values();sort(v.begin(), v.end());
using namespace std::experimental::parallel;
sort(seq, v.begin(), v.end()); // Secuencialsort(par, v.begin(), v.end()); // Paralelosort(par_vec, v.begin(), v.end()); // Paralelo+Vect
cbed Luis Miguel Sánchez. ARCOS@uc3m 18/47
Paralelismo en C++Parallel STL
Politicas de ejecución
Una Política de ejecución indica el tipo de paralelismo quese permite en la ejecución de un algoritmo.
Secuencial: Sin paralelizar.Tipo: sequential_execution_policy.Objeto global: seq.
Paralelo: Paralelizado.Tipo: parallel_execution_policy.Objeto global: par.
Paralelo + Vector: Paralelizado y vectorizado.Tipo: parallel_vector_execution_policy.Objeto global: par_vec.Importante: no existe vec.
Dinámica: Puede contener cualquier política.Tipo: execution_policy.No hay objeto global.
cbed Luis Miguel Sánchez. ARCOS@uc3m 19/47
Paralelismo en C++Parallel STL
Política de ejecución dinámica
Ejemplo: cambiando de política
constexpr size_t threshold = 1000;std::vector v = read_values();
using namespace std::experimental::parallel;
execution_policy exec = seq;if (v.size() > threshold) {
exec = par;}sort(exec, begin(v), end(v));
cbed Luis Miguel Sánchez. ARCOS@uc3m 20/47
Paralelismo en C++Parallel STL
Ejemplos
Buscando una secuenciavector<int> v = get_values_vector();count_if(par, begin(v), end(v), [](int x) { return x>0; });auto p = find(par, begin(v), end(v), 0);auto q = find_if(par, begin(v), end(v), [](int x) {
return (x>0) && (x<10); }
Palindromoconst auto pal =
equal(par, begin(str), begin(str) + str.length()/2, str.rbegin());
cbed Luis Miguel Sánchez. ARCOS@uc3m 21/47
Paralelismo en C++Parallel STL
Algoritmos no paralelizados
De busqueda binaria (std::binary_search)De monticulo (std::sort_heap)De permutación (std::prev_permutation)De desplazamiento (std::random_shuffle)Numéricos secuenciales (std::accumulate)
cbed Luis Miguel Sánchez. ARCOS@uc3m 22/47
Paralelismo en C++Parallel STL
Más algoritmos: no numéricos
Son algoritmos que no requieren que los valores accedidos porlos iteradores sean de un tipo numérico.
Más generales que los algoritmos numéricos.Algoritmos:
for_each().for_each_n().
cbed Luis Miguel Sánchez. ARCOS@uc3m 23/47
Paralelismo en C++Parallel STL
For Each
Ejemplo
long cuenta_primos(const vector<int> & v) {std::atomic<long> count;for_each(par, begin(v), end(v), [&](int x) {
if (esprimo(x)) { count++; }});return count;
}
cbed Luis Miguel Sánchez. ARCOS@uc3m 24/47
Paralelismo en C++Parallel STL
Más algoritmos: numéricos
Orientados a secuencias numéricas.Algoritmos:
reduce: similar a std::accumulate, excepto que se ejecutafuera de ordenexclusive_scan: similar a std::partial_sum, excluyendo alelemento i-esimo de la i-esima suma.inclusive_scan: similar a std::partial_sum, incluyendo alelemento i-esimo en la i-esima suma.transform_reduce: aplica una funcion a todos los elementos yluego realiza una redución.transform_exclusive_scan: aplica una funcion a todos loselementos y luego realiza una operacion de scan excluyente.transform_inclusive_scan: aplica una funcion a todos loselementos y luego realiza una operacion de scan incluyente.
También se añaden las versiones sin parámetro de política.cbed Luis Miguel Sánchez. ARCOS@uc3m 25/47
Paralelismo en C++Parallel STL
Algoritmos numéricos
reduceresult = init + a[0] + a[1] + ... + a[N-1]
exclusive_scan
result[i] = init + a[0] + a[1] + ... + a[i-1]
inclusive_scan
result[i] = init + a[0] + a[1] + ... + a[i]
cbed Luis Miguel Sánchez. ARCOS@uc3m 26/47
Paralelismo en C++Parallel STL
Ejemplos algoritmos numéricos
reducereduce(begin(v), end(v), 0, [](int a, int b) {
return a+b; });
Transform reduceauto suma_cuadrados = transform_reduce(begin(v), end(v),
[](double x) { return x * x; },0,[](double x, double y) { return x + y; }
);
cbed Luis Miguel Sánchez. ARCOS@uc3m 27/47
Paralelismo en C++Parallel STL
¡Cuidado con el paralelismo!Que se pueda ejecutar en paralelo no significa que siempre seaposible (Thread-safe).
Condiciones de carreradeadlocks
Ejemplo 1
int comparisons = 0;std::sort(begin, end,
[&](int a, int b) { comparisons++; return a < b; });
Ejemplo 2
int a[] = {0,1};std::vector<int> v;for_each(par, std::begin(a), std::end(a), [&](int i) {
v.push_back(i*2+1);});
Algunos algoritmos no se pueden paralelizar por definición(e.g. std::accumulate)
cbed Luis Miguel Sánchez. ARCOS@uc3m 28/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo sequencial
int x=0;int a[] = {1,2};for_each(seq, std::begin(a), std::end(a), [&](int) {
++x;});
OK: acceso secuencial
cbed Luis Miguel Sánchez. ARCOS@uc3m 29/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo sequencial
int x=0;int a[] = {1,2};for_each(seq, std::begin(a), std::end(a), [&](int) {
++x;});
OK: acceso secuencial
cbed Luis Miguel Sánchez. ARCOS@uc3m 29/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo politica paralela
int x=0;int a[] = {1,2};for_each(par, std::begin(a), std::end(a), [&](int) {
++x;});
Error: accesos no controlados a una variable compartida.
cbed Luis Miguel Sánchez. ARCOS@uc3m 30/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo politica paralela
int x=0;int a[] = {1,2};for_each(par, std::begin(a), std::end(a), [&](int) {
++x;});
Error: accesos no controlados a una variable compartida.
cbed Luis Miguel Sánchez. ARCOS@uc3m 30/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo paralelo con bloqueos
int x=0;std::mutex m;int a[] = {1,2};for_each(par, std::begin(a), std::end(a), [&](int) {
m.lock();++x;m.unlock();
});
OK: acceso exclusivo para modificar las variables compartidas.
cbed Luis Miguel Sánchez. ARCOS@uc3m 31/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo paralelo con bloqueos
int x=0;std::mutex m;int a[] = {1,2};for_each(par, std::begin(a), std::end(a), [&](int) {
m.lock();++x;m.unlock();
});
OK: acceso exclusivo para modificar las variables compartidas.
cbed Luis Miguel Sánchez. ARCOS@uc3m 31/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo paralelo vectorizado
int x=0;std::mutex m;int a[] = {1,2};for_each(par_vec, std::begin(a), std::end(a), [&](int) {
m.lock();++x;m.unlock();
});
Error: El código del algoritmo no garantiza que pueda serejecutado en diferentes hilos de ejecución.
cbed Luis Miguel Sánchez. ARCOS@uc3m 32/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo paralelo vectorizado
int x=0;std::mutex m;int a[] = {1,2};for_each(par_vec, std::begin(a), std::end(a), [&](int) {
m.lock();++x;m.unlock();
});
Error: El código del algoritmo no garantiza que pueda serejecutado en diferentes hilos de ejecución.
cbed Luis Miguel Sánchez. ARCOS@uc3m 32/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo paralelo vectorizado con atomicos
std::atomic<int> x=0;
int a[] = {1,2};for_each(par_vec, std::begin(a), std::end(a), [&](int) {
++x;});
OK: acceso atómico a los datos.
cbed Luis Miguel Sánchez. ARCOS@uc3m 33/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo paralelo vectorizado con atomicos
std::atomic<int> x=0;
int a[] = {1,2};for_each(par_vec, std::begin(a), std::end(a), [&](int) {
++x;});
OK: acceso atómico a los datos.
cbed Luis Miguel Sánchez. ARCOS@uc3m 33/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo mejorado
int x = count_if(par_vec, ...);
OK: Usando algoritmos de alto nivel optimizados.
cbed Luis Miguel Sánchez. ARCOS@uc3m 34/47
Paralelismo en C++Parallel STL
¡Cuidado con las politicas de ejecución!
Ejemplo mejorado
int x = count_if(par_vec, ...);
OK: Usando algoritmos de alto nivel optimizados.
cbed Luis Miguel Sánchez. ARCOS@uc3m 34/47
Paralelismo en C++Parallel STL
Implementaciones STL paralela
Microsofthttp://parallelstl.codeplex.com
HPXhttp://stellar-group.github.io/hpx/docs/html/hpx/manual/parallel.html
Codeplayhttp://github.com/KhronosGroup/SyclParallelSTL
HSAhttp://www.hsafoundation.com/hsa-for-math-science
Thibaut Lutzhttp://github.com/t-lutz/ParallelSTL
NVIDIAhttp://github.com/n3554/n3554
cbed Luis Miguel Sánchez. ARCOS@uc3m 35/47
Paralelismo en C++Parallel STL
WordCount (I)
Cuenta el número de apariciones de cada palabra de unfichero de texto dado.Ejemplo típico en aplicaciones basadas en el paradigmaMapReduce.Hace uso de algoritmos de alto nivel:
TransformReduce
cbed Luis Miguel Sánchez. ARCOS@uc3m 36/47
Paralelismo en C++Parallel STL
WordCount (II)
Parallel Transformvector<string> palabras;vector<map<string, long>> v;map<string, long> r;...// Fase MAPstd::experimental::parallel::transform(std::experimental::parallel::
par,begin(palabras), end(palabras),back_inserter(v),
[](string s) {char chars[] = ",.;:()!?’";for (auto i : chars) s.erase(std::remove(s.begin(), s.end(), i),
s.end());map<string, long> r;r[s] = 1L;return r;
});
cbed Luis Miguel Sánchez. ARCOS@uc3m 37/47
Paralelismo en C++Parallel STL
WordCount (y III)
Parallel Reduce// Fase REDUCEr = std::experimental::parallel::reduce(std::experimental::parallel::par
,v.begin(), v.end(), std::map<string, long>(),[](map<string, long> x, map<string, long> y) {
for (auto & z : y) { x[z.first] += z.second; }return x;
});
cbed Luis Miguel Sánchez. ARCOS@uc3m 38/47
Paralelismo en C++¿Y ahora que más?
1 ¿Qué es paralelismo?
2 STL: Standard Template Library
3 Parallel STL
4 ¿Y ahora que más?
cbed Luis Miguel Sánchez. ARCOS@uc3m 39/47
Paralelismo en C++¿Y ahora que más?
Lista de deseos para el paralelismo en C++
Soporte acceleradores (GPU)Paralelismo de tareasPatrones de diseño paralelos
cbed Luis Miguel Sánchez. ARCOS@uc3m 40/47
Paralelismo en C++¿Y ahora que más?
Welcome to the jungle - Herb Sutter (2011)
cbed Luis Miguel Sánchez. ARCOS@uc3m 41/47Fuente: http://herbsutter.com/welcome-to-the-jungle/
Paralelismo en C++¿Y ahora que más?
¡Ahora vas y lo implementas!
Ejemplos
sort(vectorize_in_this_thread, vec.begin(), vec.end());sort(submit_to_my_thread_pool, vec.begin(), vec.end());sort(execute_on_that_gpu, vec.begin(), vec.end());sort(offload_to_my_fpga, vec.begin(), vec.end());sort(send_to_the_cloud, vec.begin(), vec.end());sort(launder_through_botnet, vec.begin(), vec.end());sort(this_thread::par, data.begin(), data.end());sort(this_thread::vec, data.begin(), data.end());
my_executor my_exec = ...;std::sort(par.on(my_exec), data.begin(), data.end());
Fuentes:Parallelizing the Standard Algorithms Library - Jared Hoberock (NVIDIA)Parallel Algorithms Need Executors (N4406)
cbed Luis Miguel Sánchez. ARCOS@uc3m 42/47
Paralelismo en C++¿Y ahora que más?
Paralelismo de tareas
Quicksort: secuencial
void quicksort( int *v,int start, int end) {
if (start < end) {int pivot = partition(v, start, end);quicksort(v, start, pivot - 1);quicksort(v, pivot + 1, end);
}}
cbed Luis Miguel Sánchez. ARCOS@uc3m 43/47
Paralelismo en C++¿Y ahora que más?
Paralelismo de tareas
Quicksort: std::threads
void quicksort(int *v, int start, int end) {if (start < end) {
int pivot = partition(v, start, end);std::thread t1([&] {
quicksort(v, start, pivot - 1);});std::thread t2([&] {
quicksort(v, pivot + 1, end);});t1.join();t2.join();
}}
cbed Luis Miguel Sánchez. ARCOS@uc3m 44/47
Paralelismo en C++¿Y ahora que más?
Paralelismo de tareas
Quicksort: tareas (N3832)
void quicksort(int *v, int start, int end) {if (start < end) {
task_region([&] (auto& r) {int pivot = partition(v, start, end);r.run([&] {
quicksort(v, start, pivot - 1);});r.run([&] {
quicksort(v, pivot + 1, end);});
});}
}
Fuente: Parallelism in the Standard C++: What to Expect in C++ 17 - Artur Laksberg
cbed Luis Miguel Sánchez. ARCOS@uc3m 45/47
Paralelismo en C++¿Y ahora que más?
Patrones de diseño paralelos
cbed Luis Miguel Sánchez. ARCOS@uc3m 46/47
Fuente: http://parallelbook.com/
Paralelismo en C++¿Y ahora que más?
Paralelismo en C++Parallel STL y más allá
Luis Miguel Sá[email protected]
Universidad Carlos III de Madrid
18 de noviembre de 2015
cbed Luis Miguel Sánchez. ARCOS@uc3m 47/47
Top Related