programacion paralelos paralelizacion paralelismo paralela nivel lenguajes ejemplos algoritmos multithreading pthreads parallel-processing openmp

multithreading - paralelos - ¿Qué API de programación en paralelo usas?



programacion paralela ejemplos (20)

¿Qué tal Open CL ?

Intentando comprender cómo las personas actualmente están escribiendo código paralelo en la actualidad, considerando la inmensa importancia del hardware multinúcleo y multiproceso en estos días. Para mí, parece que el paradigma dominante es pthreads (hilos POSIX), que es nativo en Linux y está disponible en Windows. Las personas de HPC tienden a usar OpenMP o MPI, pero parece que no hay muchos aquí en StackOverflow. ¿O confía en el enhebrado de Java, las API de enhebrado de Windows, etc. en lugar de los estándares portátiles? ¿Cuál es la forma recomendada, en su opinión, para hacer programación paralela?

¿O estás usando cosas más exóticas como Erlang, CUDA, RapidMind, CodePlay, Oz o incluso querida vieja Occam?

Aclaración: Estoy buscando soluciones que sean bastante portátiles y aplicables a plataformas como Linux, varios unixes, en varias arquitecturas de host. Windows es un caso raro que es agradable de soportar. Entonces, C # y .net son muy limitados aquí, el CLR es una genial tecnología, pero PODRÍAN SACARLO para el host de Linux, para que sea tan frecuente como JVM, Python, Erlang o cualquier otro lenguaje portátil.

Basado en C ++ o JVM: probablemente C ++, ya que las JVM tienden a ocultar el rendimiento.

MPI: Estoy de acuerdo en que incluso las personas de HPC lo ven como una herramienta difícil de usar, pero para ejecutar en 128000 procesadores, es la única solución escalable para los problemas en los que no se aplica map / reduce. Sin embargo, el paso de mensajes tiene una gran elegancia, ya que es el único estilo de programación que parece escalar muy bien a la memoria local / AMP, memoria compartida / SMP, entornos distribuidos de tiempo de ejecución.

Un nuevo contendiente interesante es el MCAPI . pero no creo que nadie haya tenido tiempo para tener ninguna experiencia práctica con eso todavía.

Entonces, en general, la situación parece ser que hay muchos proyectos interesantes de Microsoft que no sabía, y que las API o pthreads de Windows son las implementaciones más comunes en la práctica.


+1 para PLINQ

Win32 Threads, Threadpool y fibras, objetos de sincronización


Empezamos a buscar extensiones paralelas de Microsoft, todavía no se ha publicado, pero muestra potencial.


Gthreads de la biblioteca glibc http://library.gnome.org/devel/glib/stable/glib-Threads.html compila hasta pthreads, para que no pierdas ningún rendimiento. También le ofrecen grupos de subprocesos muy potentes y colas de mensajes entre subprocesos. Los he usado con éxito varias veces, y estoy muy contento con las funciones disponibles.


La mayoría de los programas concurrentes que he escrito estaban en Ada , que tiene soporte completo para el paralelismo nativo en el idioma. Una de las ventajas de esto es que su código paralelo es portátil para cualquier sistema con un compilador Ada. No se requiere una biblioteca especial.



MPI no es tan difícil como la mayoría lo hace parecer. Hoy en día, creo que un enfoque multi-paradigma es más adecuado para aplicaciones paralelas y distribuidas. Use MPI para su nodo a la comunicación y sincronización de nodos y OpenMP o PThreads para su paralelización más granular. Piense en MPI para cada máquina y OpenMP o PThreads para cada núcleo. Esto parece escalar un poco mejor que generar un nuevo MPI Proc para cada núcleo en el futuro cercano.

Tal vez para dual o quad core en este momento, generar un proc para cada núcleo en una máquina no tendrá mucha sobrecarga, pero a medida que nos acerquemos a más y más núcleos por máquina donde la caché y la memoria no están escalando tanto, sería más apropiado usar un modelo de memoria compartida.


Mantengo un blog de enlace de simultaneidad que ha cubierto un montón de estos a lo largo del tiempo (y continuará haciéndolo):

http://concurrency.tumblr.com


Mucho depende de tu entorno.

Para palin old C, nada mejor que POSIX.

Para C ++ hay una biblioteca de threading muy buena de BOOST.ORG gratis.

Java solo usa el enrutamiento nativo de Java.

También puede buscar otras formas de lograr el paralelismo que no sea el de enhebrar, como dividir su aplicación en los procesos del cliente y del servidor y usar la mensajería asíncrona para comunicarse. Hecho correctamente, esto puede escalar hasta miles de usuarios en docenas de servidores.

También vale la pena recordar que si está usando Windows MFC, el entorno de ventanas Gnome o Qt, se encuentra automáticamente en un entorno multiproceso. Si está utilizando Apache ISS o J2EE, su aplicación ya se está ejecutando dentro de un entorno multiproceso multiproceso.


No es paralelo per se y no tiene un modelo distribuido, pero puede escribir código altamente concurrente en la JVM usando Clojure. A continuación, obtiene la gran cantidad de bibliotecas de Java disponibles para usted. Tendría que implementar sus propios paralelos en la parte superior de Clojure, pero eso debería ser relativamente fácil. Repito que aún no tiene un modelo distribuido.


Para .Net he utilizado con gran éxito RetLang . Para JVM, Scale es genial.


Solo conozco Java hasta ahora, el soporte de multi threading funcionó bien para mí ...


Tenga en cuenta que las respuestas aquí no serán una respuesta estadísticamente representativa para "usar realmente". Ya veo una cantidad de respuestas "X es agradable".

Personalmente he usado Windows Threads en muchos proyectos. La otra API que he visto en amplio uso es pthreads. En el frente de HPC, MPI todavía se toma en serio por las personas que lo usan. <subjective> No lo hago, combina toda la elegancia de C ++ con el rendimiento de Javascript. Sobrevive porque no hay una alternativa decente. Perderá con las máquinas NUMA estrechamente acopladas en un lado y con el mapa al estilo Google, por el otro. </subjective>


Uso MPI y me gusta mucho. Te obliga a pensar en la jerarquía de la memoria, pero en mi experiencia, pensar en tales cosas es importante para el alto rendimiento de todos modos. En muchos casos, MPI puede ocultarse en gran parte detrás de objetos paralelos específicos del dominio (por ejemplo, PETSc para resolver ecuaciones lineales y no lineales).


Utilicé ACE para permitir a los desarrolladores utilizar el estilo POSIX (o Windows) en cualquier plataforma.


Utilicé OpenMP mucho principalmente debido a su simplicidad, portabilidad y flexibilidad. Es compatible con varios idiomas incluso C ++ / Cli todopoderoso :)


Yo recomendaría OpenMP . Microsoft lo ha incluido en el compilador de Visual C ++ 2005, por lo que es compatible, y no necesita hacer nada más que compilar con la directiva / omp.

Es fácil de usar, aunque obviamente no hace todo por ti, pero nada lo hace. Lo uso para correr en paralelo para bucles en general sin ningún tipo de molestia, para cosas más complejas que tienden a rodar el mío (por ejemplo, tengo código de hace años que corté, pegué y modifiqué).

Puede probar Cilk ++ que se ve bien, y tiene un libro electrónico "Cómo sobrevivir a la revolución de software multinúcleo" .

Ambos tipos de sistema intentan paralelizar el código de serie, es decir, tomar un bucle de ejecución en todos los núcleos simultáneamente de la manera más fácil posible. No tienden a ser bibliotecas de hilos de propósito general. (Por ejemplo, un documento de investigación (pdf) describió el rendimiento de los diferentes tipos de agrupaciones de subprocesos implementados en openMP y se sugirió que se agreguen 2 operaciones nuevas: ceder y dormir. Creo que están perdiendo el punto de OpenMP un poco allí)

Como mencionaste OpenMP, supongo que estás hablando de c ++ nativo, no de C # o .NET.

Además, si las personas de HPC (que supongo que son expertos en este tipo de dominio) parecen estar usando OpenMP o MPI, entonces esto es lo que deberían usar, ¡no lo que los lectores de SO son!


Yo uso open cl. Creo que es bastante más fácil de usar en comparación con mpi. También he usado mpi antes como un requisito para mi curso de computación paralela y distribuida, pero creo que tienes que hacer demasiado trabajo manual. Voy a comenzar trabajar en CUDA en unos pocos días. CUDA es muy similar a open cl pero el problema es que CUDA es solo para productos de nvidia.


pycuda ... nada como 25000 hilos activos :) [urdimbre programada con marcador]. cuda 2 tiene soporte de flujo, así que no estoy seguro de qué streamit traería. Las extensiones de Matlab de CUDA se ven bien, al igual que PLUTO y los próximos PetaBricks de MIT.

en cuanto a otros, falta el enhebrado de pitón; MPI, etc. son complicados, y no tengo un clúster, pero supongo que logran para lo que están diseñados; Paré la programación de c # antes de llegar a los apartamentos de la secuencia (probablemente algo bueno).


Parallel FX Library (PFX) : una biblioteca de concurrencia administrada desarrollada por una colaboración entre Microsoft Research y el equipo de CLR en Microsoft para su inclusión en una futura revisión de .NET Framework. Está compuesto de dos partes: Parallel LINQ (PLINQ) y Task Parallel Library (TPL). También consiste en un conjunto de estructuras de datos de coordinación (CDS): un conjunto de estructuras de datos utilizadas para sincronizar y coordinar la ejecución de tareas concurrentes. La biblioteca se lanzó como CTP el 29 de noviembre de 2007 y se actualizó nuevamente en diciembre de 2007 y junio de 2008.

No mucha experiencia, aunque ...