2009-10-06 15 views
12

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.Comenzando con la programación paralela

Así que 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 unas opciones de pila par que estoy considerando, pero no estoy seguro si me dejan experimento en el trabajo hacia mi objetivo:

  • ¿Debo obtener Snow Leopard y tratar de obtener programas OpenCL Obj-C para ejecutar ejecución en la GPU ATI X1600 en mi computadora portátil ? o
  • ¿Debo obtener una Playstation e intentar escribir el código C en con sus seis núcleos Cell SPE disponibles? o
  • ¿Debo construir una caja Linux con una tarjeta Nvidia y trato de trabajar con CUDA?

Gracias de antemano por su ayuda.

+1

Instale VS2010 o 2012 en Windows, inícielo, vaya a F # interactivo y escriba 'Array.map ((+) 3) [| 1..10 |]'. Has escrito un programa serial F #. Luego escriba 'Array.Parallel.map ((+) 3) [| 1..10 |]'. Eres una programación paralela. –

Respuesta

3

Si le interesa el paralelismo en OS X, asegúrese de consultar Grand Central Dispatch, especialmente dado que la tecnología ha sido de código abierto y puede que pronto tenga una adopción mucho más amplia.

+0

¿Sabes si GCD me permitirá ejecutar FFT en una GPU X1600? – Talesh

+0

Quiere mirar OpenCL en ese caso, no GCD. GCD es para CPU, OpenCL es para GPU. –

2

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.

+0

Estoy pensando que CUDA probablemente sea mi mejor apuesta ya que la comunidad está un poco más desarrollada, Nvidia parece estar comprometida con HPC y bueno ... es C y Linux. Todavía no sé si GPU podrá ejecutar cosas como FFT, o incluso si esa pregunta tiene sentido. – Talesh

+0

FFT tiene mucho sentido. Ver por ejemplo http://www.macresearch.org/cuda-quick-look-and-comparison-fft-performance –

4

Sugeriría ir primero a OpenMP y MPI, no estoy seguro de que importe lo que elija primero, pero definitivamente debería 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: obtenga una buena conexión a tierra 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 utilizar las comunicaciones de difusión en MPI que programarlas en hilos.

Me quedaría con C/C++ en su Mac ya que ya está familiarizado con ellos, y hay buenas libre OpenMP y bibliotecas MPI de código abierto para esa plataforma y esos idiomas.

Y, y para algunos de nosotros es una gran ventaja, lo que se aprende sobre C/C++ y MPI (en menor medida que es verdad de OpenMP también) le será muy útil cuando se gradúan para superordenadores reales.

Todo subjetivo y argumentativo, así que ignore esto si lo desea.

+0

Hola Mark, ¿Tienes un par de enlaces que me puedes enviar para empezar con OpenMP y MPI? -Talesh -Talesh – Talesh

3

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.

0

Quizás 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.

0

Comenzaría con MPI a medida que aprenda a manejar la memoria distribuida. Pacheco's book es un viejo pero un regalo, y MPI funciona bien desde el primer momento en OS X y ahora ofrece un rendimiento multinúcleo bastante bueno.