Xmipp  v3.23.11-Nereus
Classes | Public Member Functions | Static Protected Member Functions | Protected Attributes | List of all members
ProgRecFourierStarPU Class Reference

#include <reconstruct_fourier_starpu.h>

Inheritance diagram for ProgRecFourierStarPU:
Inheritance graph
[legend]
Collaboration diagram for ProgRecFourierStarPU:
Collaboration graph
[legend]

Classes

struct  BatchProvider
 
struct  ComputeConstants
 
struct  ComputeStarPUResult
 
struct  Params
 
struct  SimpleBatchProvider
 

Public Member Functions

 ProgRecFourierStarPU ()
 
void defineParams () override
 
void readParams () override
 
void show () const override
 
void run () override
 
void setIO (const FileName &fn_in, const FileName &fn_out) override
 
- Public Member Functions inherited from ProgReconsBase
virtual ~ProgReconsBase ()
 
- Public Member Functions inherited from XmippProgram
const char * getParam (const char *param, int arg=0)
 
const char * getParam (const char *param, const char *subparam, int arg=0)
 
int getIntParam (const char *param, int arg=0)
 
int getIntParam (const char *param, const char *subparam, int arg=0)
 
double getDoubleParam (const char *param, int arg=0)
 
double getDoubleParam (const char *param, const char *subparam, int arg=0)
 
float getFloatParam (const char *param, int arg=0)
 
float getFloatParam (const char *param, const char *subparam, int arg=0)
 
void getListParam (const char *param, StringVector &list)
 
int getCountParam (const char *param)
 
bool checkParam (const char *param)
 
bool existsParam (const char *param)
 
void addParamsLine (const String &line)
 
void addParamsLine (const char *line)
 
ParamDefgetParamDef (const char *param) const
 
virtual void quit (int exit_code=0) const
 
virtual int tryRun ()
 
void initProgress (size_t total, size_t stepBin=60)
 
void setProgress (size_t value=0)
 
void endProgress ()
 
void processDefaultComment (const char *param, const char *left)
 
void setDefaultComment (const char *param, const char *comment)
 
virtual void initComments ()
 
void setProgramName (const char *name)
 
void addUsageLine (const char *line, bool verbatim=false)
 
void clearUsage ()
 
void addExampleLine (const char *example, bool verbatim=true)
 
void addSeeAlsoLine (const char *seeAlso)
 
void addKeywords (const char *keywords)
 
const char * name () const
 
virtual void usage (int verb=0) const
 
virtual void usage (const String &param, int verb=2)
 
int version () const
 
virtual void read (int argc, const char **argv, bool reportErrors=true)
 
virtual void read (int argc, char **argv, bool reportErrors=true)
 
void read (const String &argumentsLine)
 
 XmippProgram ()
 
 XmippProgram (int argc, const char **argv)
 
virtual ~XmippProgram ()
 

Static Protected Member Functions

static void prepareMetaData (const FileName &fn_in, MetaDataVec &SF)
 
static uint32_t computeBatchCount (const Params &params, const MetaData &SF)
 
static void prepareConstants (const Params &params, const MetaData &SF, const FileName &fn_sym, ComputeConstants &constants)
 
static void initStarPU ()
 
static ComputeStarPUResult computeStarPU (const Params &params, const MetaData &SF, const ComputeConstants &computeConstants, BatchProvider &batches, bool verbose)
 
static void shutdownStarPU ()
 
static void postProcessAndSave (const Params &params, const ComputeConstants &computeConstants, const FileName &fn_out, std::complex< float > ***tempVolume, float ***tempWeights)
 

Protected Attributes

FileName fn_in
 
FileName fn_out
 
FileName fn_sym
 
struct ProgRecFourierStarPU::Params params
 
MetaDataVec SF
 
struct ProgRecFourierStarPU::ComputeConstants computeConstants
 
- Protected Attributes inherited from XmippProgram
int errorCode
 
ProgramDefprogDef
 Program definition and arguments parser. More...
 
std::map< String, CommentListdefaultComments
 
int argc
 Original command line arguments. More...
 
const char ** argv
 

Additional Inherited Members

- Public Attributes inherited from XmippProgram
bool doRun
 
bool runWithoutArgs
 
int verbose
 Verbosity level. More...
 
int debug
 
- Protected Member Functions inherited from XmippProgram
void defineCommons ()
 

Detailed Description

Definition at line 44 of file reconstruct_fourier_starpu.h.

Constructor & Destructor Documentation

◆ ProgRecFourierStarPU()

ProgRecFourierStarPU::ProgRecFourierStarPU ( )
inline

Definition at line 118 of file reconstruct_fourier_starpu.h.

118  {
119  // Check that there is no logical problem in the defines used by program. If found, error is thrown.
120  if (!((TILE == 1) || (BLOCK_DIM % TILE == 0))) {
121  REPORT_ERROR(ERR_PARAM_INCORRECT,"TILE has to be set to 1(one) or BLOCK_DIM has to be a multiple of TILE");
122  }
123  if ((SHARED_IMG == 1) && (TILE != 1)) {
124  REPORT_ERROR(ERR_PARAM_INCORRECT,"TILE cannot be used while SHARED_IMG is active");
125  }
126  if (TILE >= BLOCK_DIM) {
127  REPORT_ERROR(ERR_PARAM_INCORRECT,"TILE must be smaller than BLOCK_DIM");
128  }
129  if ((SHARED_BLOB_TABLE == 1) && (PRECOMPUTE_BLOB_VAL == 0)) {
130  REPORT_ERROR(ERR_PARAM_INCORRECT,"PRECOMPUTE_BLOB_VAL must be set to 1(one) when SHARED_BLOB_TABLE is active");
131  }
132  }
Parameter incorrect.
Definition: xmipp_error.h:181
constexpr int BLOCK_DIM
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
constexpr int SHARED_IMG
constexpr int TILE
constexpr int SHARED_BLOB_TABLE
constexpr int PRECOMPUTE_BLOB_VAL

Member Function Documentation

◆ computeBatchCount()

uint32_t ProgRecFourierStarPU::computeBatchCount ( const Params params,
const MetaData SF 
)
staticprotected

Definition at line 118 of file reconstruct_fourier_starpu.cpp.

118  {
119  return (static_cast<uint32_t>(SF.size()) + params.batchSize - 1) / params.batchSize;
120 }
virtual size_t size() const =0
struct ProgRecFourierStarPU::Params params

◆ computeStarPU()

ProgRecFourierStarPU::ComputeStarPUResult ProgRecFourierStarPU::computeStarPU ( const Params params,
const MetaData SF,
const ComputeConstants computeConstants,
BatchProvider batches,
bool  verbose 
)
staticprotected

Definition at line 317 of file reconstruct_fourier_starpu.cpp.

319  {
320 
321  uint32_t maxVolumeIndex = computeConstants.maxVolumeIndex;
322  uint32_t paddedImgSize = computeConstants.paddedImgSize;
323 
324  // Initialize GPU
326  reconstruct_cuda_initialize_constants(maxVolumeIndex, maxVolumeIndex,
327  static_cast<float>(params.blob.radius),
328  static_cast<float>(params.blob.alpha),
329  computeConstants.iDeltaSqrt, static_cast<float>(computeConstants.iw0),
330  1.f / getBessiOrderAlpha(params.blob));
331 
332  std::vector<size_t> selFileObjectIds;
333  SF.findObjects(selFileObjectIds);
334  const uint32_t fftSizeX = maxVolumeIndex / 2;
335  const uint32_t fftSizeY = maxVolumeIndex;
336 
337  PaddedImageToFftArgs imageToFftArg = {
339  paddedImgSize,
340  fftSizeX, fftSizeY
341  };
342 
343  ReconstructFftArgs reconstructFftArg = {
344  static_cast<float>(params.blob.radius),
345  maxVolumeIndex,
347  params.blob.order,
348  static_cast<float>(params.blob.alpha),
349  static_cast<uint32_t>(computeConstants.R_symmetries.size()),
350  fftSizeX, fftSizeY
351  };
352 
353  starpu_data_handle_t resultVolumeHandle = {0};
354  starpu_data_handle_t resultWeightsHandle = {0};
355 
356  ComputeStarPUResult result;
357 
358  {
359  /*
360  * Allocate 3D array (continuous) of given size^3.
361  * Allocated array is cleared (to zero)
362  */
363  uint32_t dim = static_cast<uint32_t>(maxVolumeIndex + 1);
364  uint32_t dim3 = align(dim * dim * dim, 4); // Make the array size always a multiple of 4, for faster redux operations
365  size_t volumeDataSize = dim3 * sizeof(std::complex<float>);
366  size_t weightDataSize = dim3 * sizeof(float);
367  CHECK_STARPU(starpu_malloc((void **) &result.volumeData, volumeDataSize));
368  CHECK_STARPU(starpu_malloc((void **) &result.weightsData, weightDataSize));
369  // As a final step, StarPU will redux the data created on GPU into this
370  memset(result.volumeData, 0, volumeDataSize);
371  memset(result.weightsData, 0, weightDataSize);
372 
373  starpu_vector_data_register(&resultVolumeHandle, STARPU_MAIN_RAM, (uintptr_t) result.volumeData, dim3, sizeof(std::complex<float>));
374  starpu_vector_data_register(&resultWeightsHandle, STARPU_MAIN_RAM, (uintptr_t) result.weightsData, dim3, sizeof(float));
375  starpu_data_set_reduction_methods(resultVolumeHandle, &codelets.redux_sum_volume, &codelets.redux_init_volume);
376  starpu_data_set_reduction_methods(resultWeightsHandle, &codelets.redux_sum_weights, &codelets.redux_init_weights);
377  starpu_data_set_name(resultVolumeHandle, "Result Volume Data");
378  starpu_data_set_name(resultWeightsHandle, "Result Weights Data");
379  }
380 
381  starpu_data_handle_t blobTableSquaredHandle = {0};
382  if (params.fastLateBlobbing) {
383  // Blob Table is not used on GPU, but we need to register empty regardless
384  starpu_variable_data_register(&blobTableSquaredHandle, -1, 0, 1);
385  } else {
386  starpu_variable_data_register(&blobTableSquaredHandle, STARPU_MAIN_RAM,
387  reinterpret_cast<uintptr_t>(&computeConstants.blobTableSqrt), sizeof(computeConstants.blobTableSqrt));
388  }
389  starpu_data_set_name(blobTableSquaredHandle, "Blob Table Squared");
390 
391  const uint32_t totalImages = static_cast<uint32_t>(SF.size());
392  const uint32_t maxBatches = batches.maxBatches();
393 
394  std::vector<LoadProjectionArgs> loadProjectionArgs;
395  // WARNING: Backing arrays of this vector must never reallocate, as we use pointers into it for codelet arguments
396  loadProjectionArgs.reserve(maxBatches);
397 
398  // Used in a STARPU_SCRATCH mode, so the handle can be shared between all relevant tasks,
399  // as the all will get a different memory to work with.
400  starpu_data_handle_t fftScratchMemoryHandle = {0};
401  // As documented in http://fftw.org/fftw3_doc/Multi_002dDimensional-DFTs-of-Real-Data.html#Multi_002dDimensional-DFTs-of-Real-Data
402  uint32_t fftResultX = paddedImgSize/2+1;
403  starpu_matrix_data_register(&fftScratchMemoryHandle, -1, 0, fftResultX /* no padding */, fftResultX, paddedImgSize, sizeof(float) * 2);
404  starpu_data_set_name(fftScratchMemoryHandle, "Scratch for raw FFT");
405 
406  int32_t batch;
407  while ((batch = batches.nextBatch()) != -1) {
408  const uint32_t batchStart = batch * params.batchSize;
409  const uint32_t batchEnd = XMIPP_MIN(batchStart + params.batchSize, totalImages);
410  const uint32_t currentBatchSize = static_cast<uint32_t>(batchEnd - batchStart);
411 
412  starpu_data_handle_t amountLoadedHandle = {0};
413  starpu_variable_data_register(&amountLoadedHandle, -1, 0, sizeof(LoadedImagesBuffer));
414  starpu_data_set_name(amountLoadedHandle, "Batch Meta Data");
415 
416  starpu_data_handle_t paddedImagesDataHandle = {0};
417  starpu_vector_data_register(&paddedImagesDataHandle, -1, 0, currentBatchSize, align(paddedImgSize * paddedImgSize * sizeof(float), ALIGNMENT));
418  starpu_data_set_name(paddedImagesDataHandle, "Batch Padded Image Data");
419 
420  starpu_data_handle_t traverseSpacesHandle = {0};
421  starpu_matrix_data_register(&traverseSpacesHandle, -1, 0, computeConstants.R_symmetries.size(), computeConstants.R_symmetries.size(), currentBatchSize, sizeof(RecFourierProjectionTraverseSpace));
422  starpu_data_set_name(traverseSpacesHandle, "Batch Traverse Spaces");
423 
424  // Submit the task to load the projections
425  {
426  const size_t argIndex = loadProjectionArgs.size();
427 
428  // Create new LoadProjectionArgs for this batch
429  loadProjectionArgs.push_back(LoadProjectionArgs {
430  batchStart, batchEnd,
431  SF,
432  selFileObjectIds,
435  maxVolumeIndex, maxVolumeIndex,
436  static_cast<float>(params.blob.radius),
438  paddedImgSize,
439  fftSizeX, fftSizeY
440  });
441 
442  const LoadProjectionArgs& loadProjectionArg = loadProjectionArgs[argIndex];
443 
444  starpu_task *loadProjectionsTask = starpu_task_create();
445  loadProjectionsTask->name = "LoadProjections";
446  loadProjectionsTask->cl = &codelets.load_projections;
447  loadProjectionsTask->cl_arg = (void *) &loadProjectionArg;
448  loadProjectionsTask->cl_arg_size = sizeof(loadProjectionArg);
449  loadProjectionsTask->cl_arg_free = 0; // Do not free! (probably default)
450  loadProjectionsTask->handles[0] = amountLoadedHandle;
451  loadProjectionsTask->handles[1] = paddedImagesDataHandle;
452  loadProjectionsTask->handles[2] = traverseSpacesHandle;
453  loadProjectionsTask->synchronous = DEBUG_SYNCHRONOUS_TASKS;
454 
455  CHECK_STARPU(starpu_task_submit(loadProjectionsTask));
456  }
457 
458  // Compute FFT of padded image data and adjust it (crop, shift, normalize)
459  starpu_data_handle_t fftHandle = {0};
460  starpu_vector_data_register(&fftHandle, -1, 0, currentBatchSize, fftSizeX * fftSizeY * 2 * sizeof(float));
461  starpu_data_set_name(fftHandle, "Batch FFT Data");
462 
463  {
464  starpu_task* paddedImageToFftTask = starpu_task_create();
465  paddedImageToFftTask->name = "PaddedImageToFFT";
466  paddedImageToFftTask->cl = &codelets.padded_image_to_fft;
467  paddedImageToFftTask->handles[0] = paddedImagesDataHandle;
468  paddedImageToFftTask->handles[1] = fftHandle;
469  paddedImageToFftTask->handles[2] = fftScratchMemoryHandle;
470  paddedImageToFftTask->handles[3] = amountLoadedHandle;
471  paddedImageToFftTask->cl_arg = &imageToFftArg;
472  paddedImageToFftTask->cl_arg_size = sizeof(PaddedImageToFftArgs);
473  paddedImageToFftTask->cl_arg_free = 0;
474  paddedImageToFftTask->synchronous = DEBUG_SYNCHRONOUS_TASKS;
475  CHECK_STARPU(starpu_task_submit(paddedImageToFftTask));
476  }
477 
478  starpu_data_unregister_submit(paddedImagesDataHandle);
479 
480  {// Submit the actual reconstruction
481  starpu_task* reconstructFftTask = starpu_task_create();
482  reconstructFftTask->name = "ReconstructFFT";
483  reconstructFftTask->cl = &codelets.reconstruct_fft;
484  reconstructFftTask->handles[0] = fftHandle;
485  reconstructFftTask->handles[1] = traverseSpacesHandle;
486  reconstructFftTask->handles[2] = blobTableSquaredHandle;
487  reconstructFftTask->handles[3] = resultVolumeHandle;
488  reconstructFftTask->handles[4] = resultWeightsHandle;
489  reconstructFftTask->handles[5] = amountLoadedHandle;
490  reconstructFftTask->cl_arg = &reconstructFftArg;
491  reconstructFftTask->cl_arg_size = sizeof(ReconstructFftArgs);
492  reconstructFftTask->cl_arg_free = 0;
493  reconstructFftTask->callback_func = BatchProvider::batchCompleted;
494  reconstructFftTask->callback_arg = &batches;
495  reconstructFftTask->callback_arg_free = 0;
496  reconstructFftTask->synchronous = DEBUG_SYNCHRONOUS_TASKS;
497 
498  CHECK_STARPU(starpu_task_submit(reconstructFftTask));
499  }
500 
501  // Mark buffers shared between tasks of a batch for removal
502  starpu_data_unregister_submit(fftHandle);
503  starpu_data_unregister_submit(traverseSpacesHandle);
504  starpu_data_unregister_submit(amountLoadedHandle);
505  }
506 
507  // Mark helper buffers that are shared between all tasks for removal
508  starpu_data_unregister_submit(blobTableSquaredHandle);
509  starpu_data_unregister_submit(fftScratchMemoryHandle);
510 
511  // Complete all processing
512  /*while (starpu_task_nsubmitted() > 0) {
513  starpu_do_schedule();
514  usleep(100000);//100ms
515  }*/
516  CHECK_STARPU(starpu_task_wait_for_all());
517 
518  // Release result buffers synchronously, implicitly causes them to be copied to original memory location
519  starpu_data_unregister(resultVolumeHandle);
520  starpu_data_unregister(resultWeightsHandle);
521 
523 
524  return result;
525 }
double alpha
Smoothness parameter.
Definition: blobs.h:121
starpu_codelet reconstruct_fft
void padded_image_to_fft_cuda_initialize(uint32_t paddedImageSize)
starpu_codelet padded_image_to_fft
void reconstruct_cuda_initialize_constants(int maxVolIndexX, int maxVolIndexYZ, float blobRadius, float blobAlpha, float iDeltaSqrt, float iw0, float oneOverBessiOrderAlpha)
struct ProgRecFourierStarPU::ComputeConstants computeConstants
std::vector< Matrix2D< double > > R_symmetries
starpu_codelet redux_sum_volume
starpu_codelet redux_sum_weights
virtual void findObjects(std::vector< size_t > &objectsOut, const MDQuery &query) const =0
virtual size_t size() const =0
starpu_codelet redux_init_volume
const uint32_t ALIGNMENT
#define XMIPP_MIN(x, y)
Definition: xmipp_macros.h:181
#define CHECK_STARPU(operationWithReturnCode)
starpu_codelet redux_init_weights
T align(T number, uint32_t alignment)
const int DEBUG_SYNCHRONOUS_TASKS
int order
Derivation order and Bessel function order.
Definition: blobs.h:118
starpu_codelet load_projections
struct ProgRecFourierStarPU::Params params
double radius
Spatial radius in Universal System units.
Definition: blobs.h:115

◆ defineParams()

void ProgRecFourierStarPU::defineParams ( )
overridevirtual

Specify supported command line arguments

Reimplemented from XmippProgram.

Reimplemented in ProgRecFourierMpiStarPU.

Definition at line 48 of file reconstruct_fourier_starpu.cpp.

48  {
49  //usage
50  addUsageLine("Generate 3D reconstructions from projections using direct Fourier interpolation with arbitrary geometry.");
51  addUsageLine("Kaisser-windows are used for interpolation in Fourier space.");
52  //params
53  addParamsLine(" -i <md_file> : Metadata file with input projections");
54  addParamsLine(" [-o <volume_file=\"rec_fourier.vol\">] : Filename for output volume");
55  addParamsLine(" [--sym <symfile=c1>] : Enforce symmetry in projections");
56  addParamsLine(" [--padding <proj=2.0> <vol=2.0>] : Padding used for projections and volume");
57  addParamsLine(" [--max_resolution <p=0.5>] : Max resolution (Nyquist=0.5)");
58  addParamsLine(" [--weight] : Use weights stored in the image metadata");
59  addParamsLine(" [--blob <radius=1.9> <order=0> <alpha=15>] : Blob parameters");
60  addParamsLine(" : radius in pixels, order of Bessel function in blob and parameter alpha");
61  addParamsLine(" [--fast] : Do the blobbing at the end of the computation.");
62  addParamsLine(" : Gives slightly different results, but is faster.");
63  addParamsLine(" [--batchSize <size=25>] : Amount of images in single batch. Too many won't fit in memory and will not be able to run as fast, too few will have large overhead.");
64  addParamsLine(" : Each additional image in batch will require at least imageSide^2 * 32 bytes, e.g.");
65  addParamsLine(" : cca 52MB per batch of 25 256x256 images or 210MB for 512x512 images.");
66  addParamsLine(" [--fourierThreads <num=0>] : Number of threads used for final fourier transformation. Zero means all available.");
67  addExampleLine("For reconstruct enforcing i3 symmetry and using stored weights:", false);
68  addExampleLine(" xmipp_starpu_reconstruct_fourier -i reconstruction.sel --sym i3 --weight");
69 
70  /* Buffer sizes:
71  * paddedImages:
72  * batchSize * paddedImgSize * paddedImgSize * sizeof(float)
73  * batchSize * symmetryCount * sizeof(TraverseSpace) <- Typically in order of few kB per batch
74  * fft:
75  * batchSize * fftSizeX * fftSizeY * 2 * sizeof(float)
76  * fftWorkSpace:
77  * paddedImgSize * paddedImgSize/2 * sizeof(float) * 2 <- Does not scale with batchSize
78  */
79 }
void addExampleLine(const char *example, bool verbatim=true)
void addUsageLine(const char *line, bool verbatim=false)
void addParamsLine(const String &line)

◆ initStarPU()

void ProgRecFourierStarPU::initStarPU ( )
staticprotected

Initialize StarPU. Separate method to allow MPI override

Definition at line 290 of file reconstruct_fourier_starpu.cpp.

290  {
291  // Request more workers per CUDA-capable GPU
292  setenv("STARPU_NWORKER_PER_CUDA",
293  "2" /* seems to work best, 1 leaves GPU idle for fractions of a second (but shouldn't) */,
294  false /* don't overwrite user specified value */);
295  // Be more reluctant to discard calibration data
296  setenv("STARPU_HISTORY_MAX_ERROR", "200" /*%*/, false);
297  // Do not let users to specify scheduling policy, because we are using our own and StarPU REALLY doesn't like this conflict
298  setenv("STARPU_SCHED", "", true);
299 
300  starpu_conf starpu_configuration;
301  starpu_conf_init(&starpu_configuration);
302  starpu_configuration.sched_policy = &schedulers.reconstruct_fourier;
303  CHECK_STARPU(starpu_init(&starpu_configuration));
304 
305  int cpuWorkers[STARPU_NMAXWORKERS];
306  unsigned cpuWorkerCount = starpu_worker_get_ids_by_type(starpu_worker_archtype::STARPU_CPU_WORKER, cpuWorkers, STARPU_NMAXWORKERS);
307  if (cpuWorkerCount > 1) {
308  int combinedWorker = starpu_combined_worker_assign_workerid(cpuWorkerCount, cpuWorkers);
309  starpu_sched_ctx_add_workers(&combinedWorker, 1, 0);
310 
311  schedulers.reconstruct_fourier.add_workers(0, nullptr, 0);// Just force a refresh, not a very clean solution
312  }
313 
314  starpu_malloc_set_align(ALIGNMENT);
315 }
Schedulers schedulers
starpu_sched_policy reconstruct_fourier
const uint32_t ALIGNMENT
#define CHECK_STARPU(operationWithReturnCode)
#define STARPU_NMAXWORKERS

◆ postProcessAndSave()

void ProgRecFourierStarPU::postProcessAndSave ( const Params params,
const ComputeConstants computeConstants,
const FileName fn_out,
std::complex< float > ***  tempVolume,
float ***  tempWeights 
)
staticprotected

Method will take data stored in tempVolume and tempWeights, crops it in X axis, calculates IFFT and stores the result to final destination.

Definition at line 550 of file reconstruct_fourier_starpu.cpp.

552  {
553 
554  const uint32_t maxVolumeIndex = computeConstants.maxVolumeIndex;
555 
556  // remove complex conjugate of the intermediate result
557  const uint32_t maxVolumeIndexX = maxVolumeIndex/2;// just half of the space is necessary, the rest is complex conjugate
558  const uint32_t maxVolumeIndexYZ = maxVolumeIndex;
559  mirrorAndCropTempSpaces(tempVolume, tempWeights, maxVolumeIndexX, maxVolumeIndexYZ);
560 
561  if (params.fastLateBlobbing) {
562  tempVolume = applyBlob(tempVolume, (float) params.blob.radius, (float*)computeConstants.blobTableSqrt, computeConstants.iDeltaSqrt, (int)maxVolumeIndexX, (int)maxVolumeIndexYZ);
563  tempWeights = applyBlob(tempWeights, (float) params.blob.radius, (float*)computeConstants.blobTableSqrt, computeConstants.iDeltaSqrt, (int)maxVolumeIndexX, (int)maxVolumeIndexYZ);
564  }
565 
566  const uint32_t paddedImgSize = computeConstants.paddedImgSize;
567  const uint32_t imgSize = computeConstants.imgSize;
568 
569  forceHermitianSymmetry(tempVolume, tempWeights, maxVolumeIndexYZ);
570  processWeights(tempVolume, tempWeights, maxVolumeIndexX, maxVolumeIndexYZ, params.padding_factor_proj, params.padding_factor_vol, imgSize);
571  release(tempWeights, maxVolumeIndexYZ+1, maxVolumeIndexYZ+1);
572  MultidimArray< std::complex<double> > VoutFourier(paddedImgSize, paddedImgSize, paddedImgSize/2 + 1); // allocate space for output Fourier transformation
573 
574  convertToExpectedSpace(tempVolume, maxVolumeIndexYZ, VoutFourier);
575  release(tempVolume, maxVolumeIndexYZ+1, maxVolumeIndexYZ+1);
576 
577  // Output volume
578  Image<double> Vout(paddedImgSize, paddedImgSize, paddedImgSize);
579  MultidimArray<double> &mVout = Vout.data;
580 
581  {
582  FourierTransformer transformerVol;
584  transformerVol.fReal = &mVout;
585  transformerVol.setFourierAlias(VoutFourier);
586  transformerVol.recomputePlanR2C();
587  transformerVol.inverseFourierTransform();
588  }
589 
590  CenterFFT(mVout, false);
591 
592  // Correct by the Fourier transform of the blob
593  mVout.setXmippOrigin();
594  mVout.selfWindow(FIRST_XMIPP_INDEX(imgSize),FIRST_XMIPP_INDEX(imgSize),
595  FIRST_XMIPP_INDEX(imgSize),LAST_XMIPP_INDEX(imgSize),
596  LAST_XMIPP_INDEX(imgSize),LAST_XMIPP_INDEX(imgSize));
597  double pad_relation = params.padding_factor_proj / params.padding_factor_vol;
598  pad_relation = (pad_relation * pad_relation * pad_relation);
599 
600  double ipad_relation = 1.0 / pad_relation;
601  double meanFactor2 = 0;
603  double radius = sqrt((double)(k*k + i*i + j*j));
604  double aux = radius * computeConstants.iDeltaFourier;
605  double factor = computeConstants.fourierBlobTable[ROUND(aux)];
606  double factor2 = pow(Sinc(radius / (2*imgSize)), 2);
607  A3D_ELEM(mVout,k,i,j) /= (ipad_relation * factor2 * factor);
608  meanFactor2 += factor2;
609  }
610  meanFactor2 /= MULTIDIM_SIZE(mVout);
612  A3D_ELEM(mVout, k, i, j) *= meanFactor2;
613  }
614  Vout.write(fn_out);
615 }
void selfWindow(int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T init_value=0)
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
void setThreadsNumber(int tNumber)
Definition: xmipp_fftw.h:119
#define MULTIDIM_SIZE(v)
void sqrt(Image< double > &op)
void setFourierAlias(T &V)
Definition: xmipp_fftw.h:215
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
MultidimArray< double > * fReal
Definition: xmipp_fftw.h:64
struct ProgRecFourierStarPU::ComputeConstants computeConstants
void CenterFFT(MultidimArray< T > &v, bool forward)
Definition: xmipp_fft.h:291
#define A3D_ELEM(V, k, i, j)
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
#define ROUND(x)
Definition: xmipp_macros.h:210
#define j
double Sinc(double Argument)
#define FIRST_XMIPP_INDEX(size)
Definition: xmipp_macros.h:439
#define LAST_XMIPP_INDEX(size)
Definition: xmipp_macros.h:448
struct ProgRecFourierStarPU::Params params
double radius
Spatial radius in Universal System units.
Definition: blobs.h:115

◆ prepareConstants()

void ProgRecFourierStarPU::prepareConstants ( const Params params,
const MetaData SF,
const FileName fn_sym,
ComputeConstants constants 
)
staticprotected

Load or compute constants needed for the computation.

Definition at line 122 of file reconstruct_fourier_starpu.cpp.

122  {
123  // Ask for memory for the output volume and its Fourier transform
124  size_t imageSize;
125  {
126  size_t objId = SF.firstRowId();
127  FileName fnImg;
128  SF.getValue(MDL_IMAGE, fnImg, objId);
129  Image<double> I;
130  I.read(fnImg, HEADER);
131 
132  imageSize = I().xdim;
133  if (imageSize != I().ydim)
134  REPORT_ERROR(ERR_MULTIDIM_SIZE, "This algorithm only works for squared images");
135  }
136 
137  constants.imgSize = static_cast<int>(imageSize);
138  constants.paddedImgSize = static_cast<uint32_t>(imageSize * params.padding_factor_vol);
139  {
140  uint32_t conserveRows = (uint32_t) ceil(2.0f * constants.paddedImgSize * params.maxResolution);
141  // Round up to nearest even number (i.e. divisible by 2)
142  constants.maxVolumeIndex = conserveRows + (conserveRows & 1); // second term is 1 iff conserveRows is odd, 0 otherwise
143  }
144 
145  // Build a table of blob values
146  blobtype blobFourier = params.blob;
147  blobtype blobNormalized = params.blob;
148  blobFourier.radius /= params.padding_factor_vol * imageSize;
150 
151  double deltaSqrt = (params.blob.radius * params.blob.radius) / (BLOB_TABLE_SIZE_SQRT - 1);
152  double deltaFourier = (sqrt(3.0) * imageSize / 2.0) / (BLOB_TABLE_SIZE_SQRT-1);
153  constants.iDeltaSqrt = static_cast<float>(1 / deltaSqrt);
154  constants.iDeltaFourier = static_cast<float>(1 / deltaFourier);
155 
156  // The interpolation kernel must integrate to 1
157  constants.iw0 = 1.0 / blob_Fourier_val(0.0, blobNormalized);
158  double padXdim3 = params.padding_factor_vol * imageSize;
159  padXdim3 = padXdim3 * padXdim3 * padXdim3;
160  double blobTableSize = params.blob.radius * sqrt(1.0 / (BLOB_TABLE_SIZE_SQRT-1));
161  for (int i = 0; i < BLOB_TABLE_SIZE_SQRT; i++) {
162  //use a r*r sample instead of r
163  constants.blobTableSqrt[i] = static_cast<float>(blob_val(blobTableSize*sqrt((double)i), params.blob) * constants.iw0);
164  constants.fourierBlobTable[i] = blob_Fourier_val(deltaFourier * i, blobFourier) * padXdim3 * constants.iw0;
165  }
166 
167  {// Get symmetries
168  Matrix2D<double> Identity(3, 3);
169  Identity.initIdentity();
170  constants.R_symmetries.push_back(Identity);
171  if (!fn_sym.isEmpty()) {
172  SymList SL;
173  SL.readSymmetryFile(fn_sym);
174  constants.R_symmetries.reserve(constants.R_symmetries.size() + SL.symsNo());
175  for (int isym = 0; isym < SL.symsNo(); isym++) {
176  Matrix2D<double> L(4, 4), R(4, 4);
177  SL.getMatrices(isym, L, R);
178  R.resize(3, 3);
179  constants.R_symmetries.push_back(R);
180  }
181  }
182  }
183 }
void getMatrices(int i, Matrix2D< double > &L, Matrix2D< double > &R, bool homogeneous=true) const
Definition: symmetries.cpp:348
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
void sqrt(Image< double > &op)
virtual size_t firstRowId() const =0
int readSymmetryFile(FileName fn_sym, double accuracy=SYM_ACCURACY)
Definition: symmetries.cpp:33
Incorrect MultidimArray size.
Definition: xmipp_error.h:174
int symsNo() const
Definition: symmetries.h:268
virtual bool getValue(MDObject &mdValueOut, size_t id) const =0
#define i
#define BLOB_TABLE_SIZE_SQRT
double * f
#define blob_Fourier_val(w, blob)
Definition: blobs.h:174
bool isEmpty() const
int read(const FileName &name, DataMode datamode=DATA, size_t select_img=ALL_IMAGES, bool mapData=false, int mode=WRITE_READONLY)
#define blob_val(r, blob)
Definition: blobs.h:139
struct ProgRecFourierStarPU::Params params
double radius
Spatial radius in Universal System units.
Definition: blobs.h:115
Name of an image (std::string)

◆ prepareMetaData()

void ProgRecFourierStarPU::prepareMetaData ( const FileName fn_in,
MetaDataVec SF 
)
staticprotected

Load meta data, selection file with a list of images to process.

Returns
total batch count

Definition at line 112 of file reconstruct_fourier_starpu.cpp.

112  {
113  // Read the input images
114  SF.read(fn_in);
115  SF.removeDisabled();
116 }
void read(const FileName &inFile, const std::vector< MDLabel > *desiredLabels=nullptr, bool decomposeStack=true) override
virtual void removeDisabled()

◆ readParams()

void ProgRecFourierStarPU::readParams ( )
overridevirtual

Read arguments from command line

Reimplemented from XmippProgram.

Reimplemented in ProgRecFourierMpiStarPU.

Definition at line 82 of file reconstruct_fourier_starpu.cpp.

82  {
83  fn_in = getParam("-i");
84  fn_out = getParam("-o");
85  fn_sym = getParam("--sym");
86 
87  params.padding_factor_proj = getDoubleParam("--padding", 0);
88  params.padding_factor_vol = getDoubleParam("--padding", 1);
89  params.maxResolution = (float)getDoubleParam("--max_resolution");
90  params.do_weights = checkParam("--weight");
91  params.blob.radius = getDoubleParam("--blob", 0);
92  params.blob.order = getIntParam("--blob", 1);
93  params.blob.alpha = getDoubleParam("--blob", 2);
95 
96  int batchSize = getIntParam("--batchSize");
97  params.batchSize = batchSize <= 0 ? 25 : static_cast<uint32_t>(batchSize);
98 
99  {// Number of threads of final fourier transformation
100  int fourierThreads = getIntParam("--fourierThreads");
101  if (fourierThreads <= 0) {
102  fourierThreads = (int)sysconf(_SC_NPROCESSORS_ONLN); // Default to all
103  }
104  if (fourierThreads <= 0) {
105  fourierThreads = 1;
106  std::cerr << "--fourierThreads: Cannot obtain number of cores. Defaulting to one." << std::endl;
107  }
108  params.fourierTransformThreads = static_cast<uint32_t>(fourierThreads);
109  }
110 }
double alpha
Smoothness parameter.
Definition: blobs.h:121
double getDoubleParam(const char *param, int arg=0)
const char * getParam(const char *param, int arg=0)
int order
Derivation order and Bessel function order.
Definition: blobs.h:118
bool checkParam(const char *param)
int getIntParam(const char *param, int arg=0)
struct ProgRecFourierStarPU::Params params
double radius
Spatial radius in Universal System units.
Definition: blobs.h:115

◆ run()

void ProgRecFourierStarPU::run ( )
overridevirtual

Run the image processing. Method will load data, process them and store result to final destination.

Reimplemented from XmippProgram.

Reimplemented in ProgRecFourierMpiStarPU.

Definition at line 264 of file reconstruct_fourier_starpu.cpp.

264  {
265  if (verbose) {
266  show();
267  }
268 
271  initStarPU();
272 
273  SimpleBatchProvider batchProvider(computeBatchCount(params, SF), (bool) verbose);
274 
275  ComputeStarPUResult result = computeStarPU(params, SF, computeConstants, batchProvider, (bool) verbose);
276 
277  // We won't need StarPU anymore
278  shutdownStarPU();
279 
280  // TODO(jp): This step seems unnecessary (later steps would have to be rewritten to work with flat arrays) (also in MPI version)
281  // Convert flat volume and weight arrays into multidimensional arrays and destroy originals
282  std::complex<float>*** tempVolume = result.createXmippStyleVolume(computeConstants.maxVolumeIndex);
283  float*** tempWeights = result.createXmippStyleWeights(computeConstants.maxVolumeIndex);
284  result.destroy();
285 
286  // Adjust and save the resulting volume
287  postProcessAndSave(params, computeConstants, fn_out, tempVolume, tempWeights);
288 }
static void prepareMetaData(const FileName &fn_in, MetaDataVec &SF)
struct ProgRecFourierStarPU::ComputeConstants computeConstants
int verbose
Verbosity level.
static void prepareConstants(const Params &params, const MetaData &SF, const FileName &fn_sym, ComputeConstants &constants)
static void postProcessAndSave(const Params &params, const ComputeConstants &computeConstants, const FileName &fn_out, std::complex< float > ***tempVolume, float ***tempWeights)
static ComputeStarPUResult computeStarPU(const Params &params, const MetaData &SF, const ComputeConstants &computeConstants, BatchProvider &batches, bool verbose)
struct ProgRecFourierStarPU::Params params
static uint32_t computeBatchCount(const Params &params, const MetaData &SF)

◆ setIO()

void ProgRecFourierStarPU::setIO ( const FileName fn_in,
const FileName fn_out 
)
overridevirtual

Functions of common reconstruction interface

Implements ProgReconsBase.

Definition at line 185 of file reconstruct_fourier_starpu.cpp.

185  {
186  this->fn_in = fn_in;
187  this->fn_out = fn_out;
188 }

◆ show()

void ProgRecFourierStarPU::show ( ) const
overridevirtual

Show basic info to standard output

Reimplemented from XmippProgram.

Definition at line 191 of file reconstruct_fourier_starpu.cpp.

191  {
192  std::cout << " =====================================================================" << std::endl;
193  std::cout << " Direct 3D reconstruction method using Kaiser windows as interpolators" << std::endl;
194  std::cout << " =====================================================================" << std::endl;
195  std::cout << " Input selfile : " << fn_in << std::endl;
196  std::cout << " padding_factor_proj : " << params.padding_factor_proj << std::endl;
197  std::cout << " padding_factor_vol : " << params.padding_factor_vol << std::endl;
198  std::cout << " Output volume : " << fn_out << std::endl;
199  if (!fn_sym.isEmpty())
200  std::cout << " Symmetry file for projections : " << fn_sym << std::endl;
201  if (params.do_weights)
202  std::cout << " Use weights stored in the image headers or doc file" << std::endl;
203  else
204  std::cout << " Do NOT use weights" << std::endl;
205  std::cout << "\n Interpolation Function"
206  << "\n blrad : " << params.blob.radius
207  << "\n blord : " << params.blob.order
208  << "\n blalpha : " << params.blob.alpha
209  << "\n max_resolution : " << params.maxResolution
210  << "\n -----------------------------------------------------------------" << std::endl;
211 }
double alpha
Smoothness parameter.
Definition: blobs.h:121
bool isEmpty() const
int order
Derivation order and Bessel function order.
Definition: blobs.h:118
struct ProgRecFourierStarPU::Params params
double radius
Spatial radius in Universal System units.
Definition: blobs.h:115

◆ shutdownStarPU()

void ProgRecFourierStarPU::shutdownStarPU ( )
staticprotected

Shutdown StarPU. Separate method to allow MPI override

Definition at line 546 of file reconstruct_fourier_starpu.cpp.

546  {
547  starpu_shutdown();
548 }

Member Data Documentation

◆ computeConstants

struct ProgRecFourierStarPU::ComputeConstants ProgRecFourierStarPU::computeConstants
protected

◆ fn_in

FileName ProgRecFourierStarPU::fn_in
protected

Input file name

Definition at line 48 of file reconstruct_fourier_starpu.h.

◆ fn_out

FileName ProgRecFourierStarPU::fn_out
protected

Output file name

Definition at line 51 of file reconstruct_fourier_starpu.h.

◆ fn_sym

FileName ProgRecFourierStarPU::fn_sym
protected

File with symmetries

Definition at line 54 of file reconstruct_fourier_starpu.h.

◆ params

struct ProgRecFourierStarPU::Params ProgRecFourierStarPU::params
protected

◆ SF

MetaDataVec ProgRecFourierStarPU::SF
protected

SelFile containing all projections

Definition at line 85 of file reconstruct_fourier_starpu.h.


The documentation for this class was generated from the following files: