2011-07-04 17 views
5

Quiero escribir una estrategia para evaluar elementos en una matriz en paralelo. Las viejas estrategias tenían parArr para hacer esto (see here). Pero esto no se encuentra en el nuevo módulo Control.Parallel.Strategies.Cómo escribir estrategias de matriz Haskell

E.g. Evaluación lista paralela: map f myList `using` parList rdeepseq

que le gustaría ser capaz de hacer algo como: amap f myArr `using` parArr rdeepseq, donde amap es de Data.Array.Base y aplica una función a cada uno de los elementos (secuencialmente).

Lo siguiente parece funcionar pero me pregunto si lo está haciendo bien, y quiero saber cómo podría definir mi propio parArr.

Esto funciona: amap ((+1) `using` rpar) $ Array.array (0,4) [(0,10),(1,20),(2,30),(3,40),(4,50)]

+0

@ dave4420: gracias por la edición :-) – vis

+3

¿Estás seguro de que funciona? Porque '' (+1) 'usando' rpar'' es bastante extraño. Evaluará la expresión '(+1)' en paralelo, lo cual no tiene mucho sentido porque '(+1)' es una expresión lambda, por lo tanto, ya está en WHNF y no queda nada por evaluar. Puede que haya querido decir '' amap (('using' rpar). (+ 1)) '', ¿no? – Rotsor

+4

¿Por qué no utilizar 'repa' o' vector', que ya tienen estrategias paralelas, y son mucho más flexibles en general? –

Respuesta

4

Para una previous question, escribí una estrategia de evaluación paralela para el paquete de vectores. Ese debería ser un buen lugar para comenzar. Puede see the code on hackage en el paquete vector-strategies.

No tengo tiempo para dar una respuesta completa, quizás la edite más adelante. Siéntete libre de comentar con preguntas y dirección extra.

+0

Esto me ha dado una buena idea sobre las estrategias de escritura. También hay un enlace a github que muestra cómo usar 'parTraversable' en arreglos simples. En mi caso, esto debería dar el comportamiento que esperaba. – vis

2

Además de todos los buenos consejos dados: El motivo de que no hay parArr más es simplemente que ha sido reemplazado por el más general parTraversable. Solo di:

amap f myArr `using` parTraversable rdeepseq 

Eso debería darte el comportamiento que pediste.

+0

Gracias Peter, por hacerme comprender que el 'parTraversable' hace exactamente lo que yo esperaría que' parArr' hiciera. +1 – vis

Cuestiones relacionadas