@@ -172,7 +172,7 @@ namespace {
172172}
173173
174174template <typename ImgType>
175- void getGradientCuda (const PixelData<ImgType> &image, PixelData< float > &local_scale_temp,
175+ void getGradientCuda (const PixelData<ImgType> &image,
176176 ImgType *cudaImage, ImgType *cudaGrad, float *cudalocal_scale_temp,
177177 BsplineParamsCuda &px, BsplineParamsCuda &py, BsplineParamsCuda &pz, float *boundary,
178178 bool &isErrorDetected, ScopedCudaMemHandler<bool *, JUST_ALLOC >& isErrorDetectedCuda,
@@ -196,13 +196,14 @@ void getGradientCuda(const PixelData<ImgType> &image, PixelData<float> &local_sc
196196 " try squashing the input image to a narrower range or use APRConverter<float>" );
197197 }
198198 }
199- runKernelGradient (cudaImage, cudaGrad, image.getDimension (), local_scale_temp.getDimension (), par.dx , par.dy , par.dz , aStream);
199+ auto localScaleTempDim = image.getDimensionDS (); // size of downsampled input image
200+ runKernelGradient (cudaImage, cudaGrad, image.getDimension (), localScaleTempDim, par.dx , par.dy , par.dz , aStream);
200201 runDownsampleMean (cudaImage, cudalocal_scale_temp, image.x_num , image.y_num , image.z_num , aStream);
201202
202203 if (par.lambda > 0 ) {
203- if (image.y_num > 2 ) runInvBsplineYdir (cudalocal_scale_temp, local_scale_temp. x_num , local_scale_temp. y_num , local_scale_temp. z_num , aStream);
204- if (image.x_num > 2 ) runInvBsplineXdir (cudalocal_scale_temp, local_scale_temp. x_num , local_scale_temp. y_num , local_scale_temp. z_num , aStream);
205- if (image.z_num > 2 ) runInvBsplineZdir (cudalocal_scale_temp, local_scale_temp. x_num , local_scale_temp. y_num , local_scale_temp. z_num , aStream);
204+ if (image.y_num > 2 ) runInvBsplineYdir (cudalocal_scale_temp, localScaleTempDim. x , localScaleTempDim. y , localScaleTempDim. z , aStream);
205+ if (image.x_num > 2 ) runInvBsplineXdir (cudalocal_scale_temp, localScaleTempDim. x , localScaleTempDim. y , localScaleTempDim. z , aStream);
206+ if (image.z_num > 2 ) runInvBsplineZdir (cudalocal_scale_temp, localScaleTempDim. x , localScaleTempDim. y , localScaleTempDim. z , aStream);
206207 }
207208}
208209
@@ -429,7 +430,7 @@ class GpuProcessingTask<U>::GpuProcessingTaskImpl {
429430
430431 // input data
431432 const PixelData<ImgType> &iCpuImage;
432- PixelData<float > &iCpuLevels;
433+ // PixelData<float> &iCpuLevels;
433434 const APRParameters &iParameters;
434435 GenInfo iAprInfo;
435436 float iBsplineOffset = 0 ;
@@ -438,9 +439,9 @@ class GpuProcessingTask<U>::GpuProcessingTaskImpl {
438439 // cuda stuff - memory and stream to be used
439440 ScopedCudaMemHandler<const PixelData<ImgType>, JUST_ALLOC > image;
440441 ScopedCudaMemHandler<const PixelData<ImgType>, JUST_ALLOC > imageSampling;
441- ScopedCudaMemHandler<PixelData< ImgType> , JUST_ALLOC > gradient;
442- ScopedCudaMemHandler<PixelData< float > , JUST_ALLOC > local_scale_temp;
443- ScopedCudaMemHandler<PixelData< float > , JUST_ALLOC > local_scale_temp2;
442+ ScopedCudaMemHandler<ImgType* , JUST_ALLOC > gradient;
443+ ScopedCudaMemHandler<float * , JUST_ALLOC > local_scale_temp;
444+ ScopedCudaMemHandler<float * , JUST_ALLOC > local_scale_temp2;
444445
445446
446447 // bspline stuff
@@ -490,18 +491,14 @@ class GpuProcessingTask<U>::GpuProcessingTaskImpl {
490491
491492public:
492493
493- // TODO: Remove need for passing 'levels' to GpuProcessingTask
494- // It was used during development to control internal computation like filters, gradient, levels etc. but
495- // once all is done there is no need for it anymore
496- GpuProcessingTaskImpl (const PixelData<ImgType> &inputImage, PixelData<float > &levels, const APRParameters ¶meters, int maxLevel) :
494+ GpuProcessingTaskImpl (const PixelData<ImgType> &inputImage, const APRParameters ¶meters, int maxLevel) :
497495 iCpuImage (inputImage),
498- iCpuLevels (levels),
499496 iStream (cudaStream.get()),
500497 image (inputImage, iStream),
501498 imageSampling (inputImage, iStream),
502- gradient (levels , iStream),
503- local_scale_temp (levels , iStream),
504- local_scale_temp2 (levels , iStream),
499+ gradient (nullptr , inputImage.getDimensionDS().size() , iStream),
500+ local_scale_temp (nullptr , inputImage.getDimensionDS().size() , iStream),
501+ local_scale_temp2 (nullptr , inputImage.getDimensionDS().size() , iStream),
505502 iParameters (parameters),
506503 iAprInfo (iCpuImage.getDimension()),
507504 iMaxLevel (maxLevel),
@@ -531,7 +528,7 @@ public:
531528 // In LIS we have: var_win[0,1,2] = maximum 3 var_win[3,4,5] = maximum 6
532529 // so maximum paddSize is 6 6 6
533530 PixelDataDim maxPaddSize (6 , 6 , 6 );
534- PixelDataDim paddedImageSize = levels. getDimension () + maxPaddSize + maxPaddSize;
531+ PixelDataDim paddedImageSize = inputImage. getDimensionDS () + maxPaddSize + maxPaddSize;
535532 lstPadded.initialize (nullptr , paddedImageSize.size (), iStream);
536533 lst2Padded.initialize (nullptr , paddedImageSize.size (), iStream);
537534
@@ -631,22 +628,23 @@ public:
631628 runBsplineOffsetAndCopyOriginal (image.get (), imageSampling.get (), iBsplineOffset /* bspline_offset*/ , iCpuImage.getDimension (), iStream);
632629
633630
634- getGradientCuda (iCpuImage, iCpuLevels, image.get (), gradient.get (), local_scale_temp.get (),
631+ getGradientCuda (iCpuImage, image.get (), gradient.get (), local_scale_temp.get (),
635632 splineCudaX, splineCudaY, splineCudaZ, boundary.get (), isErrorDetectedPinned[0 ], isErrorDetectedCuda,
636633 iBsplineOffset, iParameters, iStream);
637634
638- runLocalIntensityScalePipeline (iCpuLevels , iParameters, local_scale_temp.get (), local_scale_temp2.get (), lstPadded.get (), lst2Padded.get (), iStream);
635+ runLocalIntensityScalePipeline (iCpuImage. getDimensionDS () , iParameters, local_scale_temp.get (), local_scale_temp2.get (), lstPadded.get (), lst2Padded.get (), iStream);
639636
640637 // Apply parameters from APRConverter:
641- runThreshold (local_scale_temp2.get (), gradient.get (), iCpuLevels.x_num , iCpuLevels.y_num , iCpuLevels.z_num , iParameters.Ip_th + iBsplineOffset, iStream);
642- runRescaleAndThreshold (local_scale_temp.get (), iCpuLevels.mesh .size (), iParameters.sigma_th , iParameters.sigma_th_max , iStream);
643- runThresholdOpen (gradient.get (), gradient.get (), iCpuLevels.x_num , iCpuLevels.y_num , iCpuLevels.z_num , iParameters.grad_th , iStream);
638+ auto dimOfLevels = iCpuImage.getDimensionDS (); // size of downsampled input image
639+ runThreshold (local_scale_temp2.get (), gradient.get (), dimOfLevels.x , dimOfLevels.y , dimOfLevels.z , iParameters.Ip_th + iBsplineOffset, iStream);
640+ runRescaleAndThreshold (local_scale_temp.get (), dimOfLevels.size (), iParameters.sigma_th , iParameters.sigma_th_max , iStream);
641+ runThresholdOpen (gradient.get (), gradient.get (), dimOfLevels.x , dimOfLevels.y , dimOfLevels.z , iParameters.grad_th , iStream);
644642 // TODO: automatic parameters are not implemented for GPU pipeline (yet)
645643
646644 float min_dim = std::min (iParameters.dy , std::min (iParameters.dx , iParameters.dz ));
647645 float level_factor = pow (2 , iMaxLevel) * min_dim;
648646 const float mult_const = level_factor/iParameters.rel_error ;
649- runComputeLevels (gradient.get (), local_scale_temp.get (), iCpuLevels. mesh .size (), mult_const, iStream);
647+ runComputeLevels (gradient.get (), local_scale_temp.get (), dimOfLevels .size (), mult_const, iStream);
650648 computeOvpcCuda (local_scale_temp.get (), pctc, iAprInfo, iStream);
651649
652650 computeLinearStructureCuda (y_vec_cuda.get (), xz_end_vec_cuda.get (), level_xz_vec_cuda.get (), pctc, iAprInfo, giga, iParameters, counter_total, iStream);
@@ -660,11 +658,6 @@ public:
660658 // Trim buffer to calculated size (initially it is allocated to worst case - same number of particles as pixels in input image) and copy data from GPU
661659 y_vec.resize (iAprInfo.total_number_particles );
662660 // Copy y_vec from GPU to CPU and synchronize last time - it is needed before we copy data to CPU structures
663- std::cout << y_vec.size () << " \n " ;
664- std::cout << iAprInfo.total_number_particles << " \n " ;
665- std::cout << iStream << " \n " ;
666- std::cout << y_vec_cuda.getSize () << std::endl;
667- std::cout << " ----------" << std::endl;
668661 checkCuda (cudaMemcpyAsync (y_vec.begin (), y_vec_cuda.get (), iAprInfo.total_number_particles * sizeof (uint16_t ), cudaMemcpyDeviceToHost, iStream));
669662
670663
@@ -691,8 +684,8 @@ public:
691684};
692685
693686template <typename ImgType>
694- GpuProcessingTask<ImgType>::GpuProcessingTask(const PixelData<ImgType> &image, PixelData< float > &levels, const APRParameters ¶meters, int maxLevel)
695- : impl{new GpuProcessingTaskImpl<ImgType>(image, levels, parameters, maxLevel)} { }
687+ GpuProcessingTask<ImgType>::GpuProcessingTask(const PixelData<ImgType> &image, const APRParameters ¶meters, int maxLevel)
688+ : impl{new GpuProcessingTaskImpl<ImgType>(image, parameters, maxLevel)} { }
696689
697690template <typename ImgType>
698691GpuProcessingTask<ImgType>::~GpuProcessingTask () { }
@@ -834,7 +827,7 @@ void getGradient(PixelData<ImgType> &image, PixelData<ImgType> &grad_temp, Pixel
834827 bool isErrorDetected = false ;
835828 {
836829 ScopedCudaMemHandler<bool *, JUST_ALLOC > isErrorDetectedCuda (&isErrorDetected, 1 , aStream);
837- getGradientCuda (image, local_scale_temp, cudaImage.get (), cudaGrad.get (), cudalocal_scale_temp.get (),
830+ getGradientCuda (image, cudaImage.get (), cudaGrad.get (), cudalocal_scale_temp.get (),
838831 splineCudaX, splineCudaY, splineCudaZ, boundary.get (), isErrorDetected, isErrorDetectedCuda, bspline_offset, par, aStream);
839832 }
840833}
0 commit comments