CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Bloque IV Prácticas de programación en CUDA David Miraut Marcos García Ricardo Suárez.

Slides:



Advertisements
Presentaciones similares
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Introducción a C Sistemas Operativos.
Advertisements

INTRODUCCIÓN A WINDOWS
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Introducción a C Sistemas Operativos.
Instalación del JDK de Java
CLASE 4 EL ENSAMBLADOR.
Programando con OpenMP*
Contenidos 1.Cómo ingresar 2.Cómo crear un nuevo sitio 3.Editar plantilla de página principal 4.Edición de páginas 5.Crear página nueva 6.Estructura del.
COLEGIO DE BACHILLERES PLANTEL 13 XOCHIMILCO-TEPEPAN MATERIA:TIC EQUIPO:23 PRESENTACION: BASE DE DATOS ALUMNAS: Velazquez Corona Elsa Ponciano Antonio.
Presentación y organización del curso
Diseñar un sistema que permita al usuario desde un teléfono móvil acceder a su computador personal (o servidor) a través de WAP para administrar algunos.
Programación I Teoría III
Programación, Algoritmos y Estructuras de Datos
Definición y Características
Optimización de aplicaciones
Systems Management Server 2003 Santiago Pastor Zaltor Soluciones Informáticas.
Programación en C (Segunda Parte) DATSI, FI, UPM José M. Peña
Es un Sistema operativo de red. Es una de las plataformas de servicio más fiable para ofrecer acceso seguro y continuado a la red y los recursos de.
Programación con restricciones
Índice Sesión I Bloque I (09:30 a 10:30 Horas) Configuración Inicial
Unidad 3 Punteros.
Ingeniero Anyelo Quintero
HILOS Y COMUNICACIÓN ENTRE PROCESOS
ATC-DistribuidasUniversidad de Oviedo / Dpto. de Informática Programación con OSF RPC y Microsoft RPC.
Sistema Operativo. ¿Qué es el Sistema Operativo? Un sistema operativo (SO) es el conjunto de programas y utilidades software que permiten al usuario interactuar.
Tema 10: Gestión de Memoria
Estructura de un programa en C
Unidad III Administración de procesos
Archivos.
Tema 10a Manejo de archivos. Introducción Un computador puede almacenar grandes cantidades de información. Puede acceder a ella de manera muy rápida.
Clase 10: Estructuras de datos y arreglos.
ASP.NET es una nueva y potente tecnología para escribir páginas web dinámica. Es una importante evolución respecto a las antiguas páginas ASP de Microsoft.
Manejo de Memoria en CUDA (I)
Tema 10.3: Asignación de Espacio No Contiguo. Tema 10.3: 2 Silberschatz, Galvin and Gagne ©2005 Fundamentos de los Computadores (ITT, Sist. Electr.),
Asignación de Espacio No Contiguo
Estructura del sistema de Archivos de
ARQUITECTURA CUDA Integrantes: Jose D Apollo
Michael Ángelo De Lancer Franco Michael Ángelo De Lancer Franco
© 2012 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. Adobe Acrobat XI.
Hebras Cecilia Hernández. Qué es un proceso? Consiste Espacio de direccionamiento Código a ejecutar Datos estáticos y dinámicos Pila o stack CPU: PC,
Aula Virtual para alumnos
Alejandro Samarín Lionel Aster Mena García Sergio Armas Pérez.
Capítulo 7 Gestión de memoria.
Publicación de bases de datos Access en la web
Unidad II Introducción a la programación en C++
Bibliotecas Nacen a partir de la necesidad de la compilación por módulos. Lo cual consiste en separar el programa principal de aquellas funciones que se.
VI. Administración de Dispositivos (2)
Alejandro Samarín Lionel Aster Mena García Sergio Armas Pérez.
Gestión de Memoria.
Teoría de Sistemas Operativos Administración de Archivos.
S.O. WINDOWS SERVER 2003.
Supongamos que un usuario desea escribir un informe e imprimirlo en una impresora conectada. Para realizar esta tarea, se precisa una aplicación de procesamiento.
Estructura de los Sistemas Operativos
COLEGIO DE BACHILLERES PLANTEL 13 XOCHIMILCO-TEPEPAN MATERIA:TIC EQUIPO:21 PRESENTACION: BASE DE DATOS ALUMNAS: Adán Millán Sánchez.
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
Por: Ernesto Y. Soto Rivas G
Sistemas de Archivos Sistemas Operativos.  Se debe proporcionar un almacenamiento secundario que respalda a la memoria principal  El Sistema de archivos.
¿QUE SON LAS ACTUALIZACIONES?  Las actualizaciones son adiciones al software que pueden evitar problemas o corregirlos, mejorar el funcionamiento del.
INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS EN RED.
Unidad 7 Escritorio de Windows.
ESCULA NORMAL “PROFR. DARÍO RODRÍGUEZ CRUZ” LIC
UNIDAD 4: Introducción a la Lógica Computacional Objetivo : Interpretar y aplicar adecuadamente los fundamentos básicos de la estructura y funcionamiento.
OIS: Object's Indexed Serialiation Version Un sistema jerárquico de almacenamiento de objetos TOL de estructura arbitraria basado en ficheros binarios.
Programación de Videojuegos
También es conocido como proceso ligero. Es una entidad básica de utilización de CPU y esta formado por un contador de programa, algunos registros y una.
MEMORIA DINÁMICA.
PROCESADOR.- El procesador es el cerebro del sistema, encargado de procesar toda la información. Básicamente, es el "cerebro" de la computadora. Prácticamente,
Tema 1. Estructuras de datos Objetivo: Objetivo: El alumno resolverá problemas de almacenamiento, recuperación y ordenamiento de datos y las técnicas de.
Módulo 4: Administrar el acceso a recursos
ORDENADOR HARDWARE UNIDAD CENTRAL Microprocesador memoria PERIFÉRICOS Teclado, ratón, Escáner, Impresora, Webcam, lápiz, Etc. SOFTWARE SISTEMAS OPERATIVOS.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Transcripción de la presentación:

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Bloque IV Prácticas de programación en CUDA David Miraut Marcos García Ricardo Suárez

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Código

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows Documentación: DA_C_Getting_Started_Windows.pdf DA_C_Getting_Started_Windows.pdf Tarjetas compatibles: – Tarjetas desde la serie 8 – Algunas Quadro – Teslas – Página de Nvidia (Windows|Linux |Mac OS): – – Compatibilidad hacia atrás:

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows Descargar el driver – Driver de desarrollo XP (32|64) Vista y Windows 7 (32|64) Vista y Windows 7 (Notebooks) (32|64) – Driver de desarrollo vs driver gráfico Valen los 2 ( | ) Desarrollo: – El más antiguo en el que funciona el Toolkit – Soporta más dispositivos – Basado en la versión release – Instalar Driver

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows Toolkit 4.0 – Contiene: Cabeceras Librerías – GPU-accelerated BLAS library – GPU-accelerated FFT library – GPU-accelerated Sparse Matrix library – GPU-accelerated RNG library Herramientas – Visual Profiler Integración con Visual Studio – Variables de entorno –.rules – nvcc Otros recursos

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows Toolkit 4.0 – Versiones de 64 y 32 bits – Carpetas (C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0) Ejecutables para el compilador y herramientas (bin) Cabeceras (include) Ficheros de enlazado (bin) Documentación (doc) – Instalar Toolkit – Pasos Registro Instalación: típica, completa, personalizada

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows SDK – Proyectos listos para funcionar en Visual Studio – Directorio C:\Documents and Settings\All Users\Application Data\NVIDIA Corporation\NVIDIA GPU Computing SDK %ProgramData%\NVIDIA Corporation\NVIDIA GPU Computing SDK – Acceso Online: – CUTIL: librería de utilidades (Fuentes) – Instalar SDK – Pasos Registro Instalación: típica, completa, personalizada Crear acceso directo

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows Test – Ejecutar bandwidthTestbandwidthTest C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\bin\win32|64\Release C:\Documents and Settings\All Users\Application Data\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\bin\win32|64\Release – Proyectos [X]X C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src\bandwidthTest C:\Documents and Settings\All Users\Application Data\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src\bandwidthTest

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows Instalación en VS – Highlighting Copiar: usertype.dat – De [SDK_DIR]\NVIDIA GPU Computing SDK 4.0\C\doc\syntax_highlighting\visual_studio_8 – A [VISUAL_DIR]\Microsoft Visual Studio 8\Common7\IDE En Visual Studio: Herramientas -> Opciones -> Editor de Texto -> Extensión de archivo -> agregar.cu como MSVS C++ Reiniciar MSVS

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows Instalación VS – CUDA VS Wizard para VS2008 Crea el proyecto automáticamente 32 y 64 bits – No actualizado a la versión 4.0 [X]X – Hay que compilar CUTIL (Portabilidad y control de errores – No oficial) » Disponible en el SDK ($(NVSDKCOMPUTE_ROOT)\common\) » Mover las DLLs a la ruta ($(NVSDKCOMPUTE_ROOT)\common\bin) – Cambiar las propiedades del proyecto si se trabaja en 32 bits tanto en Release como en Debug (en todos los proyectos!!!!) » Vinculador -> Directorios de bibliotecas adicionales $(NVSDKCOMPUTE_ROOT)\common\lib\ por $(NVSDKCOMPUTE_ROOT)\common\lib\Win32

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows Instalación VS – Configuración de CUDA en VS from scratch (V2010) Crear un proyecto vacío (Win32 de consola vacío p.e.) Añadir las reglas de compilación a los archivos.CU – Botón derecho sobre el proyecto -> añadir reglas de generación – La primer vez: » Buscar existentes: $(CUDA_PATH)\extras\visual_studio_integration\rules » Añadir una asociada a *.cu (Runtime) – E.O.C. » Marcar la regla » Puede marcarse o utilizarse la regla del CUDA VS Wizard

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Instalación en Windows – Configuración de CUDA en VS from scratch (V2010) Añadir ficheros de inclusión: – Herramientas -> Opciones -> Proyectos y soluciones -> Directorios de VC++ -> En Archivos de inclusión » $(CUDA_INC_PATH) » $(NVSDKCOMPUTE_ROOT)\common\Inc\ – También se puede hacer en propiedades del proyecto -> CUDA Añadir librerías – Propiedades del proyecto -> Vinculador -> General -> Directorios de bibliotecas adicionales » $(CUDA_LIB_PATH) » $(NVSDKCOMPUTE_ROOT)\common\lib\Win32 En VS2010 Añadir el parche

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 01-HelloCuda Ejemplo de CUDA VS Wizard – Crear un proyecto – No marcar la opción de cabeceras precompiladas – Abrir el fichero principal Funciones – InitCUDA: Cuenta el número de dispositivos Busca el primer dispositivo compatible con CUDA – HelloCUDA Kernel Global Copia una frase en un lugar de la tarjeta gráfica – Main Se reserva espacio para el resultado Se lanza el kernel Se espera a que termine el kernel Se copian los resultados a memoria principal Se libera el contexto de CUDA Tareas – Añadir la función getchar() al final de la función principal – Añadir las modificaciones necesarias para poder compilar el código – Enlazar el proyecto en Release

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 00-Proyecto base Cuatro ficheros – Main.c Se ejecuta en el host Llama a la función encargada de ejecutar el kernel Se encarga de la medición de tiempo – mi.h: Cabecera de la función que llama al kernel – mi.cu Se ejecuta en el host Fichero encargado de llamar al kernel Selecciona el número de hilos y bloques Se encarga de la trasferencia de los datos Espera a que finalice el kernel – mi_kernel.cu: Se ejecuta en el device Implementación del kernel

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 00-Proyecto base Tareas Deshabilitar la compilación de mi_kernel.cu – Utilizar un.cuh Indicar al compilador que debe mostrar la información necesaria para calcular la ocupación Activar las optimizaciones

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 000-RC4 CPU Contenido – Implementación del RC4 en CPU – El fichero main.c contiene múltiples llamadas al RC4 que deberán paralelizarse

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Ejercicio – Implemetar una función que llame al kernel y copiar su descripción en el archivo de cabecera: int rc4_call_kernel(unsigned char *key, unsigned int lKey, unsigned char *text, unsigned int lText, unsigned int nKey, unsigned char *cypherT) Reservar espacio de los parámetros tanto de entrada como de salida cutilSafeCall(cudaMalloc((void**)& puntero, elementos * sizeof(tipo))); Copiar los vectores de entrada cutilSafeCall(cudaMemcpy(destino, origen, tamaño * sizeof(tipo), cudaMemcpyHostToDevice));

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Ejercicio – Implementar una función que llame al kernel: Dividir en bloques e hilos de forma que cada hilo procese una clave – Determinar el número de hilos por bloque blockDim.x = Número de hilos por bloque – Determinar el número de bloques blocks= nkeys/blockDim.x gridDim.x = (blocks*blockDim.x < nkeys)?blocks+1:blocks;

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Ejercicio – Implementar una función que llame al kernel: Llamar al kernel rc4_kernel_noSM >>(d_key, lKey, d_text, lText, nKey, d_cypherT); Sincronización cudaThreadSynchronize();

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Ejercicio – Implementar una función que llame al kernel Copia de los resultados cutilSafeCall(cudaMemcpy(destino, origen, tamaño * sizeof(tipo), cudaMemcpyDeviceToHost)); Liberar Recursos cutilSafeCall(cudaFree(d_cypherT));

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Ejercicio – Implementar un conjunto de kernels que implemente el RC4 Implementar las funciones auxiliares como __device__ Implementar el kernel principal __global__ – Determinar a qué clave se va a acceder unsigned int dimXxIdxX = blockDim.x * blockIdx.x; unsigned int pKey = dimXxIdxX * lKey + threadIdx.x * lKey; unsigned int pText = dimXxIdxX * lText + threadIdx.x * lText; – Controlar datos que no son múltiplos de 32 » Solución 1: if ((dimXxIdxX + threadIdx.x) >= nKey) return; » Solución 2: rellenar con datos basura

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Ejercicio – Implementar la toma de tiempos en el fichero main.c Asignar valor a las variables de entrada lKey = 6; lText = 100; nKey = ; key = (unsigned char *)malloc(lKey * nKey * sizeof(unsigned char)); cypherT = (unsigned char *)malloc(lText * nKey * sizeof(unsigned char)); text = (unsigned char *)malloc(lText * sizeof(unsigned char)); Calcular el tiempo medio for (i = 0; i < 10; ++i) rc4_call_kernel(key, lKey, text, lText, nKey, cypherT);

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Ejercicio – Implementar un conjunto de kernels que implemente el RC4 Implementar las funciones auxiliares como __device__ Implementar el kernel principal __global__ – Determinar a qué clave se va a acceder unsigned int dimXxIdxX = blockDim.x * blockIdx.x; unsigned int pKey = dimXxIdxX * lKey + threadIdx.x * lKey; unsigned int pText = dimXxIdxX * lText + threadIdx.x * lText; – Controlar datos que no son múltiplos de 32 » Solución 1: if ((dimXxIdxX + threadIdx.x) >= nKey) return; » Solución 2: rellenar con datos basura

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Análisis – Fermi (256 – 100%-441ms)

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Análisis – Fermi (128 – 66% - 416ms)

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 02-RC4 SIN SM Análisis – Fermi (50% - 96 – 397MS)

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 03-RC4 SM Ejercicio – El vector de S pasa a memoria compartida Declaración __shared__ unsigned char S[tamaño* número de hilos por bloque]; Cada hilo accede a su porción de memoria compartida unsigned int sMemPos = threadIdx.x * tamaño; //tamaño 256 Ahora la forma de direccionar S cambia – Puntero al comienzo de S » Antes: S » Ahora: &(S[sMemPos]) – Acceso a una posición de S » Antes: S[i] » Ahora: S[sMemPos+i]

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 03-RC4 SM Análisis – Hilos por bloque máximo 256*número hilo 64 – Hay que compilar para saber cuanto espacio de memoria compartida va a usar el driver de forma transparente 256*número hilo 192 Occupancy Calculator – No va a funcionar en una tarjeta no dedicada!!!!

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 04-RC4 SM sin bloqueos Ejemplo – Ajuste de los datos por columnas en el kernel principal Primer elemento: S[threadIdx.x] Puntero al primer elemento: &(S[threadIdx.x]) Acceso al elemento i: S[threadIdx.x + numero de hilos por bloque * i] – Acceso al elemento i en rc4_init S[número de hilos por bloque * i]

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 04-RC4 SM sin bloqueos Análisis – Aumento de rendimiento – Cada bloque de memoria compartida proporciona un entero de 32 bits – En nuestro caso se leen char, se bloquean 4 threads de cada vez – Solución Desperdiciar el espacio (no hay suficiente SM) Tipos de acceso más sofisticados por wraps de 8 hilos

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 05-RC4 con memoria de constantes Ejemplo – Ideal para meter datos pequeños (hasta 64k) A los que acceden todos los hilos a la misma posición a la vez Y sólo pueden leer – Se coloca la cadena a cifrar – Se declara de forma estática y global en el fichero donde se define el kernel: __device__ __constant__ unsigned char d_lEnt[100]; – La cadena de entrada se copia con otro tipo de llamada y no hace falta reservar espacio cutilSafeCall(cudaMemcpyToSymbol(d_lEnt, text, lText * sizeof(unsigned char)));

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 05-RC4 con memoria de constantes Ejemplo – Quitar el parámetro text de la entrada del kernel – Sustituir la variable text por d_lEnt

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 05-RC4 con memoria de constantes Análisis – Aumento de rendimiento – Se reduce un parámetro de entrada

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 06-RC4 con coalescencia Ejercicio – Organizar los datos de entrada para permitir la lectura/escritura simultánea de 16 hilos a datos consecutivos (32, 64, 128) – Se supone que los datos ya están ordenados – Se reserva la memoria garantizando la alineación de los datos pitch: número de bytes por fila Indicar el tamaño de la fila Indicar el número de filas cutilSafeCall(cudaMallocPitch((void**)&d_keyP, &pitch, nKey * sizeof(unsigned char), lKey)); cutilSafeCall(cudaMallocPitch((void**)&d_cypherTp, &pitchS, nKey * sizeof(unsigned char), lText));

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 06-RC4 con coalescencia Ejercicio – Se copian los valores de entrada y salida de forma distinta cutilSafeCall(cudaMemcpy2D(d_keyP, pitch, key, nKey * sizeof(unsigned char), nKey * sizeof(unsigned char), lKey, cudaMemcpyHostToDevice)); … cutilSafeCall(cudaMemcpy2D(cypherT, nKey * sizeof(unsigned char), d_cypherTp, pitchS, nKey * sizeof(unsigned char), lText, cudaMemcpyDeviceToHost));

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 06-RC4 con coalescencia Ejercicio – Añadir el pitch como variable de entrada al kernel __global__ void rc4_kernel_SMsin_const_coa(unsigned char *key, unsigned int lKey, unsigned int lText, unsigned int nKey, unsigned char *cypherT, unsigned int pitch, unsigned int pitchS) – En el kernel los datos se direccionan de forma distinta unsigned int dimXxIdxX = blockDim.x * blockIdx.x; unsigned int pos = dimXxIdxX + threadIdx.x; – Cambiar la forma de acceso a las variables key y cypherT Acceso al elemento k-ésimo: cypherT[pos + k * pitchS]

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 06-RC4 con coalescencia Análisis – Sólo se traen 8 bits a la vez por lectura Se podrían intentar traer hasta 128 si se conoce bien el tamaño de entrada – Aumenta el rendimiento significativamente

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 07|08-RC4 texturas Ejemplo – Para datos de sólo lectura (en Fermi se puede escribir también) – En el fichero del kernel se declara una variable de tipo texturas texture textKey; – En el fichero que llama al kernel se crea un descriptor de textura cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc (); – Después de subir los datos se enlaza el descriptor con la textura cudaBindTexture(NULL, &textKey, d_keyP, &channelDesc, lKey * pitch * sizeof(unsigned char)); – Al finalizar se desenlaza la textura cudaUnbindTexture(textKey);

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 07|08-RC4 texturas Ejemplo – El kernel no necesita que se pasen las claves como entrada __global__ void rc4_kernel_SMsin_const_coa_text(unsigned int lKey, unsigned int lText, unsigned int nKey, unsigned char *cypherT, unsigned int pitch, unsigned int pitchS) – Cambiar los accesos a key por una búsqueda en textura: tex1Dfetch(textKey, pos + (i & (key_length - 1) * pitch)) – Las texturas no se pueden pasar como parámetro Modificar RC4_Init para que reciba la posición de acceso Cambiar los accesos a key

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 07|08-RC4 texturas Análisis – Mejora de rendimiento – Fermi

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 09-RC4 Múltiples elementos por hilo Cada hilo procesa más de una palabra En la distribución de bloques es necesario tener en cuenta el número de claves que procesa cada hilo blocks= nkeys / (blockDim.x * n) gridDim.x = (blocks * blockDim.x * n < nkeys) ? blocks + 1:blocks; Añadir al kernel el número de elementos que debe procesar cada hilo __global__ void rc4_kernel_SMsin_const_coa_mul(unsigned char *key, unsigned int lKey, unsigned int lText, unsigned int nKey, unsigned char *cypherT, unsigned int pitch, unsigned int pitchS, unsigned int n);

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 09-RC4 Múltiples elementos por hilo Se debe adaptar el kernel para procesar varias claves – Posición de inicio de cada bloque unsigned int dimXxIdxX = (blockDim.x * n) * blockIdx.x; – Se añade un bucle que procesa todas las claves asignadas for (int l = 0; l < n; ++l) – Cambiar el acceso a cada clave Primera posición de cada clave: &(key[pos + l * blockDim.x]) Elemento i-ésimo del kernel rc4_init: key[i*pitch]

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 10-RC4 Múltiples tarjetas Ejemplo – Forma de acceso IP: Usuario: gpu_user Clave: CNI_UsEr_gpu Se accede a través de PUTTY o WINSCP (en la carpeta material) Existe una carpeta por usuario: NVIDIA_GPU_Computing_SDK_??

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 10-RC4 Múltiples tarjetas Ejemplo – Compilación en Linux La compilación se lleva a cabo desde un terminal – Se hace a través de un fichero MAKEFILE » make: compila el proyecto » make clean: limpia un proyecto compilado El SDK tiene un fichero de compilación (common.mk) – Copiar ese fichero en la carpeta de trabajo (C/common) – La versión que se adjunta puede compilar librerías dinámicas – Se necesita ubicar los proyectos en la carpeta C/src del directorio de trabajo – Los binarios son generados en la carpeta C/bin del directorio de trabajo – Explicar código

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 10-RC4 Múltiples tarjetas Ejemplo – Código Se genera un hilo en CPU por cada tarjeta gráfica – Se añade la librería multithreading del SDK – Se crea la estructura con la información que se le pasa a cada hilo El kernel no cambia Análisis – Es rentable para datos o computación masiva – CUDA 4 mejora el soporte

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 11-RC4 y MD5 Ejemplo – Código El código calcula la clave haciendo sucesivas llamadas a MD5 La clave resultante se utiliza para cifrar una cadena con RC4 Tareas – Evitar las copias a CPU entre diferentes llamadas al kernel – Incluir el bucle en el kernel del MD5

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS 12-Kernel concurrente Ejemplo – Código

CURSO DE PROGRAMACIÓN PARALELA EN PROCESADORES GRÁFICOS Situaciones no tratadas Operaciones de módulo potencia de 2 – I % j == i & (j - 1) Control de flujo – Claves con tamaños diferentes. Cada Wrap debería acceder a claves del mismo tamaño Caché – Configuración del tamaño de la caché – Desactivación de la caché Multitarjeta 4.0 – Paso de parámetros entre tarjetas – Espacio unificado Operaciones atómicas en cache Desenrollado de bucles