<div dir="ltr"><div>Hi Chao,</div><div>Thanks for the report. I agree this is bug, do you mind opening an issue on github?</div><div>I think the reason is the following:</div><div>- In <a href="https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageGrid/include/itkChangeInformationImageFilter.hxx#L185">GenerageData</a> of ChangeImageInformationImageFilter, <span class="gmail-pl-c1">SetPixelContainer</span> is called,</div><div>- <a href="https://github.com/SimonRit/RTK/blob/master/utilities/ITKCudaCommon/include/itkCudaImage.hxx#L163">itk::CudaImage::SetPixelContainer</a> will not work if the GPUBuffer is clean and not the CPU buffer: the data is in the GPUBuffer, which is dropped, and the CPU buffer is as clean as what the input gave.<br></div><div>I can't find a solution at this time so opening an issue makes sense.</div><div>Thanks in advance!</div><div>Simon<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 20, 2018 at 1:26 PM, Chao Wu <span dir="ltr"><<a href="mailto:wuchao04@gmail.com" target="_blank">wuchao04@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi all,<div><br></div><div>There seems to be a CPU-GPU synchronization issue if an itk::<wbr>ChangeInformationImageFilter<<wbr>itk::CudaImage<...>> is inserted before a Cuda filter. It works if the <span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">ChangeInformationImageFilt<wbr>er is inserted before a CPU filter.</span></div><div><span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div>The issue can be reproduced with the rtkSartCudaTest and the following patch:</div><div><br></div><div>==============================<wbr>==============================<wbr>============</div><b><font face="monospace, monospace">File: include/<wbr>rtkSARTConeBeamReconstructionF<wbr>ilter.hxx</font></b><blockquote class="gmail_quote" style="margin:0px 0.8ex;border-left:1px solid rgb(204,204,204);border-right:1px solid rgb(204,204,204);padding-left:1ex;padding-right:1ex"></blockquote><font face="monospace, monospace"><br></font><blockquote class="gmail_quote" style="margin:0px 0.8ex;border-left:1px solid rgb(204,204,204);border-right:1px solid rgb(204,204,204);padding-left:1ex;padding-right:1ex"></blockquote><div><font face="monospace, monospace">@@ -18,10 +18,11 @@</font></div><div><font face="monospace, monospace"> </font></div><div><font face="monospace, monospace"> #ifndef rtkSARTConeBeamReconstructionF<wbr>ilter_hxx</font></div><div><font face="monospace, monospace"> #define rtkSARTConeBeamReconstructionF<wbr>ilter_hxx</font></div><div><font face="monospace, monospace"> </font></div><div><font face="monospace, monospace"> #include "<wbr>rtkSARTConeBeamReconstructionF<wbr>ilter.h"</font></div><div><font face="monospace, monospace" color="#38761d">+#include <<wbr>itkChangeInformationImageFilte<wbr>r.h></font></div><div><font face="monospace, monospace"> </font></div><div><font face="monospace, monospace"> #include <algorithm></font></div><div><font face="monospace, monospace"> </font></div><div><font face="monospace, monospace"> namespace rtk</font></div><div><font face="monospace, monospace"> {</font></div><div><font face="monospace, monospace">@@ -282,10 +283,15 @@ SARTConeBeamReconstructionFilt<wbr>er<TVolumeImage, TProjectionImage></font></div><div><font face="monospace, monospace"> </font></div><div><font face="monospace, monospace">   // Declare the image used in the main loop</font></div><div><font face="monospace, monospace">   typename TVolumeImage::Pointer pimg;</font></div><div><font face="monospace, monospace">   typename TVolumeImage::Pointer norm;</font></div><div><font face="monospace, monospace"> </font></div><div><font face="monospace, monospace" color="#38761d">+  // test: insert itkChangeInformationImageFilte<wbr>r</font></div><div><font face="monospace, monospace" color="#38761d">+  itk::<wbr>ChangeInformationImageFilter<<wbr>VolumeType>::Pointer change = itk::<wbr>ChangeInformationImageFilter<<wbr>VolumeType>::New();</font></div><div><font face="monospace, monospace" color="#38761d">+  change->SetInput(this-><wbr>GetInput(0));</font></div><div><font face="monospace, monospace" color="#38761d">+  m_ForwardProjectionFilter-><wbr>SetInput(1, change->GetOutput());</font></div><div><font face="monospace, monospace" color="#38761d">+</font></div><div><font face="monospace, monospace">   // For each iteration, go over each projection</font></div><div><font face="monospace, monospace">   for(unsigned int iter = 0; iter < m_NumberOfIterations; iter++)</font></div><div><font face="monospace, monospace">     {</font></div><div><font face="monospace, monospace">     unsigned int projectionsProcessedInSubset = 0;</font></div><div><font face="monospace, monospace">     for(unsigned int i = 0; i < nProj; i++)</font></div><div><font face="monospace, monospace">@@ -326,11 +332,11 @@ SARTConeBeamReconstructionFilt<wbr>er<TVolumeImage, TProjectionImage></font></div><div><font face="monospace, monospace">         else</font></div><div><font face="monospace, monospace">           pimg = m_AddFilter->GetOutput();</font></div><div><font face="monospace, monospace">         pimg->Update();</font></div><div><font face="monospace, monospace">         pimg->DisconnectPipeline();</font></div><div><font face="monospace, monospace"> </font></div><div><font face="monospace, monospace" color="#ff0000">-        m_ForwardProjectionFilter-><wbr>SetInput(1, pimg );</font></div><div><font face="monospace, monospace" color="#38761d">+        change->SetInput(pimg);</font></div><div><font face="monospace, monospace">         m_AddFilter->SetInput2(pimg);</font></div><div><font face="monospace, monospace">         m_BackProjectionFilter-><wbr>SetInput(0, m_ConstantVolumeSource-><wbr>GetOutput());</font></div><div><font face="monospace, monospace">         m_<wbr>BackProjectionNormalizationFil<wbr>ter->SetInput(0, m_ConstantVolumeSource-><wbr>GetOutput());</font></div><div><font face="monospace, monospace"> </font></div><div><font face="monospace, monospace">         projectionsProcessedInSubset = 0;</font></div><div>==============================<wbr>==============================<wbr>============ <br></div><div><br></div><div>Results from the 

<span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">rtkSartCudaTest</span>:</div><div><br></div><div><div><font face="monospace, monospace">****** Case 1: Voxel-Based Backprojector ******</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Error per Pixel = 0.0206672</font></div><div><font face="monospace, monospace">MSE = 0.00282352</font></div><div><font face="monospace, monospace">PSNR = 31.5127dB</font></div><div><font face="monospace, monospace">QI = 0.989666</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Test PASSED!</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">****** Case 2: Voxel-Based Backprojector, OS-SART with 2 projections per subset ******</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Error per Pixel = 0.0225105</font></div><div><font face="monospace, monospace">MSE = 0.00346037</font></div><div><font face="monospace, monospace">PSNR = 30.6294dB</font></div><div><font face="monospace, monospace">QI = 0.988745</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Test PASSED!</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">****** Case 3: Joseph Backprojector ******</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Error per Pixel = 0.0189275</font></div><div><font face="monospace, monospace">MSE = 0.00259909</font></div><div><font face="monospace, monospace">PSNR = 31.8724dB</font></div><div><font face="monospace, monospace">QI = 0.990536</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Test PASSED!</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">****** Case 4: CUDA Voxel-Based Backprojector ******</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Error per Pixel = 16.5716</font></div><div><font face="monospace, monospace">MSE = 525.278</font></div><div><font face="monospace, monospace">PSNR = -21.1833dB</font></div><div><font face="monospace, monospace">QI = -7.28582</font></div><div><font face="monospace, monospace">Test Failed, Error per pixel not valid! 16.5716 instead of 0.032</font></div></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Best regards,</font></div><div><font face="arial, helvetica, sans-serif">Chao</font></div></div>
<br>______________________________<wbr>_________________<br>
Rtk-users mailing list<br>
<a href="mailto:Rtk-users@public.kitware.com">Rtk-users@public.kitware.com</a><br>
<a href="https://public.kitware.com/mailman/listinfo/rtk-users" rel="noreferrer" target="_blank">https://public.kitware.com/<wbr>mailman/listinfo/rtk-users</a><br>
<br></blockquote></div><br></div>