|
View:
New views
1 Messages
—
Rating Filter:
Alert me
|
|
|
diff: fix unwanted parallel dependenciescompiler/polymprphism.m:
Fix a problem identified by Paul that introduced unwanted dependencies (and thus synchronization) into parallel conjunctions. Zoltan. cvs diff: Diffing . Index: md4.m =================================================================== RCS file: /home/mercury/mercury1/repository/mercury/compiler/md4.m,v retrieving revision 1.1 diff -u -b -r1.1 md4.m --- md4.m 16 Apr 2009 01:45:08 -0000 1.1 +++ md4.m 31 Oct 2009 12:15:49 -0000 @@ -267,4 +267,3 @@ sorry($file, $pred). %-----------------------------------------------------------------------------% -% vim: ft=mercury ts=8 sts=4 sw=4 et Index: polymorphism.m =================================================================== RCS file: /home/mercury/mercury1/repository/mercury/compiler/polymorphism.m,v retrieving revision 1.348 diff -u -b -r1.348 polymorphism.m --- polymorphism.m 22 Sep 2009 07:34:16 -0000 1.348 +++ polymorphism.m 2 Nov 2009 05:49:38 -0000 @@ -1098,7 +1098,17 @@ % The rest of the cases just process goals recursively. ( GoalExpr0 = conj(ConjType, Goals0), - polymorphism_process_conj(Goals0, Goals, !Info), + ( + ConjType = plain_conj, + polymorphism_process_plain_conj(Goals0, Goals, !Info) + ; + ConjType = parallel_conj, + get_maps_snapshot(!.Info, InitialSnapshot), + polymorphism_process_par_conj(Goals0, Goals, InitialSnapshot, + !Info) + % Unlike with disjunctions, we do not have to reset to + % InitialSnapshot. + ), GoalExpr = conj(ConjType, Goals) ; GoalExpr0 = disj(Goals0), @@ -1941,13 +1951,30 @@ varset.lookup_name(TypeVarSet, TVar, TVarName0), TVarName = "_" ++ TVarName0. -:- pred polymorphism_process_conj(list(hlds_goal)::in, +:- pred polymorphism_process_plain_conj(list(hlds_goal)::in, list(hlds_goal)::out, poly_info::in, poly_info::out) is det. -polymorphism_process_conj([], [], !Info). -polymorphism_process_conj([Goal0 | Goals0], [Goal | Goals], !Info) :- +polymorphism_process_plain_conj([], [], !Info). +polymorphism_process_plain_conj([Goal0 | Goals0], [Goal | Goals], !Info) :- + polymorphism_process_goal(Goal0, Goal, !Info), + polymorphism_process_plain_conj(Goals0, Goals, !Info). + +:- pred polymorphism_process_par_conj(list(hlds_goal)::in, + list(hlds_goal)::out, maps_snapshot::in, poly_info::in, poly_info::out) + is det. + +polymorphism_process_par_conj([], [], _, !Info). +polymorphism_process_par_conj([Goal0 | Goals0], [Goal | Goals], + InitialSnapshot, !Info) :- + % Any variable that a later parallel conjunct reuses from an earlier + % parallel conjunct (a) will definitely require synchronization, whose + % cost will be greater than the cost of building a typeinfo from scratch, + % and (b) may drastically reduce the available parallelism, if the earlier + % conjunct produces the variable late but the later conjunct requires it + % early. + set_maps_snapshot(InitialSnapshot, !Info), polymorphism_process_goal(Goal0, Goal, !Info), - polymorphism_process_conj(Goals0, Goals, !Info). + polymorphism_process_par_conj(Goals0, Goals, InitialSnapshot, !Info). :- pred polymorphism_process_disj(list(hlds_goal)::in, list(hlds_goal)::out, maps_snapshot::in, poly_info::in, poly_info::out) is det. cvs diff: Diffing notes -------------------------------------------------------------------------- mercury-reviews mailing list Post messages to: mercury-reviews@... Administrative Queries: owner-mercury-reviews@... Subscriptions: mercury-reviews-request@... -------------------------------------------------------------------------- |
| Free embeddable forum powered by Nabble | Forum Help |