martes, 10 de mayo de 2016

Me encuentro escribiendo grandes e interesantes noticias para este blog, luego de un tiempo de profunda meditación :-)

En los próximos días se publicarán varias.

¡ Salud !


miércoles, 18 de julio de 2012

Nota Corta: El mejor IDE para C/C++



Después de mirar muchas de las alternativas libres para programar en C/C++ creo que sin duda alguna el mejor es Emacs. A menos que el proyecto sea inmensamente grande, no creo que pueda encontrarse una mejor opción. Es altamente personalizable, y tiene varios plugins para otros lenguajes, aunque ya esa es otra historia. 


Los invito a instalarlo en caso de que no lo tengan, y a usarlo. Al principio será incomodo, pero al poco tiempo se acostumbrarán.

Adicional, les dejo la referencia rápida a Emacs, un triptico que los sacará de problemas cuando olviden algún hotkey.


domingo, 20 de mayo de 2012

Top lenguajes de programación

Buscando información sobre la popularidad de los lenguajes de programación en las comunidad de programadores y científicos me encontré con la siguiente página web:


http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

La cual utiliza sofisticados algoritmos de exploración y explotación de datos extraídos de los principales motores de búsquedas, y por ende, de páginas, foros y blogs en la red para hacer un bosquejo estadístico de que lenguaje de programación es más popular que cual. 

A continuación extraigo una imagen en donde se muestran series temporales en donde se destacan el top 10 de los lenguajes de programación mas populares:


Si ... pero ¿que significa que un lenguaje de programación se haga popular o deje de ser-lo? ¿afecta esto al programador estándar?

Pues bien, la popularidad se traduce a larga escala en comunidades crecientes, y las comunidades se traducen en soporte y desarrollo. Si un lenguaje decae, puede significar que programadores noveles migran a otros lenguajes, o que hay poca actividad en la comunidad. En general esto no afecta al programador experto, pero si al novato, que necesitará de una comunidad sólida para soportarse y aprender más.


sábado, 26 de noviembre de 2011

CUDA: Un lenguaje de programación para cálculo científico.



1. ¿Que es CUDA?

CUDA proviene de las siglas de Compute Unified Device Architecture (Arquitectura de Dispositivos de Cómputo Unificado), y podemos pensar en este como una variante de los lenguajes de programación C/C++, desarrollado con el propósito de aprovechar las capacidades de cálculo de los procesadores en tarjetas gráficas (GPU's) nVidea, aprovechándose de los multiplicidad de núcleos en estos para utilizar el paradigma de la programación en paralelo.

2. ¿Solo una variante de C/C++?

Aunque el compilador de CUDA (nvcc) como hemos mencionado anteriormente, es muy parecido a C (gcc en linux), actualmente existen usa serie de wrappers (adaptadores de código) para utilizar CUDA desde python (PyCUDA), Fortran y Java, lo que abre ampliamente su capacidad de difusión en las comunidades de programadores.

3. ¿Cuales son las ventajas de programar en CUDA?

Puesto que la filosofía de CUDA radica en la explotación del paralelismo que ofrecen los múltiplos nucleos en las GPU's (nVidea), lo que se traduce en el lanzamiento de un gran número de hilos simultaneamente, tenemos que CUDA es realmente eficiente en el análisis y simulación de sistemas de muchas partículas, y en general, en sistemas complejos, donde el número de agentes interactuando junto con la complejidad de sus interacciones hacen que el paralelismo como paradigma de programación sea el mas adecuado. Un ejemplo de esto puede verse en el siguiente video, en donde se muestra la simulación de multiples agentes interactuando (entes biológicos), lo que sería imposible realizar con un computador estándar sin GPU's.



Más aún, en algoritmos que requieren múltiples repeticiones para conseguir el resultado buscado, p.e., algoritmos de optimización combinatoria como el algoritmo de recosido simulado, puede ser de mucha ayuda, colocando en lugar de varias repeticiones, muchas simulaciones en paralelo con condiciones iniciales aleatorias.

4. ¿Como funciona CUDA y en general los lenguajes orientados al aprovechamiento de los procesadores en las GPU's?

De manera simple, puede resumirse su funcionalidad en los siguientes 4 pasos:

a. Se copian los datos de la memoria principal a la memoria de la GPU
b. La CPU encarga el proceso a la GPU
c. La GPU lo ejecuta en paralelo en cada núcleo.
d. Se copia el resultado de la memoria de la GPU a la memoria principal



5. ¿Es este tipo de sistemas rentable?

Los costos de un servidor de cálculo científicos son exorbitantes, superan generalmente los 50.000 $ sumando a ello, el coste de refrigerantes, y las estaciones desde la que se podrá acceder a este tipo de servidor. Mas costoso aún es construir un cluster descente, pues el número de equipos necesarios para obtener resultados descentes es alto, además que dichos equipos deben ser suficientemente buenos para que el rendimiento del cluster en general sea alto.

Con una GPU básicamente podemos convertir cualquier equipo, en una estación de cálculo científico. El costo de una tarjeta nVidea para dicha tarea oscila entre 1000 – 4000 $.

6. Limitaciones

Uno de los problemas que puede aparecer al programar en CUDA es la aparición de un “cuello de botella” entre la CPU y la GPU por el ancho de banda de los buses y sus latencias, i.e., puede que el CPU del equipo, no envíe la información a procesar al GPU con sufiente rapidez, desaprovechando considerablemente la capacidad de cálculo de este último.


7. ¿Que tarjetas soportan CUDA?

Funciona en todas las GPU nVidia desde la serie G8X en adelante, incluyendo GeForce, Quadro y la serie Tesla.


8. Libros sobre CUDA
 


[1] Janson Sanders and Edward Kandrot, CUDA by Example: An Introduction to General-Purpose GPU Programming, Addison-Wesley, 2010.
http://www.amazon.com/CUDA-Example-Introduction-General-Purpose-Programming/dp/0131387685/ref=sr_1_1?ie=UTF8&qid=1322370279&sr=8-1
 


[2] Rob Farber, CUDA Application Design and Development, Morgan Kauffman Ed., 2011.
http://www.amazon.com/CUDA-Application-Design-Development-Farber/dp/0123884268/ref=sr_1_2?ie=UTF8&qid=1322370279&sr=8-2
 


[3] David B. Kirk and Wen-mei W. Hwu, Programming Massively Parallel Processors: A Hands-on Approach (Applications of GPU Computing Series), Morgan Kauffman Ed., 2010.
http://www.amazon.com/Programming-Massively-Parallel-Processors-Hands-/dp/0123814723/ref=sr_1_3?ie=UTF8&qid=1322370279&sr=8-3

viernes, 16 de septiembre de 2011

Un curso de Algoritmos (en inglés)

Aprovecho para escribir este post porque me he dado a la tarea de revisar un poco la literatura sobre algoritmos en ciencias de la computación, encontrando un par de notas muy bien escritas, por lo que quise compartirla con mis amigos y seguidores.

1. Algorithms Course Materials (by Jeff Erickson)

Contenido (Lecture Notes)
    0. Introduction, history, and course goals
    Recursion
    1. Simplify and delegate
    2. Fast Fourier transforms 
    3. Backtracking
    4. Fast exponential-time algorithms 
    5. Dynamic programming
    6. Advanced dynamic programming tricks 
    7. Greedy algorithms
    8. Matroids 
    Randomization
    9. Nuts and bolts (randomized quicksort)
    10. Treaps and skip lists
    11. Tail inequalities 
    12. Uniform and universal hashing
    13. Randomized minimum cut
    Amortized analysis
    14. Aggregation, taxation, potential
    15. Scapegoat trees and splay trees
    16. Maintaining disjoint sets ("union-find") — includes O(α(n)) amortized analysis 
    Basic graph algorithms
    17. Representations, traversal
    18. Minimum spanning trees
    19. Single-source shortest paths
    20. All-pairs shortest paths
    Flows and cuts
    21. Maximum flows and minimum cuts
    22. Maximum flow algorithms
    23. Applications of maximum flow
    24. Extensions of maximum flow 
    Linear programming
    25. Definitions and duality 
    26. The simplex algorithm 
    Lower bounds
    27. Decision trees, leaf counting
    28. Adversary arguments ("n-card monte")
    29. NP-hardness
    30. Approximation algorithms
    Appendix
    II. Solving recurrences
    I. Induction proofs

    Nota: El curso tiene una gran cantidad de problemas propuestos (homeworks), te recomiendo que si te interesan los tópicos que en este de desarrollan visites: http://www.cs.uiuc.edu/~jeffe/teaching/algorithms/ para terminar de descargar toda la información correspondiente al curso.

    2. Fundamental Algorithms Lecture Notes (by Chee Yap)

    Nota: Muy parecido al anterior.

    3. Lecture Notes for Algorithm Analysis and Design (Sandeep Sen)

    Nota: Bastante completo, lo recomiendo ampliamente.

    4. Introduction to Computer Algorithms: Lecture Notes (Grzegorz Malewicz)

    Nota: Interesante, aunque pienso que le faltaron un par de temas importantes.

    Si te ha gustado este artículo, compártelo en facebook, twitter, google+, coméntalo, envíalo por correo, y si quieres mas información, pídela. Si no te gusta, critícalo. Tu tienes completo control sobre los contenidos de este blog.

    martes, 30 de agosto de 2011

    Video Tutoriales de C++



    Investigando sobre la existencia de cursos y video-tutoriales de C++ en la web, encontré una colección de videos particularmente buenos. Recomiendo altamente a todos los interesados en aprender C++ desde cero el siguiente curso:

    Primer Capítulo:




    Podrás encontrar todos los demás capítulos en:



    Recomendación:

    Te recomiendo que veas al menos los primeros 4 capítulos, pues aunque al principio puede parecer un poco aburrido, va mejorando con el pasar de los capítulos.

    Si te ha gustado este artículo, compártelo en facebook, twitter, coméntalo, si quieres mas información, pídela. Si no te gusta, critícalo. Tu tienes completo control sobre los contenidos de este blog.

    domingo, 28 de agosto de 2011

    Un problema de teoría de números

    En estos días propuse un problema de teoría de números elemental a un par de amigos (especialistas en el área). La cuestión fue muy cómica pues, aunque todos me decían que el problema era muy fácil nadie me daba la respuesta. Pues bien, yo sabía que lo podía resolver en cuestión de dos minutos a lo más. Pasaron los días y se cumplió una semana, y nada que me daban la respuesta. Pues bien, me animé a resolverlo.

    El problema en cuestión era:
    Una terna Pitagórica es un conjunto de tres números naturales a<b<c, para la cual:


    a2 + b2 = c2

    Hay solo una terna Pitagórica para la cual a+b+c=1000. Encuentre el producto a*b*c.


    He aquí mi elegante solución, llevada a cabo con ayuda de Python


    (dale click a la imagen para obtener una mejor resolución)

    Hasta el día de hoy espero sus respuestas.

    Consejo: No hacer esto en casa ... pueden ganarse enemigos xD

    Salud.

    Si te gustó esta noticia compártela con tus amigos en google+, facebook, twitter, e-mail, o la red social de tu preferencia.

    Fuente: http://progrevo.blogspot.com/