Hi Kliment,
By far the costliest routine is:
MlOptimiser::doThreadGetSquaredDifferencesAllOrientations
in particular the deepest loop, where the actual squared differences
between references and images are calculated (see code below).
Hope That Helps,
Sjors
PS: Are you planning a GPU-adaptation of relion? That would be cool. I
have no plans to do so myself, but would be happy to provide advice.
diff2
=
exp_highres_Xi2_imgs[my_image_no]
/
2.;
FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(Fimg_shift)
{
double
diff_real
=
(DIRECT_MULTIDIM_ELEM(Frefctf,
n)).real()
-
(DIRECT_MULTIDIM_ELEM(Fimg_shift,
n)).real();
double
diff_imag
=
(DIRECT_MULTIDIM_ELEM(Frefctf,
n)).imag()
-
(DIRECT_MULTIDIM_ELEM(Fimg_shift,
n)).imag();
diff2
+=
(diff_real
*
diff_real
+
diff_imag
*
diff_imag)
*
0.5
*
DIRECT_MULTIDIM_ELEM(Minvsigma2,
n);
> Hi,
>
> I am wondering if it is known what is the slowest step in the calculations
> by relion. Is there a sub-routine/function which is the bottleneck for the
> 2D class averages/3d class averages and 3d auto refinement? Has anyone
> compiled and run relion with gprof to identify the slowest step?
>
> I am asking because if one would want to re-write part of the code for the
> GPUs, one needs to know which step will benefit the most from such an
> optimization.
>
> Thanks,
>
> Klim
>
--
Sjors Scheres
MRC Laboratory of Molecular Biology
Francis Crick Avenue, Cambridge Biomedical Campus
Cambridge CB2 0QH, U.K.
tel: +44 (0)1223 267061
http://www2.mrc-lmb.cam.ac.uk/groups/scheres
|