concurrency - paralelismo - Comenzando con la programación paralela
paralelismo arquitectura de computadoras (7)
Comenzaría con MPI a medida que aprenda a manejar la memoria distribuida. El libro de Pacheco es antiguo, pero bueno, y MPI funciona perfectamente con OS X, que ahora ofrece un rendimiento multinúcleo bastante bueno.
Por lo tanto, parece multinúcleo y todas sus complicaciones asociadas llegaron para quedarse. Estoy planeando un proyecto de software que definitivamente se beneficiará del paralelismo. El problema es que tengo muy poca experiencia en escribir software concurrente. Lo estudié en la Universidad y entiendo muy bien los conceptos y la teoría, pero tengo cero experiencia en la experiencia útil en la creación de software para ejecutar en múltiples procesadores desde la escuela.
Entonces mi pregunta es, ¿cuál es la mejor manera de comenzar con la programación multiprocesador? Estoy familiarizado principalmente con el desarrollo de Linux en C / C ++ y Obj-C en Mac OS X con casi cero experiencia en Windows. Además, mi proyecto de software planificado requerirá FFT y probablemente comparaciones en coma flotante de una gran cantidad de datos.
Hay hilos OpenCL, OpenMP, MPI, POSIX, etc ... ¿Con qué tecnologías debería empezar?
Estas son algunas opciones de pila que estoy considerando, pero no estoy seguro si me permitirán experimentar con mi objetivo:
- ¿Debo obtener Snow Leopard y tratar de obtener los programas OpenCL Obj-C para ejecutar la ejecución en la GPU ATI X1600 en mi computadora portátil? o
- ¿Debería obtener una Playstation e intentar escribir el código C para lanzar a través de sus seis núcleos Cell SPE disponibles? o
- ¿Debo construir una caja Linux con una tarjeta Nvidia e intentar trabajar con CUDA?
Gracias de antemano por tu ayuda.
Deberías aprender algo de Erlang . Para bien.
El tradicional e imperativo "estado compartido con cerraduras" no es su única opción. Rich Hickey, el creador de Clojure, un Lisp 1 para JVM, hace un argumento muy convincente contra el estado compartido. Básicamente argumenta que es casi imposible hacerlo bien. Es posible que desee leer sobre los mensajes que pasan los actores de Erlang o las bibliotecas de STM.
No necesita hardware especial como tarjetas gráficas y celdas para hacer programación paralela. Su CPU simple multi-core también se beneficiará con la programación paralela. Si tiene experiencia con C / C ++ y objetivo-c, comience con uno de esos y aprenda a usar los hilos. Comienza con ejemplos simples como la multiplicación de matrices o la resolución de laberintos y aprenderás sobre esos problemas molestos (el software paralelo no es determinista y está lleno de heisenbugs).
Si quieres entrar en el multiparallelismo masivo, elegiría openCL porque es el más portátil. Cuda todavía tiene una comunidad más grande, más documentación y ejemplos, y es un poco más fácil, pero tienes una tarjeta nvidia.
Si está interesado en el paralelismo en OS X, asegúrese de consultar el Grand Central Dispatch , especialmente dado que la tecnología ha sido de código abierto y es probable que pronto tenga una adopción mucho más amplia.
Sugeriría ir al OpenMP y al MPI inicialmente, sin estar seguro de cuál es el tema que elijas primero, pero definitivamente deberías querer (en mi opinión :-)) aprender acerca de la memoria compartida y distribuida para la computación paralela.
Sugiero evitar los hilos OpenCL, CUDA, POSIX, al principio: obtener una buena base en los principios básicos de las aplicaciones paralelas antes de comenzar a luchar con la subestructura. Por ejemplo, es mucho más fácil aprender a usar las comunicaciones de difusión en MPI que programarlas en hilos.
Me quedaría con C / C ++ en tu Mac ya que ya estás familiarizado con ellos, y hay buenas librerías OpenMP y MPI de código abierto para esa plataforma y esos idiomas.
Y, para algunos de nosotros, es una gran ventaja, cualquier cosa que aprendas sobre C / C ++ y MPI (en menor medida también es cierto para OpenMP) te servirá bien cuando te gradúes en supercomputadores reales.
Todo subjetivo y argumentativo, así que ignore esto si lo desea.
Tal vez su problema sea adecuado para el paradigma MapReduce . Se ocupa automáticamente del equilibrio de carga y problemas de concurrencia, el documento de investigación de Google ya es un clásico. Tiene una implementación de una sola máquina llamada Mars que se ejecuta en GPU, esto puede funcionar bien para usted. También hay Phoenix que ejecuta map-reduce en multinúcleo y multiprocesadores simétricos.