[Insight-users] my ITK code is slow: what is wrong?

Jesse C Cronce croncejc at mrctr.upmc.edu
Tue Nov 29 10:07:26 EST 2005


Build your code with profiling information and look at what commands are
being called the most number of times. I don't know what you can do w/
VC++, but I would imagine that you can get (at least) the number of
calls to specific functions and the time spent in different functions.

On Tue, 2005-11-29 at 13:31 +0100, Renaud Isabelle wrote:
> I am using Microsft Visual C++ .NET 2003 compiler. What do you mean by
> "what optimiztion leve^l?". Even during execution without debuggage,
> the execution takes a lot of times compared with matlab
>  
> Isabelle
> 
> "Lorensen, William E (Research)" <lorensen at crd.ge.com> a écrit :
>         Which compiler are you using? What optimization level? ITK is
>         very sensitive to optimization. On Windows you should build
>         RelWithDebInfo or Release. Debug builds are very slow.
>          
>         Bill
>                 -----Original Message-----
>                 From: insight-users-bounces
>                 +lorensen=crd.ge.com at itk.org [mailto:insight-users-
>                 bounces+lorensen=crd.ge.com at itk.org]On Behalf Of
>                 Renaud Isabelle
>                 Sent: Monday, November 28, 2005 5:04 PM
>                 To: insight-users at itk.org
>                 Subject: [Insight-users] my ITK code is slow: what is
>                 wrong? 
>                 
>                 
>                 Hi,
>                  
>                 I translate a matlab procedure into C++ with ITK to
>                 make things quicker. Now, comparing both of them, I
>                 found that results are the same but my C++ version
>                 with ITK is twice slower than matlab, whereas the
>                 contrary was expected. Could someone tell me what is
>                 wrong with my code: is there things that I can improve
>                 and time that I can save?
>                  
>                 Here is what I did:
>                  
>                 constructeur()
>                 {
>                   this->input = NULL;
>                   this->image1 = NULL;
>                   this->image2 = NULL;
>                   this->coeff = NULL;
>                   this->shiftx = NULL;
>                   this->shifty = NULL;
>                  
>                   //filters
>                   extractSlice = ExtractSliceFilter::New();
>                   extractRegion = ExtractRegionFilter::New();
>                   fft1 = FFTFilterType::New();
>                   fft2 = FFTFilterType! ::New(); 
>                   mult = MultiplyFilter::New(); 
>                   ifft = IFFTFilterType::New();
>                  
>                   //release extra data
>                   extractSlice->GetOutput()->ReleaseDataFlagOn();
>                   extractRegion->GetOutput()->ReleaseDataFlagOn();
>                   fft1->GetOutput()->ReleaseDataFlagOn();
>                   fft2->GetOutput()->ReleaseDataFlagOn();
>                   mult->GetOutput()->ReleaseDataFlagOn();
>                   ifft->GetOutput()->ReleaseDataFlagOn();
>                   
>                   mult->SetInput1(fft1->GetOutput());
>                   mult->SetInput2(fft2->GetOutput());
>                   ifft->SetInput(mult->GetOutput()); 
>                 }
>                 void ComputeElastogram::SetInput
>                 ( ImageType3D::ConstPointer image)
>                 {
>                 this->input = image;
>                 extractSlice->SetInput(this->input);
>                 this->calcul_deplacements();}
>                  
>                 void ComputeElastogram::calcul_deplacements() 
>                 {
>                 unsigned int k1,k2,n;
>                  
>                 //Creation des matrices de deplacement
>                 ImageType::IndexType start;
>                 start.Fill(0); 
>                 ImageType::SizeType sz;
>                 sz[0] = dim_s[0]; 
>                 sz[1] = dim_s[1]; 
>                 ImageType::RegionType region;
>                 region.SetSize( sz );
>                 region.SetIndex( start );
>                 shifty = ImageType::New();
>                 shifty->SetRegions( region );
>                 shifty->Allocate();
>                 shiftx = ImageType::New();
>                 shiftx->SetRegions( region );
>                 shiftx->Allocate();
>                  
>                 rowa = dim_fen[0]; cola = dim_fen[1];
>                 /*--------Cropped ROI-------------*/
>                 ImageType3D::SizeType croppedSizee;
>                 croppedSize[0] = dim_img[0];//dim_roi[0];
>                 croppedSize[1] = dim_img[1];//dim_roi[1];
>                 croppedSize[2] = 0;
>                  
>                 ImageType3D::IndexType croppedStart;
>                 croppedStart[0] = 0;//bords_c[0];
>                 croppedStart[1] = 0;//bords_l[0];
>                 croppedStart[2] = 0; 
>                  
>                 ImageType3D::RegionType croppedRegion;
>                 croppedRegion.SetSize(croppedSize);
>                 croppedRegion.SetIndex(croppedStart);
>                  
>                 /*------------------------------------*/
>                 /*--------WINDOWS--------------------*/
>                 ImageType::SizeType extractedSize;
>                 extractedSize[0] =80;
>                 extractedSize[1] = 20;
>                 ImageType::IndexType extractedStart;
>                 extractedStart.Fill(0); 
>                 ImageType::RegionType desiredRegion;
>                 desiredRegion.SetSize(extractedSize); 
>                 desiredRegion.SetIndex(extractedStart); 
>                 /*------------------------------------*/
>                  
>                 /*--------Hanning Window--------------*/ 
>                 ImageType::Pointer hanning = ImageType::New();
>                 hanning->SetRegions( desiredRegion );
>                 hanning->Allocate();
>                 float **w = hanning_2D(dim_fen[1],dim_fen[0]);//taille
>                 de la fenetre 20lignes * 80colonnes
>                 ImageRegionIterator it(hanning, desiredRegion); 
>                 for(int i=0;i<dim_fen[1];i++)
>                 for(int j=0; j<dim_fen[0]; j++)
>                 {
>                   it.Set(w[i][j]);
>                   ++it;
>                 }
>                 free_fmatrix_2d(w);
>                  
>                 fhan = WindowFilter::New();
>                 fhan->GetOutput()->ReleaseDataFlagOn();
>                 fhan->SetInput1(hanning);
>                 fhan->SetInput2(extractRegion->GetOutput());
>                 /*------------------------------------*/
>                  
>                 < 
>                 ImageRegionIterator it1(shifty, shifty-
>                 >GetLargestPossibleRegion()); 
>                 ImageRegionIterator it2(shiftx, shiftx-
>                 >GetLargestPossibleRegion());
>                  
>                 croppedStart[2] = 0;
>                 croppedRegion.SetIndex(croppedStart); 
>                 extractSlice->SetExtractionRegion(croppedRegion);
>                 extractSlice->Update();
>                 ImageType2D::Pointer im0 = extractSlice->GetOutput();
>                 im0->DisconnectPipeline(); 
>                  
>                 croppedStart[2] = 1;
>                 croppedRegion.SetIndex(croppedStart); 
>                 extractSlice->SetExtractionRegion(croppedRegion);
>                 extractSlice->Modified();
>                 extractSlice->Update();
>                 ImageType2D::Pointer im1 = extractSlice->GetOutput();
>                 im1->DisconnectPipeline();
>                 //-------------------------------------------------------------------
>                  
>                 it1.GoToBegin();
>                 it2.GoToBegin(); 
>                  
>                 // Correlation 
>                 for(k1 = 0; k1 < dim_s[0]; k1++)
>                 {
>                 for(k2 = 0; k2 < dim_s[1]; k2++)
>                 { 
>                   extractedStart[0] = k1*pas_fen[0]+ bords_c[0]; 
>                   extractedStart[1] = k2*pas_fen[1]+ bords_l[0];
>                   desiredRegion.SetIndex(extractedStart); 
>                   extractRegion->SetRegionOfInterest(desiredRegion); 
>                   extractRegion->SetInput(im0); 
>                   fhan->Update();
>                   image1 = fhan->GetOutput();
>                   image1->DisconnectPipeline();
>                   extractRegion->SetInput(im1); 
>                   fhan->Update();
>                   image2 = fhan->GetOutput();
>                   image2->DisconnectPipeline();
>                   int *shft = shift(image1,image2);
>                   it1.Set(shft[0]);
>                   it2.Set(shft[1]);
>                   ++it1;
>                   ++it2;
>                 }//k1
>                 }//k2 
>                  
>                 timer.Stop();
>                 fprintf(fp, "\n Elapsed time: %f\n", timer.GetMeanTime
>                 ());
>                 }
>                  
>                 int* ComputeElastogram::shift( ImageType::Pointer
>                 image1, ImageType::Pointer image2) 
>                 {
>                 int *shft = new int[2];
>                 this->calcul_coef(image2,image1);
>                  
>                 ImageType::IndexType index;
>                 index[0] = 0; index[1] = 0;
>                 unsigned int row, col; 
>                 row=col=0;
>                 ImageType::PixelType max = coeff->GetPixel(index); 
>                 ImageRegionIterator it(coeff, coeff-
>                 >GetLargestPossibleRegion()); 
>                 while( !it.IsAtEnd() )
>                 {
>                   if(it.Get()>max)
>                   {
>                   max = it.Get();
>                   index=it.GetIndex();
>                   row = index[0];
>                   col = index[1];
>                 }
>                 ++it;
>                 }
>                 shft[0] = - rowa * (row > (int)(rowa/2) ) + row;
>                 shft[1] = - cola * (col > (int)(cola/2)) + col;}
>                 return shft;
>                 }
>                 void ComputeElastogram::calcul_coef
>                 ( ImageType::Pointer image1, ImageType::Pointer
>                 image2) 
>                 { 
>                 // Forward FFT filter
>                 fft1->SetInput( image1 );
>                 fft2->SetInput( image2 );
>                 try{ ifft->Update(); }
>                 catch(itk::ExceptionObject &e){
>                 CString msg;
>                 msg.Format("Erreur %s in %s\n", e.GetDescription(),
>                 e.GetLocation());
>                 return;
>                 }
>                 // Iterator which traverse the image
>                 coeff = ifft->GetOutput();
>                 }
>                  
>                 Actually, I don't see what is wrong. I tried to
>                 release data and so on, but it seems to make any
>                 difference. 
>                  
>                 Please help,
>                  
>                 Isabelle
>                 
>                 ______________________________________________________
>                 Appel audio GRATUIT partout dans le monde avec le
>                 nouveau Yahoo! Messenger
>                 Téléchargez le ici ! 
> 
> 
> 
> 
> ______________________________________________________________________
> Appel audio GRATUIT partout dans le monde avec le nouveau Yahoo!
> Messenger
> Téléchargez le ici ! 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users



More information about the Insight-users mailing list