Pregunta

Soy estudiante de negocios, dos tercios del camino de mi programa de grado, con un poco de experiencia en PHP, después de haber tomado una clase introductoria de C ++, y ahora lamento mi elección de negocio sobre programación / ciencias de la computación.

Estoy interesado en aprender programación más avanzada; específicamente C, y eventualmente progresando hacia el uso de la arquitectura CUDA para el análisis de datos de redes neuronales artificiales (no para IA, visión o procesamiento del habla, sino para encontrar correlaciones entre puntos de datos en grandes conjuntos de datos y datos generales / análisis estadístico).

¿Algún consejo sobre cómo debería comenzar a aprender C? ¿Así como la tecnología ANN / Bayesiana para analizar datos? Hay tantos libros por ahí que no sé qué elegir.

Dado que CUDA es bastante nuevo, no parece haber mucho material amigable para el alumno (es decir, tonto) para ello. ¿Existen recursos de aprendizaje para CUDA más allá de la documentación de NVIDIA?

Además, ¿qué recursos me recomendaría que hablen sobre la informática GPGPU y la programación paralela masiva que me ayudaría?

¿Fue útil?

Solución

No recomiendo intentar aprender CUDA primero, ya que es una tecnología nueva y no tienes mucha experiencia en programación.

Dado que no tiene mucha experiencia en C (o C ++), CUDA será difícil de aprender ya que carece de madurez, libs, buenos mensajes de error, etc.

CUDA está destinado a personas que están familiarizadas con C (la experiencia C ++ también ayuda) y tienen un problema que necesita mejorar el rendimiento al recodificar o repensar la solución de un problema bien conocido.

Si está tratando de resolver " ANN / Bayesian " problemas, recomendaría crear su solución en C ++ o C, a su elección. No te preocupes por crear hilos o subprocesos múltiples. Luego, después de la evaluación de los tiempos de respuesta de su solución en serie, intente hacerla paralela utilizando OpenMP, Boost threads, w / e. Después de esto, si aún necesita más rendimiento, le recomendaría aprender CUDA.

Creo que estos son puntos válidos porque CUDA tiene algunos errores bastante crípticos, difíciles de depurar, arquitectura totalmente diferente, etc.

Si aún está interesado, estos son algunos enlaces para aprender CUDA:

Cursos en línea:

Foro (la mejor fuente de información):

Herramientas:

Problemas resueltos en CUDA:

Otros consejos

Has expresado 3 objetivos diferentes:

  • Aprendiendo a programar en C
  • Aprendiendo a escribir código para la plataforma CUDA
  • Aprender a usar las redes de Bayes y / o las redes neuronales para el análisis de datos

Primero: estas cosas no son fáciles para las personas que ya tienen varios grados en el campo. Si solo haces una, asegúrate de aprender sobre la inferencia bayesiana. Es, con mucho, el marco más poderoso disponible para razonar sobre datos, y necesita saberlo. Mira el libro de MacKay (mencionado en la parte inferior). Ciertamente te has propuesto una tarea desafiante: ¡te deseo lo mejor!

Tus objetivos son calderas de peces bastante diferentes. Aprender a programar en C no es demasiado difícil. Si fuera posible, me gustaría llevar la " Introducción a los algoritmos & amp; Estructuras de datos " (generalmente el primer curso para estudiantes de CS) en su universidad (probablemente se imparte en Java). Esto será extremadamente útil para usted, y la codificación básica en C será simplemente una cuestión de sintaxis de aprendizaje.

Aprender a escribir código para la plataforma CUDA es sustancialmente más difícil. Como se recomendó anteriormente, primero consulte OpenMPI. En general, le servirá leer algo sobre arquitectura de computadoras (Patterson & amp; Hennessy es agradable), así como un libro sobre algoritmos paralelos. Si nunca ha visto simultaneidad (es decir, si no ha oído hablar de un semáforo), sería útil buscarlo (las notas de las clases de un curso de sistemas operativos probablemente lo cubrirán; consulte el MIT Open Courseware). Finalmente, como se mencionó, hay pocas buenas referencias disponibles para la programación de GPU ya que es un campo nuevo. Por lo tanto, su mejor opción será leer el código fuente de ejemplo para aprender cómo se hace.

Finalmente, redes bayesianas y redes neuronales. Primero, tenga en cuenta que estos son bastante diferentes. Las redes bayesianas son una forma gráfica (nodos y bordes) de representar una distribución de probabilidad conjunta sobre un número (generalmente grande) de variables. El término "red neuronal" es algo más vago, pero generalmente se refiere al uso de elementos de procesamiento simples para aprender una función no lineal para clasificar puntos de datos. Un libro que ofrece una buena introducción tanto a las redes de Bayes como a las redes neuronales son los algoritmos de teoría, inferencia y aprendizaje de la información de David J.C. MacKay. El libro está disponible de forma gratuita en línea en http: //www.inference.phy .cam.ac.uk / mackay / itila / . Este libro es, con mucho, mi favorito sobre el tema. La exposición es extremadamente clara y los ejercicios son esclarecedores (la mayoría tiene soluciones).

Si está buscando una introducción amigable a la programación paralela, considere Abrir MPI o Posix Threading en un clúster de CPU. Todo lo que necesita para comenzar con esto es un único procesador multinúcleo.

El consenso general es que la programación múltiple en estas nuevas arquitecturas (gpu, cell, etc.) tiene un camino por recorrer en términos de la madurez de sus modelos de programación y API. Por el contrario, Open MPI y PThreads han existido durante bastante tiempo y existen muchos recursos para aprenderlos. Una vez que te hayas acostumbrado a esto, considera probar las nuevas tecnologías.

Aunque ciertamente hay interfaces de programación para muchos otros lenguajes, C es probablemente el lenguaje moderno más común (Fortran y Pascal todavía están dando vueltas en esta área) en uso en computación de alto rendimiento. Sin embargo, C ++ también es bastante popular, varios paquetes de Bioinformática lo usan. En cualquier caso, C es sin duda un buen punto de partida, y puede subir a C ++ si desea más funciones de lenguaje o bibliotecas (aunque probablemente será a costa del rendimiento).

Si está interesado en la minería de datos, es posible que también desee ver el sistema de código abierto llamado Orange. Se implementa en C ++, pero también admite la programación del usuario final en Python o en un lenguaje visual de enlace y nodo.

No sé si es compatible con NN, pero sí sé que las personas lo usan para aprender técnicas de minería de datos. Admite cosas como las reglas de agrupación y asociación.

(Además, en caso de que no lo supiera, es posible que desee localizar a alguien en su escuela B que se encargue de la gestión de operaciones. Si está interesado en CS y minería de datos, es posible que encuentre personas con ideas afines allí. )

Enlace: gpgpu.org Tiene una discusión interesante

Las últimas versiones de CUDA (3.1, 3.2) tienen un conjunto completo de funciones llamadas CuBLAS que manejarán las operaciones de matriz de múltiples núcleos para usted en configuraciones de una sola tarjeta. Paralelo al backproagation será un desafío un poco más, pero estoy trabajando en ello.

Pude encontrar algunos excelentes cursos de video gratis de Stanford en iTunesU

Metodología de programación (CS106A) Programación de abstracciones (CS106B) Paradigmas de programación (CS107) Aprendizaje automático (CS229) Programación de procesadores paralelos masivos con CUDA

Cada uno de estos cursos tiene alrededor de 20 conferencias, por lo que es una inversión verlos todos, pero vale la pena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top