2009-04-03 6 views
1

Comment est-ce code:Am confus au sujet parallèle Haskell

parfib :: Int -> Int 
parfib 0 = 1 
parfib 1 = 1 
parfib n = nf2 `par` (nf1 `par` (nf1+nf2+1)) 
      where nf1 = parfib (n-1) 
       nf2 = parfib (n-2) 

Mieux que cela:

parfib :: Int -> Int 
parfib 0 = 1 
parfib 1 = 1 
parfib n = nf2 `par` (nf1 `seq` (nf1+nf2+1)) 
      where nf1 = parfib (n-1) 
       nf2 = parfib (n-2) 

Je ne reçois pas les explications que j'ai trouvé en ligne qui disent « Afin de garantir que l'expression principale est évaluée dans le bon ordre (c'est-à-dire sans bloquer la tâche principale de la tâche enfant), l'annotation seq est utilisée ".

Pourquoi seq est-il utilisé? Je sais que ça oblige l'interprète à évaluer parfib (n-1) en premier mais pourquoi est-ce nécessaire?

Lors de l'exécution du second programme, l'interpéteur ne déclenchera-t-il pas un nouveau processus pour évaluer nf2, tout en évaluant nf1 de l'expression nf1 + nf2 + 1 en parallèle? Quel est le besoin de lui dire de spécifier qu'il devrait commencer par nf1?

+0

Cela devrait probablement être 'pseq', pas' seq' (http://www.haskell.org/hoogle/?hoogle=pseq) – Matt

Répondre

4

Cela n'a pas beaucoup de sens d'évaluer nf1 en parallèle à nf1+... puisque ce dernier dépend de nf1, donc tout ce qu'il ferait est de bloquer l'étincelle de nf1. En utilisant seq, il essayera seulement d'utiliser nf1 une fois que vous savez qu'il a été évalué.

0

ce pourrait être parce que nous voulons réduire le nombre d'étincelles de ma compréhension les deux vesrsion produira le même résultat

mais avec la première option vous sera déclenché deux processus supplémentaires (NF1, NF2). Mais lorsque nous utilisons seq, nous ne faisons qu'éclater un seul processus additionnel (nf1).

Questions connexes