$facu@nvd


Introducción a CUBLAS

Publicado en CUDA,Programación por facunvd en septiembre 14, 2012

¿Qué es CUBLAS?

La librería de NVIDIA CUDA Basic Linear Algebra Subroutines es una versión de la librería BLAS implementada sobre GPUs.

La misma permite a los usuarios acceder a recursos computacionales de la GPU NVIDIA, pero no auto-paraleliza múltiples GPUs.

¿Comenzamos?

Bien, su uso es bastante simple si se conoce de antemano el lenguaje de CUDA. Si alguna vez haz programado sobre CUDA notarás que es exactamente el mismo procedimiento.

En esta oportunidad resolveremos el producto punto del álgebra lineal básica.

\alpha = \sum_{i=1}^n{a_{i}*b_{i}}

Como pueden apreciar, el algoritmo es bastante sencillo, pero el uso es demasiado amplio, así es que es muy conveniente su presentación.

float my_dotproduct(float *a, float *b)
{
 float sum = 0;
 for(int i = 0; i < M; i++)
 sum += a[i] * b[i];
 return sum;
}

Seguimos con cuBlas?

Para los experimentados sobre CUDA, conocen los pasos esenciales:

  1. Host variables allocation
  2. Set host variables
  3. Device variables allocation
  4. Set device variables
  5. Launch kernels
  6. Get results
  7. Free memories(device and host)

En este caso es exactamente “lo mismo”, con excepción de lo siguiente:

stat = cublasCreate(&handle ) ;
if ( stat != CUBLAS_STATUS_SUCCESS ) {
    printf ( "CUBLAS initialization failed \n" ) ;
    return EXIT_FAILURE ;
}
Esta última función inicializa la librería CUBLAS y crea el handle para la estructura que posee el contexto de la librería de CUBLAS. Es necesario setear este handle antes de hacer cualquier otra llamada a la librería.
stat = cublasSetVector(M, sizeof(float), a, 1, devPtrA, 1);
if ( stat != CUBLAS_STATUS_SUCCESS ) {
    printf ( " data download f a i l e d " ) ;
    cudaFree ( devPtrA ) ;
    cublasDestroy ( handle ) ;
    return EXIT_FAILURE ;
}

stat = cublasSetVector(M, sizeof(float), b, 1, devPtrB, 1);

if ( stat != CUBLAS_STATUS_SUCCESS ) {
    printf ( " data download f a i l e d " ) ;
    cudaFree ( devPtrA ) ;
    cublasDestroy ( handle ) ;
    return EXIT_FAILURE ;
}
Esta parte es necesaria para setear los vectores que se manejarán sobre el dispositivo. Recordemos además que es necesario y casi obligatorio el chequeo de la reserva de memoria, copias, y distintas operaciones que se hacen al llamar a las funciones de tal librería.
cublasSdot(handle, M, devPtrA, 1, devPtrB, 1, &curesult);
El centro de todo, *la llamada*, esta última función ejecuta el producto punto utilizando CUBLAS. Se puede apreciar que necesita de un handle, y los vectores que residen en el dispositivo.
cudaFree(devPtrA);
cudaFree(devPtrB);
cublasDestroy(handle);
Al final, liberamos la memoria.
¿Y cómo compilamos?
Fácil, sólo hace falta agregar como directiva de compilación el linker:
-lcublas

Instalando CUDA 5.0 RC en OpenSuse

Publicado en Programación por facunvd en agosto 26, 2012

Hola!

En esta oportunidad vamos a instalar CUDA 5.0 RC en OpenSuse. Hace muy poco tiempo Nvidia lanzó una de las últimas versiones para CUDA. Algo a destacar es que los instaladores traen consigo varios paquetes:

  • Cuda Toolkit: Es el entorno de desarrollo para los programadores de C y C++. Este paquete incluye un compilador, librerías matemáticas, herramientas para depuración y optimización del rendimiento de nuestras aplicaciones. Además podemos encontrarnos con manuales, guías, referencia a la API, y otros tipos de documentación para facilitar el desarrollo.
  • SDK code samples: Una lista de códigos ejemplos desarrollados para correr sobre la arquitectura CUDA.
  • Developer drivers: Drivers necesarios de Nvidia para correr los ejemplos y aplicaciones a desarrollar.

Ahora bien, el instalador nos dará la oportunidad de elegir los paquetes a instalar. Para la descarga tenemos el siguiente link.

En mi caso instalé los 3 paquetes del instalador. ¿Cómo comenzar? Bien, recordemos que la mayoría de los sistemas operativos basados en Linux, no traen consigo los drivers privativos de nvidia, sino es muy común encontrarse con nouveau. Como el requisito de Nvidia es que tengan la versión correcta de los drivers, será necesario desinstalar nouveau. Bastará con desinstalarlo usando yast:

sudo /sbin/yast2 --remove nouveau
sudo /sbin/reboot

Luego necesitamos instalar los siguientes paquetes:

  • kernel-devel
  • binutils
  • make
  • gcc
  • freeglut(para algunos ejemplos)
  • glibc

Luego de haber instalado lo necesario, tenemos que salir de las X’s.

sudo /sbin/init 3

Nos movemos al lugar la descarga del instalador de CUDA:

cd $HOME/Descargas

Ahora ejecutamos el instalador:

sudo ./cuda_5.0.24_linux_64_suse12.1.run

Y elegimos los paquetes a instalar, lo cual no debería ser algo muy difícil.

Por último reiniciamos la PC.

sudo /sbin/reboot

Luego de reiniciar, podremos ver que están instalados en el menú de KDE(Development) las siguientes herramientas:

  • NVIDIA Visual Profiler
  • Nsight Eclipse Edition

Imagen

Espero les haya sido de ayuda!

GnuPlot y C, será posible?

Publicado en Programación por facunvd en agosto 19, 2012

Sin más vueltas, comienzo a postear.

Resulta muy útil la mayoría de las veces hacer uso de herramientas para presentaciones y ploteo de gráficas. En esta oportunidad trataré de mostrarles a GnuPlot. Un programa muy bien documentado para la generación de gráficas de funciones y datos.  Su forma de uso depende del gusto, ya que permite la interacción usuario-software mediante una consola (modo interactivo)  o utilizando scripts. Ahora bien, el programa cuenta con grupo de desarrolladores desde aproximadamente 1986, lo que podría ser en algún punto sinónimo de robusto.

Como sabrán, los developers generalmente estamos acostumbrados a no reinventar la rueda y por esa misma razón, podemos utilizar a gnuplot para graficar, por qué no, desde nuestro lenguaje de programación favorito, ya sea C, Python, Java, etc.

Pero ante todo por qué no utilizo otro? Bien, porque es libre, y todo lo que sea libre es bienvenido para mis proyectos futuros, además de su fácil adaptación con los lenguajes que más utilizo que son C/C++/Python.

En este caso he preferido usar C. ¿Cómo lo haremos? Muy fácil, bastará conocer las funciones de la biblioteca stdio.h(standard input-output header): popen, pclose, fprintf y fflush.

Entonces, la clave está en poder manipular pipes. El código se encuentra en mi github para que pueda descargarlo junto con el data file: 
https://github.com/facunvd/GnuPlot-Testing
.

Primero que nada recordemos instalar gnuplot.

Para plataformas Windows, debemos descargarnos el instalador y proceder normalmente.

Sobre sistemas GNU/Linux tenemos, en el caso debian que es donde actualmente me estoy moviendo:


apt-get install gnuplot

Y he aquí cuando vamos a lo nuestro *codear*:


#include <stdio.h>
#include <stdlib.h>

int main()
{
 //Declaramos el comando requerido, lo dejamos en persist para modos ventana
 const char *cmd = "gnuplot -persist";

//Abrimos el pipe para escribir en el
 FILE *pipe = popen(cmd,"w");

if(pipe == NULL){
 fprintf(stderr, "I can't find gnuplot.");
 return(EXIT_FAILURE);
 }

fprintf(pipe, "set grid\n");

fprintf(pipe, "set title 'Grafica de Datos'\n");

fprintf(pipe, "set style data linespoints\n");

 fprintf(pipe, "set xlabel 'X'\n");

fprintf(pipe, "set ylabel 'Y'\n");

fprintf(pipe, "set yrange [0:12]\n");

fprintf(pipe, "set xrange [0:12000]\n");

fprintf(pipe, "plot 'file1.dat'\n");

//Hacemos un flush a pipe para poder desplegar la ventana
 fflush(pipe);

//Esperamos...
 getchar();

//Cerramos el pipe
 pclose(pipe);
 return 0;

}

Ahora bien, les recomiendo crear archivos .dat ya que con un simple plot ‘file.dat’ pueden graficar los datos en tal archivo. Esto último se torna últil, como es mi caso, para el ploteo de benchmarks, function measurements, speedups, etc.

Cuidado sobre el entorno donde estén trabajando pues popen y pclose deberán ser reemplazadas por _popen y _pclose en entornos windows.

Por supuesto, no es obligatorio el uso de algún lenguaje para aprovechar la potencialidad de gnuplot, ya que este mismo en su versión consola nos permite manipularlo tranquilamente, digo esto pues algunos querrán evitarse los detalles de programación.

 

Una linda página para aprender sobre las utilidades de GnuPlot es la siguiente: 
http://t16web.lanl.gov/Kawano/gnuplot/datafile-e.html
.

 

Fuentes: wikipedia - gnuplot - linux.die

 


Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.