Archivo categoría Programación
Lady Java
Por TheCoffeMaker - General, Java - 18/08/2010
Excelente … JavaZone primero nos trajo Java-4-Ever … y ahora … Lady Java … disfruten!

CUDA, exprimiendo GPUs
Por TheCoffeMaker - OpenSource, Programación, Tecnologia - 18/02/2010
CUDA, Compute Unified Device Architecture, es una tecnología desarrollada por nVidia que permite usar el poder de calculo de los GPUs. Esta tecnología obviamente no es nueva, pero ha experimentado una gran aceptación dentro del mundo computologo
ya que nos permite usar lo que muchas veces solo sirve para jugar
. CUDA fue introducido en Noviembre del 2006 como una arquitectura de propósito general para computación paralela, que aprovecha al máximo los motores computacionales de los GPUs de nVidia para resolver problemas complejos de una manera mucho mas eficiente que los CPU.
Debido a la gran demanda del mercado para renderizar gráficos 3D de alta definición y procesamiento en tiempo real, los GPUs, o Unidades de Procesamiento de Gráficos, evoluciono mas allá de los limites impuestos por los CPUs, proveyendo procesadores con muchos núcleos, un ancho de banda de memoria excepcional y una tremenda fuerza computacional, lo que permite ejecutar muchas tareas e hilos de procesamiento en paralelo. Esto se logra gracias a que el GPU tiene mas transistores especializados en procesamiento de datos a diferencia del CPU, que debe cachear datos y controlar el flujo de control.
En definitiva, si hablamos de soluciones a problemas que pueden ser diseñadas como ejecuciones en paralelo y que necesitan un gran poder de calculo aritmético, lo mejor seria poder utilizar el GPU para resolver estos problemas, ya que es justamente para lo que fue diseñado el GPU y de lo que se tratan las tareas de renderizado, procesamiento en paralelo de grandes volúmenes de datos de punto flotante en tiempo real.
Pero …. todo lindo dirán ustedes … ¿Que ventajas me da CUDA por sobre otras APIs gráficas? … bueno …
1ro. y principal es que CUDA no es una API gráfica, es una tecnología que nos permite utilizar el poder de calculo de los GPUs para otras tareas, con lo cual no podremos renderizar texturas, por ejemplo.
2do. Se puede consultar cualquier posición de memoria, o lo que se denomina lecturas dispersas.
3ro. Existe un área de memoria compartida, la cual puede ser accedida por los hilos de ejecución, este área de memoria es extremadamente rápida, lo que nos permite utilizarla como cache.
4to. Soporta enteros y operaciones a nivel bit.
5t0. Debido al gran ancho de banda de memoria, las lecturas son extremadamente mucho mas rápidas que un CPU.
Para la gran mayoría de desarrolladores que me he cruzado en lo que llevo de vida, hablar de procesamiento en paralelo es complicarse la vida, obviamente por que no es un tópico que se vea a fondo en los primeros cursos de programación y teorías de programación en la facultad. De hecho, si se tiene la suerte de verlos, se lo hace muy por arriba. Esto podría haber sido valido durante los 80′s y 90′s … donde corríamos sobre procesadores de un solo núcleo y se sabia que correr hilos en paralelo no era mas que correr tareas paso a paso con una buena planificación del CPU. Pero ahora, con el advenimiento de CPUs de núcleos múltiples y GPUs de muchísimos núcleos (sí, con múltiples nos quedamos cortos
) es necesario cambiar nuestra estructura mental y empezar a pensar realmente en computabilidad paralela y para esto es que se crean los modelos de programación escalable, como CUDA, para aprovechar al máximo el gran incremento de núcleos de procesadores.
CUDA expone al programador, como un conjunto mínimo de extensiones de lenguaje, 3 abstracciones principales, una jerarquía de grupos de hilos, memoria compartida y barreras de sincronización. Estas abstracciones guían al desarrollador a particionar problemas para que se creen aplicaciones que de forma transparente escalen su paralelismo para poder incrementar el numero de núcleos computacionales. La estructura que se utiliza en este modelo esta definido por una matiz (o ventor de hasta 3 dimensiones) dentro del cual hay bloques de hilos.
Por el momento voy a seguir aprendiendo sobre esta tecnología y en el futuro posteare cosas mas concretas … so far … les dejo algunos links de interés.
Tarjetas graficas que soportan CUDA
The Cost to Play: CUDA Programming | Linux Magazine
Algunos proyectos que se benefician de esta tecnologia:
SETI@Home
Los investigadores en el campo científico de SETI recibieron un incremento masivo en poder de cómputo, cuando Nvidia y BOINC liberaron un cliente optimizado que le permitirá a SETI@home ser acelerado sobre GPUs GeForce. SETI@home, el proyecto más grande de BOINC con casi 200,000 usuarios activos, busca inteligencia extraterrestre mediante el uso de telescopios de radio para escuchar señales de radio de amplitud de banda corta provenientes del espacio.
GPUGRID
GPUGRID, el primer proyecto de BOINC en usar las GPUs Nvidia GeForce con tecnología CUDA para cómputo, utiliza las tarjetas de gráficos basada en Nvidia en las PCs participantes para computar simulaciones biomoleculares de alto desempeño para la investigación científica. Agregar el soporte para las GPUs Nvidia derivó en 1,000 GPUs activas que ofrecen la misma cantidad de poder de cómputo en por lo menos 20,000 CPUs en proyectos similares, brindando una velocidad promedio de hasta 20 veces.
Einstein@Home
La tecnología Nvidia CUDA pronto estará impulsando el tercer proyecto más ampliamente utilizado por BOINC, Einstein@Home, que utiliza el cómputo distribuido para buscar estrellas de neutrones giratorios (también llamadas pulsares) usando datos de detectores de ondas gravitacionales.
Saludos!
Netbeans Platform – Configuración de opciones de inicializacion
Por TheCoffeMaker - Java, OpenSource - 12/07/2009
Hoy día es común contar con procesadores de múltiples núcleos, arquitecturas de 64-bit o con varios procesadores, si este es nuestro caso, podemos configurar los argumentos de inicialización de la JVM para poder mejorar el uso de la memoria del sistema y cambiar el algoritmo de garbage collection que usa el sistema.

En Netbeans podremos hacer esto modificando el archivo netbeans.conf, ubicado en el directorio /etc dentro del directorio home del Netbeans, por ejemplo en mi sistema este esta en ~/Software/netbeans-6.7/etc/, pero la ubicación del directorio de Netbeans dependerá de su instalacion.
Bien, si abren el archivo netbeans.conf veran varios parámetros de configuración para Netbeans, pero en este caso nos interesan los parámetros de inicialización de la JVM, estos se pasan a través de la propiedad netbeans_default_option, veamos que tenemos en una instalación por defecto:
netbeans_default_options="-J-Dorg.netbeans.modules.tomcat.autoregister.token=1246325206684 -J-Dorg.netbeans.modules.tomcat.autoregister.catalinaHome=\"/home/damian/Software/apache-tomcat-6.0.18\" -J-Dorg.glassfish.v3.installRoot=\"/home/damian/Software/servers/glassfish-v3-prelude\" -J-Dcom.sun.aas.installRoot=\"/home/damian/Software/servers/glassfish-v2ur2\" -J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true"
Veamos de que se tratan cada uno de estos parametros:
-J-Dorg.netbeans.modules.tomcat.autoregister.token=1246325206684
-J-Dorg.netbeans.modules.tomcat.autoregister.catalinaHome=\”/home/damian/Software/apache-tomcat-6.0.18\”
2- GlassFish 3 install Root
-J-Dorg.glassfish.v3.installRoot=\”/home/damian/Software/servers/glassfish-v3-prelude\”
3- GlassFish 2 UR2 install Root
-J-Dcom.sun.aas.installRoot=\”/home/damian/Software/servers/glassfish-v2ur2\”
4- Parametros de configuracion de JVM
-J-client -> Utilizado para mejorar la eficiencia de Netbeans, ya que previene que se inicialice utilizando el servidor de maquina virtual Java HotSpot, el cual utiliza mas recursos del sistema. En ves de usar dicho servidor, este parámetro indica que se inicialice utilizado el Java HotSpot Client VM decrementando el consumo de recursos.
-J-Xss2m -> Configura el tamaño del stack de código nativo para cada hilo de ejecución. En caso de que nuestro tamaño de stack sea muy pequeño, eventualmente podríamos llegar a estar experimentando un overflow del stack (class.java.lang.StackOverflowError). Cada hilo tiene dos stacks, uno para el código Java y otro para código C. Esta opción, por lo tanto, configura el máximo tamaño del stack que puede ser usado por código C en el hilo.
-J-Xms32m ->Configura el tamaño iniciar del heap de memoria. Esto le dice a la JVM cuanta memoria le tiene que asignar al heap al iniciar, previniedo que Netbeans consuma mas memoria y mejorando el tiempo de inicializacion.
-J-XX:PermSize=32m -> Configura la generación inicial de espacio permanente
-J-XX:MaxPermSize=200m -> Configura el máximo de generación de espacio permanente
-J-Xverify:none -> Especifica el nivel de verificación de bitcode que queremos que la JVM realice al momento de cargar clases. Las opciones son none, donde no se hace ninguna verificación, all, donde se verifica todo y remote, donde se verifican solo las clases que son cargadas desde la red. Esto quiere decir que nada de lo instalado localmente sera verificado, acelerando el proceso de carga de clases.
-J-Dapple.laf.useScreenMenuBar=true -> Este parámetro le dice a swing como debe comportarse la barra de menues de Netbeans, generalmente esto esta asociado con sistemas MacOS, donde el usuario espera que la barra de menues de Netbeans este ubicada en la barra superior y no dentro de la aplicación.
-J-Dsun.java2d.noddraw=true -> Este parámetro sirve para deshabilitar completamente el uso de DirectDraw y Direct3D usado por el sistema Java 2D.
Bien, visto lo que tenemos por default en la configuracion de Netbeans, veamos de que va todo esto:
Para especificar que la JVM debería usar un algoritmo mas eficiente de garbage collection debemos usar el parámetro “-J-XX:+UseConcMarkSweepGC“, esto es especialmente útil cuando corremos sobre múltiples procesadores o procesadores de núcleos múltiples.
También deberíamos especificarle a la JVM que sea capas de descargar (descargar en el sentido de sacar no de bajar de la red) las clases, esto se logra con los parámetros -J-XX:+CMSClassUnloadingEnabled y -J-XX:+CMSPermGenSweepingEnabled.
Para mas información sobre los parámetros que pueden ayudarnos a mejorar nuestra instalación de Netbeans, vean este link.

Espero que les haya servido y agreguen el blog a sus lesctores de RSS para mantenerse informado, ya que este es el primero de una serie de posts sobre el desarrollo de aplicaciones utilizando Netbeans Platform.
Saludos!
Definicion de programador
Por TheCoffeMaker - Programación - 16/03/2009
Hoy leyendo un articulo sobre programacion funcional, para refrescar conocimientos para un post que estoy preparando, encontre una definicion de programador muy interesante:
Textualmente:
“Programmers are procrastinators. Get in, get some coffee, check the mailbox, read the RSS feeds, read the news, check out latest articles on techie websites, browse through political discussions on the designated sections of the programming forums. Rinse and repeat to make sure nothing is missed. Go to lunch. Come back, stare at the IDE for a few minutes. Check the mailbox. Get some coffee. Before you know it, the day is over.”
Traducido:
“Los programadores son procastrinadores procrastinadores. Llegan, van por un cafe, chequean el mail, leen los feeds RSS, leen las noticias, miran los ultimos articulos de sitios techies, navegan sobre discuciones politicas en las secciones designadas de foros de programacion. Releen y repasan para estar seguros de que no se han perdido de nada. Van a almorzar. Vuelven, Miran fijamente al IDE por algunos minutos. Chequean el correo. Toman un cafe. I antes de darte cuenta, el dia se termino”
Muy interesante definicion … je! … me recuerda a muchos miembros de equipos de trabajo en los que estuve.
Para ellos este post!
Saludos!!!


Comentarios recientes