[Insight-developers] Re: Threaded dilate/erode
Gaetan Lehmann
gaetan.lehmann at jouy.inra.fr
Mon Nov 21 05:21:33 EST 2005
I have just wrote a small test to verify everything works with several
threads.
It is available at
http://voxel.jouy.inra.fr/darcs/contrib-itk/binaryErodeDilate/
The test dilate an image with a kernel of radius 20 to make a large
overlaping region for each thread, and impose to run 100 threads. The
result is compared with the output of the same filter with just 1 thread.
I have run the test 100 fold without any failure.
Everything seems to work at it should :-)
To compare, when I had problem in my filters, with 10 threads and a kernel
of radius 5, I had errors for nearly each run.
On Mon, 21 Nov 2005 10:31:26 +0100, Gaetan Lehmann
<gaetan.lehmann at jouy.inra.fr> wrote:
>
> It should be easy to verify if there is a problem by writing a small
> test where the number of thread is set to a high value (10 for example).
> The filter I'm write had some problem with threads and this kind of test
> show them very clearly.
>
> I modified the threaded version of Jerome to implement the erode filter
> and to solve the problem with the requested region, but have not tested
> it with several threads. If there is really a problem, we should go back
> to the non threaded version, but we need to be sure the bug with the
> requested region is fixed.
>
> Gaetan
>
>
> On Mon, 21 Nov 2005 05:14:35 +0100, SCHMID, Jerome
> <jeromeschmid at surgery.cuhk.edu.hk> wrote:
>
>> Miller, James V (Research) wrote:
>>
>>> Jerome, Gaetan,
>>>
>>> We have integrated the threaded versions of the binary dilate/erode
>>> into the
>> ITK repository. The use of the ProgressReporter needed to be changed
>> slightly in
>> the multithreaded versions to be thread safe. One of the arguments to
>> the
>> ProgressReporter is the threadId. Thread 0 is only one that outputs
>> information
>> by the ProgressReporter. This argument was set to 0 for all threads,
>> causing
>> some intermittent errors.
>>>
>> Hi Jim,
>>
>> Glad to see that you have interest on the filter implementation. BTW,
>> just by
>> curiosity, what is the effect of :
>> "(void)ThreadId;" in the .txx code?
>>
>>>
>>> I question whether stage 3 is really thread safe. It looks like this
>>> loop can
>> write to pixels that are outside the outputRegionForThread. This could
>> result in
>> two threads writing to the same memory location at the same time. This
>> could
>> result in corrupted memory and in some cases crashes. Can you verify
>> whether or
>> not stage 3 could write to pixels that are outside the
>> outputRegionForThread.
>>>
>>
>> Well I have a deeper look and it doesnt't seem thread-safe... However I
>> am not
>> an expert in iterators/multi-threading so let's see the hazardous
>> points:
>>
>> // Paint SE --> "( BORDER(X) (+) B )" Part:
>>
>> // the dangerous iterator ^_^
>> NeighborhoodIterator<OutputImageType> onit;
>> onit = NeighborhoodIterator<OutputImageType>( kernel.GetRadius(),
>> output,
>> outputRegionForThread );
>>
>> ....
>>
>> // the devil part
>> bool bIsInBound;
>> for( itIndex = indexDifferenceSet.begin(); itIndex !=
>> indexDifferenceSet.end();
>> ++itIndex )
>> {
>> onit.SetPixel( *itIndex, foregroundValue, bIsInBound );
>> }
>>
>> So the pb is: the neighborhoodIterator will write in is "neighboor
>> band" that
>> will overlap the close region of an other thread. The pb is that we
>> need this
>> writing if we want to have a correct result so it cannot be supressed.
>>
>>
>> The last part doesn't cause pb because the output iterator is in the
>> requestedRegionFroThread and the input iterator is in the
>> requestedRegionFroThread padded but in READ mode, which should not
>> cause pb, isn'it?
>>
>> So How to deal with the previous pb?
>>
>> Well I don't know exactly, I am not a thread expert...:-( But I think a
>> mutex/barrier
>> lock may become necessary only on the pixels belonging to the
>> neighborhood that
>> are outside the requested region of the iterator. This may require a new
>> iterator writing...
>>
>> Another solution, maybe not so easy to implement, would be to record
>> these
>> pixels to be writing and problematic and to store them in a structure
>> without
>> performing the writing. These pixels can be identified before the
>> writing. Then,
>> if itk offers this possibility, write these pixels in a *non* threaded
>> way (AfterGenerateThreadedData()
>> function or similar).
>>
>>
>>>
>>> Minor point: ITK style guide requires that TABS be replaced with
>>> spaces. It
>> would make integrating contributed code into ITK smoother if your
>> submissions
>> used spaces for indentation instead of TABS.
>>>
>>
>> Yes you already told me but the threaded code was submitted a long time
>> ago...:-)
>> BTW I do not submit often !
>>
>> Tell me your thinking and we can try to find the best way. BTW I am
>> surprised
>> that there are no filter in itk with the same problematic...
>>
>> Best Regards,
>>
>> Jerome Schmid
>>
>> -----------------------------------
>> Jerome SCHMID
>> Project Manager/ Engineer
>> Augmented and Virtual Reality
>> MIS Centre
>> Prince of Wales Hospital
>> Chinese University Of Hong-Kong
>> -----------------------------------
>>
>
>
>
--
Gaëtan Lehmann
Biologie du Développement et de la Reproduction
INRA de Jouy-en-Josas (France)
tel: +33 1 34 65 29 66 fax: 01 34 65 29 09
http://voxel.jouy.inra.fr
More information about the Insight-developers
mailing list