Can you test it on the same image?<br>Best,<br>JM<br><br><div class="gmail_quote">On Sun, Oct 14, 2012 at 5:29 PM, Miguel Colom <span dir="ltr"><<a href="mailto:Miguel.Colom@cmla.ens-cachan.fr" target="_blank">Miguel.Colom@cmla.ens-cachan.fr</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear all,<br>
Mauricio and I have found a way to modify the code to avoid the critical sections (SO mutex, slow) and use atomic operations (hardware lock, very fast).<br>
<br>
The source code as published currently in IPOL is absolutely buggy.<br>
<br>
So, to correct the code you have to put a "#pragma omp atomic" at the beginning of lines 229 (fpCount[il]++) and another for line 232 (fpO[ii][il] += fpODenoised[ii][iindex] / fTotalWeight;) in libdenoising.cpp<br>

<br>
Best,<br>
Miguel<div class="HOEnZb"><div class="h5"><br>
<br>
Quoting Miguel Colom <<a href="mailto:Miguel.Colom@cmla.ens-cachan.fr" target="_blank">Miguel.Colom@cmla.ens-cachan.<u></u>fr</a>>:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
I think the problem is at line 232:<br>
 fpO[ii][il] += fpODenoised[ii][iindex] / fTotalWeight;<br>
<br>
The fpODenoised is private for every thread, so it's not problematic.<br>
<br>
Perhaps instead of protecting the loop with a critical section, it'd be faster to just declare the fpO update at line 232 as an atomic operation:<br>
<br>
#pragma omp atomic<br>
fpO[ii][il] += fpODenoised[ii][iindex] / fTotalWeight;<br>
<br>
Best,<br>
Miguel<br>
<br>
Quoting Mauricio Delbracio <<a href="mailto:mdelbra@gmail.com" target="_blank">mdelbra@gmail.com</a>>:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear all,<br>
<br>
I may have found a bug in the NL-means IPOL implementation. The<br>
problem is due to parallelism, particularly when updating shared<br>
values by more than one threading (race condition, race bug).<br>
<br>
In NL-means this happens in the filtered image (fpO) which is shared<br>
and updated by all the threads. The image is decomposed in overlapped<br>
patches that are denoised each of them separately, and then they are<br>
aggregated in the final image (fpO). The problem is that when the<br>
update of fpO  takes place, may happen that two overlapped patches<br>
running in different threads try to update the same memory address.<br>
<br>
This not happen very frequently, since it is very unlikely that two<br>
overlapped patches take the same amount of time to arrive at that part<br>
of the code...The probability of this to happen increases if the<br>
search block (the block where similar patches are searched) is very<br>
small.<br>
<br>
To eliminate the bug, the way I found (a.k.a the easy way) is to<br>
enclose the writing of fpO in a "omp critical" block. This means that<br>
only one thread at at a time can write in fpO (there's a loss in<br>
execution time, probably there other ways of avoiding this problem,<br>
e.g. by using local memory blocks and then update at the end? i don't<br>
know I'm not really familiar with OpenMP).<br>
<br>
I attach a possible patch to libdenoising.cpp.<br>
<br>
The block of code I refer is in libdenoising.cpp between lines 219-238<br>
<a href="http://www.ipol.im/pub/art/2011/bcm_nlm/srcdoc/libdenoising_8cpp_source.html" target="_blank">http://www.ipol.im/pub/art/<u></u>2011/bcm_nlm/srcdoc/<u></u>libdenoising_8cpp_source.html</a><br>
<br>
I also attach an image showing the effect of the bug (parameters<br>
bloc=1, win=1) and some pixels that I manually marked.<br>
<br>
I appreciate any feedback (there are surely many OpenMP experts  in<br>
this mailing-list), so let me know what you think.<br>
<br>
best<br>
m<br>
<br>
</blockquote>
<br>
<br>
______________________________<u></u>_________________<br>
discuss mailing list<br>
<a href="mailto:discuss@list.ipol.im" target="_blank">discuss@list.ipol.im</a><br>
<a href="https://tools.ipol.im/mailman/listinfo/discuss" target="_blank">https://tools.ipol.im/mailman/<u></u>listinfo/discuss</a><br>
<br>
</blockquote>
<br>
<br>
______________________________<u></u>_________________<br>
discuss mailing list<br>
<a href="mailto:discuss@list.ipol.im" target="_blank">discuss@list.ipol.im</a><br>
<a href="https://tools.ipol.im/mailman/listinfo/discuss" target="_blank">https://tools.ipol.im/mailman/<u></u>listinfo/discuss</a><br>
<br>
</div></div></blockquote></div><br>