Discussion:
[ITK-users] MultiThreading, ImageRegionIterator crash
Nicolas Courtial
2017-06-07 09:46:17 UTC
Permalink
Hello everyone,

I'm quite new in ITK world, and I'm currently doing few experiences in
order to learn its logic.

After few easy exercices, I'm now at a step I want to multithread a method.
As I did in the past, I've been reading the ITK classes to get
"inspiration", and e- mails from here in case of troubles.

I'm facing an issue at the moment, and I can't figure why, and how to
solve it.

My filter works with

* One 3D InputImage (of any pixel type)
* Two "tool" 3D images, respectively of float and unsigned char pixel
types

From what I read, I've understood there are two main ways of
multithreading:

* The old fashioned one using
BeforeThreadedGenerateData/ThreadedGenerateData/AfterThreadedGenerateData
* the one using itk::DomainThreader member.

As I'm a bit old school, I used the first option.

My problem remains here: (I changed my variables' name to make it clearer)

ThreadedComputation(const OutputImageRegionType &outputRegionForThread,
ThreadIdType threadId) {
itk::ProgressReporter progress(this, threadId,
outputRegionForThread.GetNumberOfPixels());
typename TOutputImage::Pointer image = this->GetOutput(0);

itk::ImageRegionIterator< TOutputImage > imgIt(image,
outputRegionForThread);
itk::ImageRegionIterator< FloatImageType> floatIt
(m_MyFloatImage, outputRegionForThread);
....

When creating the floatIt iterator, I have a crash. Using a try catch
block, the issue is due to out of bound region.
Everything is correct, but the index, for which it's completly crazy
([156245468,0,156245468] or something approching).

I've tried different options to solve this, but rather than doing
witchcraft and at some point getting something working, I'd prefer to
improve my understanding thanks to your expertise.

Thanks all,

Nicolas Courtial
Dženan Zukić
2017-06-07 13:34:38 UTC
Permalink
Hi Nicolas,

ThreadedComputation should be called ThreadedGenerateData, otherwise the
code looks OK. If you overrode AllocateOutputs(), then you might not have
allocated the output (assuming index is wrong for imgIt). Can you provide a
runnable example <http://sscce.org/>?

Regards,
DÅŸenan Zukić, PhD, Senior R&D Engineer, Kitware (Carrboro, N.C.)

On Wed, Jun 7, 2017 at 5:46 AM, Nicolas Courtial <
Post by Nicolas Courtial
Hello everyone,
I'm quite new in ITK world, and I'm currently doing few experiences in
order to learn its logic.
After few easy exercices, I'm now at a step I want to multithread a method.
As I did in the past, I've been reading the ITK classes to get
"inspiration", and e- mails from here in case of troubles.
I'm facing an issue at the moment, and I can't figure why, and how to
solve it.
My filter works with
- One 3D InputImage (of any pixel type)
- Two "tool" 3D images, respectively of float and unsigned char pixel
types
From what I read, I've understood there are two main ways of
- The old fashioned one using BeforeThreadedGenerateData/
ThreadedGenerateData/AfterThreadedGenerateData
- the one using itk::DomainThreader member.
As I'm a bit old school, I used the first option.
My problem remains here: (I changed my variables' name to make it clearer)
ThreadedComputation(const OutputImageRegionType &outputRegionForThread,
ThreadIdType threadId) {
itk::ProgressReporter progress(this, threadId,
outputRegionForThread.GetNumberOfPixels());
typename TOutputImage::Pointer image = this->GetOutput(0);
itk::ImageRegionIterator< TOutputImage > imgIt(image,
outputRegionForThread);
itk::ImageRegionIterator< FloatImageType> floatIt (m_MyFloatImage,
outputRegionForThread);
....
When creating the floatIt iterator, I have a crash. Using a try catch
block, the issue is due to out of bound region.
Everything is correct, but the index, for which it's completly crazy
([156245468,0,156245468] or something approching).
I've tried different options to solve this, but rather than doing
witchcraft and at some point getting something working, I'd prefer to
improve my understanding thanks to your expertise.
Thanks all,
Nicolas Courtial
_____________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
http://www.kitware.com/products/protraining.php
http://www.itk.org/Wiki/ITK_FAQ
http://public.kitware.com/mailman/listinfo/insight-users
Nicolas Courtial
2017-07-18 14:22:15 UTC
Permalink
Hi everyone,

I'm really sorry I haven't given any news since your answer. I had to
change my plans to rush other problems I had to deal with.
Anyway, yesterday I've had the occasion to think about everything once
from the start, and.... Well, it has driven to the classical "Oh dear,
how could I miss that".

Anyway, the solution was within the question:
remindiner: "e/verything is correct, but the index, for which it's
completly crazy ([156245468,0,156245468] or something approching)."/

During my algorithm, I needed to create an image to store energy levels.
I had for that created a dedicated module.
That one was incomplete, and wasn't correclty setting the start index of
the image's region.

Sorry again about that, and thanks for your advices!
Post by Dženan Zukić
Hi Nicolas,
ThreadedComputation should be called ThreadedGenerateData, otherwise
the code looks OK. If you overrode AllocateOutputs(), then you might
not have allocated the output (assuming index is wrong for imgIt). Can
you provide a runnable example <http://sscce.org/>?
Regards,
DÅŸenan Zukić, PhD, Senior R&D Engineer, Kitware (Carrboro, N.C.)
On Wed, Jun 7, 2017 at 5:46 AM, Nicolas Courtial
Hello everyone,
I'm quite new in ITK world, and I'm currently doing few
experiences in order to learn its logic.
After few easy exercices, I'm now at a step I want to multithread a method.
As I did in the past, I've been reading the ITK classes to get
"inspiration", and e- mails from here in case of troubles.
I'm facing an issue at the moment, and I can't figure why, and how
to solve it.
My filter works with
* One 3D InputImage (of any pixel type)
* Two "tool" 3D images, respectively of float and unsigned char
pixel types
From what I read, I've understood there are two main ways of
* The old fashioned one using
BeforeThreadedGenerateData/ThreadedGenerateData/AfterThreadedGenerateData
* the one using itk::DomainThreader member.
As I'm a bit old school, I used the first option.
My problem remains here: (I changed my variables' name to make it clearer)
ThreadedComputation(const OutputImageRegionType
&outputRegionForThread, ThreadIdType threadId) {
itk::ProgressReporter progress(this, threadId,
outputRegionForThread.GetNumberOfPixels());
typename TOutputImage::Pointer image = this->GetOutput(0);
itk::ImageRegionIterator< TOutputImage > imgIt(image,
outputRegionForThread);
itk::ImageRegionIterator< FloatImageType> floatIt
(m_MyFloatImage, outputRegionForThread);
....
When creating the floatIt iterator, I have a crash. Using a try
catch block, the issue is due to out of bound region.
Everything is correct, but the index, for which it's completly
crazy ([156245468,0,156245468] or something approching).
I've tried different options to solve this, but rather than doing
witchcraft and at some point getting something working, I'd prefer
to improve my understanding thanks to your expertise.
Thanks all,
Nicolas Courtial
_____________________________________
Powered by www.kitware.com <http://www.kitware.com>
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
<http://www.kitware.com/opensource/opensource.html>
http://www.kitware.com/products/protraining.php
<http://www.kitware.com/products/protraining.php>
http://www.itk.org/Wiki/ITK_FAQ <http://www.itk.org/Wiki/ITK_FAQ>
http://public.kitware.com/mailman/listinfo/insight-users
<http://public.kitware.com/mailman/listinfo/insight-users>
------------------------------------------------------------------------
Logo AVG <http://www.avg.com/internet-security>
Cet email a fait l'objet d'une analyse antivirus par le logiciel
antivirus AVG.
www.avg.com <http://www.avg.com/internet-security>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
Loading...