Librería Thrust Clase 5 http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases Thrust ● ● ● Vectors Iterators and Static Dispatching Algorithms – Transformations ● ● – Reductions – Prefix-Sums ● – Reordering ● – Sorting – Etc. Repaso, y un poco de C++ Fancy Iterators – constant_iterator – transform_iterator – permutation_iterator – zip_iterator Best Practices Thrust 1.8 ¿ Que es Thrust ? http://thrust.github.io/ excelente documentación, muchos ejemplos Repaso de Thrust Hasta aqui... Un poco de C++ Function Templates Functors Generic Algorithms Algoritmos, tipos y operadores Operadores predefinidos Ejemplo de “device backends” y reducción con operador personalizado ● Tareas: – hacer la suma de N numeros random, usando thrust::generate y thrust::reduce [LISTO]. – Encontrar el mínimo de N numeros random, usando thrust::generate y thrust::reduce. device_backends.cu [koltona@compute-0-0 intro_thrust]$ more device_backends_compilation.sh nvcc -Xcompiler -fopenmp device_backends.cu -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_CPP -o cpp.out nvcc -Xcompiler -fopenmp device_backends.cu -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_CUDA -o cuda.out nvcc -Xcompiler -fopenmp device_backends.cu -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP -o omp.out qsub submit_cuda.sh qsub submit_omp.sh qsub submit_cpp.sh Operadores propios comparadores Predicados Fancy Iterators – constant_iterator – transform_iterator – permutation_iterator – zip_iterator Quick-Start-Guide THRUST Fancy Iterators constant_iterator Simplemente un iterador que retorna el mismo valor, que uno define, cada vez que uno lo dereferencia: #include <thrust/iterator/constant_iterator.h> ... // create iterators thrust::constant_iterator<int> first(10); thrust::constant_iterator<int> last = first + 3; first[0] // returns 10 first[1] // returns 10 first[100] // returns 10 // sum of [first, last) thrust::reduce(first, last); // returns 30 (i.e. 3 * 10) constant_iterator es una solución eficiente y conveniente cada vez que uno necesita una secuencia de valores constantes. Quick-Start-Guide THRUST Fancy Iterators transform_iterator Nos permite hacer “Kernel Fusion”: combinar dos algoritmos en uno solo, como hace transform_reduce, pero mas customizado: #include <thrust/iterator/transform_iterator.h> // initialize vector thrust::device_vector<int> vec(3); vec[0] = 10; vec[1] = 20; vec[2] = 30; // create iterator (type omitted) ... first = thrust::make_transform_iterator(vec.begin(), negate<int>()); ... last = thrust::make_transform_iterator(vec.end(), negate<int>()); first[0] // returns -10 first[1] // returns -20 first[2] // returns -30 // sum of [first, last) thrust::reduce(first, last); // returns -60 (i.e. -10 + -20 + -30) Se puede omitir la declaracion de los iteradores: // sum of [first, last) thrust::reduce(thrust::make_transform_iterator(vec.begin(), negate<int>()), thrust::make_transform_iterator(vec.end(), negate<int>())); Quick-Start-Guide THRUST Fancy Iterators permutation_iterator #include <thrust/iterator/permutation_iterator.h> ... // gather locations thrust::device_vector<int> map(4); Map[0] = 3; map[1] = 1; map[2] = 0; map[3] = 5; // array to gather from thrust::device_vector<int> source(6); source[0] = 10; source[1] = 20; source[2] = 30; source[3] = 40; source[4] = 50; source[5] = 60; // fuse gather with reduction: // sum = source[map[0]] + source[map[1]] + ... int sum = thrust::reduce(thrust::make_permutation_iterator(source.begin(), map.begin()),thrust::make_permutation_iterator(source.begin(), map.end())); Nos permite fusionar scatter y gather Quick-Start-Guide THRUST Aplicacion del permutation iterator Imagen “encriptada” Imagen “desencriptada” Los pixels estan mezclados usando un mapeo dado... [FINAL ICNPG2014] Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Kernel Fusion [koltona@gpgpu-fisica ejemplos]$ cp /share/apps/codigos/thrust_examples/xxxxx.cu . [koltona@gpgpu-fisica ejemplos]$ nvcc xxxxx.cu [koltona@gpgpu-fisica ejemplos]$ qsub script.sh [koltona@gpgpu-fisica ejemplos]$ more script.sh #! /bin/bash # #$ -cwd #$ -j y #$ -S /bin/bash ## pido la cola gpu.q #$ -q gpu.q ## pido una placa #$ -l gpu=1 # #ejecuto el binario ./a.out hacerenclase.cu Con transform_reduce, o transform_iterator Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Ejemplos de la librería [koltona@gpgpu-fisica ejemplos]$ cp /share/apps/codigos/thrust_examples/xxxxx.cu . [koltona@gpgpu-fisica ejemplos]$ nvcc xxxxx.cu [koltona@gpgpu-fisica ejemplos]$ qsub script.sh [koltona@gpgpu-fisica ejemplos]$ more script.sh #! /bin/bash # #$ -cwd #$ -j y #$ -S /bin/bash ## pido la cola gpu.q #$ -q gpu.q ## pido una placa #$ -l gpu=1 # #ejecuto el binario ./a.out sorting_aos_vs_soa.cu Thrust Best Practices Thrust by Example, GTC, Julien Demouth, Nvidia Ejemplos de la librería [koltona@gpgpu-fisica ejemplos]$ cp /share/apps/codigos/thrust_examples/xxxxx.cu . [koltona@gpgpu-fisica ejemplos]$ nvcc xxxxx.cu [koltona@gpgpu-fisica ejemplos]$ qsub script.sh [koltona@gpgpu-fisica ejemplos]$ more script.sh #! /bin/bash # #$ -cwd #$ -j y #$ -S /bin/bash ## pido la cola gpu.q #$ -q gpu.q ## pido una placa #$ -l gpu=1 # #ejecuto el binario ./a.out counting_iterator.cu permutation_iterator.cu Hibrid programming Using a system-specific vector Execution policies Ejemplo de execution policies alumnos_icnpg2015/intro_thrust/clase2/omp_vs_cuda/ompvsgpu_same_host.cu ● nvcc -Xcompiler -fopenmp ompvsgpu_same_host.cu ● qsub submit.sh ● Ver output... Using a system-specific vector Paralelismo de datos y de tareas CPU esperando... Paralelismo de datos y de tareas farber1-11_sync.cu alumnos_icnpg2015/intro_thrust/clase2/omp_vs_cuda/ompvsgpu_same_host.cu Paralelismo de datos y de tareas farber1-11_sync.cu farber1-11_async.cu PROBAR! Thrust 1.8 (el ultimo) Thrust v1.8.0 release We are pleased to announce the release of Thrust v1.8, an open-source C++ library for developing high-performance parallel applications. Modeled after the C++ Standard Template Library, Thrust brings a familiar abstraction layer to the realm of parallel computing. Thrust 1.8.0 (viene incluido con CUDA 7): support for algorithm invocation from CUDA __device__ code support for CUDA streams Algorithm performance improvements thrust::complex template provides complex number support . Volveremos con Thrust despues de unas clases...
© Copyright 2025 ExpyDoc