2009-11-09 10 views
12

Estoy buscando asignar una función modestamente costosa a una gran secuencia secuencial en paralelo. pmap es genial, pero estoy perdiendo mucho con el cambio de contexto. Creo que necesito aumentar el tamaño del trabajo que pasa a cada hilo.cómo aplicar de manera eficiente una función de peso medio en paralelo

Escribí sobre una función para dividir el seq en fragmentos y asignar la función a cada fragmento y recombinarlos. esto 'funciona', pero los resultados no han sido espectaculares. El código original era esencialmente el aspecto siguiente:

(pmap eval-polynomial (range x) coificients) 

¿Cómo puede realmente squeez esto mientras se mantiene flojo?

Respuesta

0

Me gustaría ver la biblioteca Fork/Join, configurada para integrarse en JDK 7. Se trata de un modelo de subprocesamiento ligero optimizado para cálculos sin bloqueo y dividir y conquistar en un conjunto de datos, utilizando un grupo de subprocesos, un planificador de robo de trabajo y hilos verdes.

Some work ha sido hecho para envolver la API Fork/Join en la rama par, pero no se ha fusionado en main (yet).

+1

Sí si se puede esperar a que la rama de la par que lo haría, los pequeños trozos que he visto de él son alucinantes. – Runevault

+1

@Runevault, ¿cómo es la alucinante. Parece que una envoltura en la horquilla se une al – Surya

1

Si no te importa algo un poco exótico (a cambio de una aceleración notable), también puedes consultar el trabajo realizado por el autor de la biblioteca de Penumbra, que proporciona easy access to the GPU.

3

Miraría la función ppmap desde: http://www.braveclojure.com/zombie-metaphysics/. Le permite pmap mientras especifica el tamaño del fragmento.

La solución a este problema es aumentar el tamaño de grano, o el cantidad de trabajo realizado por cada tarea paralelizada. En este caso, la tarea es aplicar la función de mapeo a un elemento de la colección. El tamaño del grano no se mide en ninguna unidad estándar, pero se podría decir que el tamaño de grano de pmap es uno por defecto. Aumentar el tamaño de grano a dos significaría que está aplicando la función de mapeo a dos elementos en lugar de uno, por lo que el hilo en el que está la tarea está haciendo más trabajo. [...] Solo por diversión, podemos generalizar esta técnica en una función llamada ppmap, para pmap particionado. Se puede recibir más de un colección, al igual que el mapa:

(defn ppmap 
    "Partitioned pmap, for grouping map ops together to make parallel 
    overhead worthwhile" 
    [grain-size f & colls] 
    (apply concat 
    (apply pmap 
      (fn [& pgroups] (doall (apply map f pgroups))) 
      (map (partial partition-all grain-size) colls)))) 
(time (dorun (ppmap 1000 clojure.string/lower-case orc-name-abbrevs))) 
; => "Elapsed time: 44.902 msecs" 
+1

Los enlaces vienen y van, stackoverflow es para siempre ... ¿Podría incluir la cita relevante de braveclojure para asegurarse de que esta respuesta permanezca en contexto a largo plazo? (también esta pregunta tiene casi 7 años) –

Cuestiones relacionadas