Differences between revisions 3 and 4
 Deletions are marked like this. Additions are marked like this. Line 22: Line 22: loop _: loop Line 24: Line 24: for all fno normal[fno] = f (inputs) _:_: for all fno normal[fno] = f (inputs) Line 26: Line 26: for a few fno use normal[fno] _:_: for a few fno use normal[fno] Line 28: Line 28: change some inputs _:_: change some inputs Line 30: Line 30: end loop _: end loop Line 32: Line 32: change some inputs _: change some inputs Line 34: Line 34: use some normal[fno] _: use some normal[fno] Line 40: Line 40: loop         for all fno __normal[fno].deferred = true__        for a few fno __if normal[fno].deferred normal[fno] = f (inputs); normal[fno].deferred = false__         change some inputs     end loop     __for a few fno if normal[fno].deferred normal[fno] = f (inputs); normal[fno].deferred = false__     change some inputs     use some normal[fno] . loop   . for all fno __normal[fno].deferred = true__   for a few fno __if normal[fno].deferred normal[fno] = f (inputs); normal[fno].deferred = false__ change some inputs  end loop  __for a few fno if normal[fno].deferred normal[fno] = f (inputs); normal[fno].deferred = false__ change some inputs use some normal[fno]

A variety of techniques have been used.

Deferring calculations until needed

mris_fix_topology has a hot loop, which does unnecessary calculations of the face normals

mrisComputeOptimalRetessellation and mrisComputeRandomRetessellation have a similar structure

_:_: then it loops over a set of patches, or iterates on one patch. For each patch it calls

_:_:_: mrisDefectPatchFitness, which calls

_:_:_:_: mrisComputeDefectLogLikelihood, which calls

_:_:_:_:_: mrisComputeDefectMRILogUnlikelihood, which

_:_:_:_:_:_: does an expensive computation all the face normals for ALL the faces

_:_:_:_:_:_: does two other expensive steps, which only use a few of the face normals

To simplify, the original code does this

_: loop

_:_: for all fno normal[fno] = f (inputs)

_:_: for a few fno use normal[fno]

_:_: change some inputs

_: end loop

_: change some inputs

_: use some normal[fno]

Since only a few of the face normals are used, it is a waste of time to calculate all of them every time around the loop!

This is replaced by code that does

• loop
• for all fno normal[fno].deferred = true for a few fno if normal[fno].deferred normal[fno] = f (inputs); normal[fno].deferred = false change some inputs

end loop

for a few fno if normal[fno].deferred normal[fno] = f (inputs); normal[fno].deferred = false change some inputs use some normal[fno]

MorphoOptimizationProject_BetterSerialCode_DeferCalculations (last edited 2021-09-22 09:46:34 by DevaniCordero)