STIR  6.3.0
CudaGibbsPenalty.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2025, University College London
3  Copyright (C) 2025, University of Milano-Bicocca
4 
5  SPDX-License-Identifier: Apache-2.0
6 
7  See STIR/LICENSE.txt for details
8 */
19 #ifndef __stir_recon_buildblock_CUDA_CudaGibbsPenalty_H__
20 #define __stir_recon_buildblock_CUDA_CudaGibbsPenalty_H__
21 
22 #include "stir/Array.h"
24 #include "stir/cuda_utilities.h"
26 
27 #include "stir/shared_ptr.h"
28 #include <string>
29 
30 START_NAMESPACE_STIR
31 
49 template <typename elemT, typename PotentialT>
50 class CudaGibbsPenalty : public GibbsPenalty<elemT, PotentialT>
51 {
52 private:
54 
55 protected:
56  // GPU block and grid dimensions
57 
58  cuda_dim3 block_dim;
59  cuda_dim3 grid_dim;
60 
61  // Variables used for shared memory operations
62  int threads_per_block;
63  size_t shared_mem_bytes;
64 
65  elemT* d_image_data = nullptr;
66  // Currently stir:CartesianCoordinate3D<int> is not supported on GPU, we need a simple structure to store boundaries.
67  cuda_int3 d_image_dim;
68  cuda_int3 d_image_max_indices;
69  cuda_int3 d_image_min_indices;
70  cuda_int3 d_weight_max_indices;
71  cuda_int3 d_weight_min_indices;
72 
73  // GPU pointers to weights and kappa data
74  float* d_weights_data = nullptr;
75  elemT* d_kappa_data = nullptr;
76 
77  // Buffers for GPU input/output to avoid reallocating memory on each call see usage in set_up() and ~CudaGibbsPenalty()
78  mutable double* d_scalar = nullptr;
79  // d_scalar is used for compute_value and compute_gradient_times_input as output variable
80  mutable elemT* d_input_data = nullptr;
81  // d_input_data is used for storing input image for compute_gradient_times_input and accumulate_Hessian_times_input
82  mutable elemT* d_output_data = nullptr;
83  // d_output_data is used for storing output image for compute_gradient, accumulate_Hessian_times_input and
84  // compute_Hessian_diagonal
85 
86 public:
88  CudaGibbsPenalty(const bool only_2D, float penalization_factor);
90 
92  Succeeded set_up(shared_ptr<const DiscretisedDensity<3, elemT>> const& target_sptr) override;
93 
95  void set_weights(const Array<3, float>& w) override;
96 
98  void set_kappa_sptr(const shared_ptr<const DiscretisedDensity<3, elemT>>& k) override;
99 
101  double compute_value(const DiscretisedDensity<3, elemT>& current_image_estimate) override;
102 
104  void compute_gradient(DiscretisedDensity<3, elemT>& prior_gradient,
105  const DiscretisedDensity<3, elemT>& current_image_estimate) override;
106 
108  double compute_gradient_times_input(const DiscretisedDensity<3, elemT>& input,
109  const DiscretisedDensity<3, elemT>& current_image_estimate) override;
110 
112  void compute_Hessian_diagonal(DiscretisedDensity<3, elemT>& Hessian_diagonal,
113  const DiscretisedDensity<3, elemT>& current_estimate) const override;
114 
116  void accumulate_Hessian_times_input(DiscretisedDensity<3, elemT>& output,
117  const DiscretisedDensity<3, elemT>& current_image_estimate,
118  const DiscretisedDensity<3, elemT>& input) const override;
119 };
120 
121 END_NAMESPACE_STIR
122 
123 #ifdef __CUDACC__
124 // CUDA compiler sees everything
125 # include "stir/recon_buildblock/CUDA/CudaGibbsPenalty.cuh"
126 #endif
127 
128 #endif // __stir_recon_buildblock_CUDA_CudaGibbsPenalty_H__
A base class with CUDA-accelerated implementation of the GibbsPenalty class.
Definition: CudaGibbsPenalty.h:50
Import of std::shared_ptr, std::dynamic_pointer_cast and std::static_pointer_cast into the stir names...
defines the stir::DiscretisedDensity class
defines the stir::Array class for multi-dimensional (numeric) arrays
Declaration of the stir::GibbsPenalty class.
A base class for Gibbs type penalties in the GeneralisedPrior hierarchy.
Definition: GibbsPenalty.h:98
some utilities for STIR and CUDA
a class containing an enumeration type that can be used by functions to signal successful operation o...
Definition: Succeeded.h:43
This abstract class is the basis for all image representations.
Definition: DDSR2DReconstruction.h:44