NA-MIC National Alliance for Medical Image Computing ITK Workshop October 5-8, 2005...

29
NA-MIC National Alliance for Medical Image Computing http://na-mic.org ITK Workshop October 5-8, 2005 Multi-Threading

Transcript of NA-MIC National Alliance for Medical Image Computing ITK Workshop October 5-8, 2005...

Page 1: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

NA-MICNational Alliance for Medical Image Computing http://na-mic.org

ITK Workshop

October 5-8, 2005

Multi-Threading

Page 2: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

ITK Workshop – Multi-Threading

• Multi-Threading– The portable Multi-Threader– Mutual Exclusion– ThreadedGenerateData– BeforeThreadedGenerateData– AfterThreadedGenerateData– SetNumberOfThreads– The Evil legacy of FORTRAN

Page 3: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

The Concept of Multi-Tasking

Insight Toolkit - Advanced Course

Page 4: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

The Multi-Tasking Concept

Task A

Processor

Task B Task C

The Operating System assigns processor time

to each task

Page 5: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Tasks have independent memory spaces

They cannot communicate with each other unless they use sockets or files

Insight Toolkit - Advanced Course

Page 6: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

The Concept of Multi-Threading

Insight Toolkit - Advanced Course

Page 7: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

The Multi-Threading Concept

Task A

Processor

A Threading library creates threads and

assigns processor time to each thread

T0T1

T2

Page 8: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Threads from a common Task have the same memory space (Shared Memory)

They can simultaneously access variables that were instantiated before creating

the threads.

Insight Toolkit - Advanced Course

Page 9: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

The Multi-Threading in Multi-Processors

Task A

Processor 1T0

T1T2

Processor 2

Processor 3

Processor 4

Page 10: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Different Threading libraries are available in different platforms

Insight Toolkit – Multi-Threading Libraries

• PThreads

• SProc

• Win32 Threads

Page 11: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

ITK Provides a class for hiding the differences between threading libraries

Insight Toolkit – Multi-Threading Libraries

itk::MultiThreader

Win32Threads

PThreads SProc

Page 12: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Using the itk::MultiThreader

Insight Toolkit - Advanced Course

• Declare a Callback• Instantiate an itk::MultiThreader• Set the number of Threads• Set the callback• Invoke SingleMethodExecute()

Page 13: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

#include “itkMultiThreader.h”

int main( int argc, char * argv[] ) { typedef itk::MultiThreader ThreaderType;

ThreaderType::Pointer threader = ThreaderType::New();

const unsigned int numberOfThreads = atoi( argv[1] );

threader->SetNumberOfThreads( numberOfThreads );

threader->SetSingleMethod( ThreaderCallback, NULL );

threader->SingleMethodExecute();

}

Using the Multi-Threader

Page 14: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Defining the Theader Callback

#include “itkMultiThreader.h”

ITK_THREAD_RETURN_TYPE ThreaderCallback( void * arg ) {typedef itk::MultiThreader::ThreadInfoStruct ThreadInfoType;

ThreadInfoType * infoStruct = static_cast< ThreadInfoType * >( arg );

const unsigned int threadId = infoStruct->ThreadID;

std::cout << “Thread = “ << threadId << std::endl;

ITK_THREAD_RETURN_TYPE value;

return value;

}

Page 15: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Exercise 31a

Insight Toolkit - Advanced Course

Run the Multi-Caster for different numbers of Threads

Page 16: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

DON’T PUSH THIS BUTTON !

Insight Toolkit - Advanced Course

Page 17: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

DON’T TRY TO WRITE TO SHARED DATA FROM

MULTIPLE THREADS

Insight Toolkit - Advanced Course

Page 18: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Exercise 31b

Insight Toolkit - Advanced Course

Do the wrong thing on purpose:

Attempt to write to a static variable

simultaneously from different Threads

Page 19: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Defining the WRONG Theader Callback

#include “itkMultiThreader.h”

static unsigned long int Counter = 0;

ITK_THREAD_RETURN_TYPE ThreaderCallback( void * arg ) {typedef itk::MultiThreader::ThreadInfoStruct ThreadInfoType;ThreadInfoType * infoStruct = static_cast< ThreadInfoType * >( arg );const unsigned int threadId = infoStruct->ThreadID;

Counter++;

std::cout << “Thread = “ << threadId;std::cout << “Counter = “ << Counter << std::endl;

ITK_THREAD_RETURN_TYPE value;return value;}

Page 20: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

IF YOU REALLY REALLY WANT TO PUSH THIS BUTTON

Insight Toolkit - Advanced Course

Page 21: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Exercise 31c

Insight Toolkit - Advanced Course

Prevent the possible simultaneous

access to share memory by

introducion Mutual Exclusion

Page 22: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Defining the RIGHT Theader Callback

#include “itkMultiThreader.h”#include “itkSimpleFastMutexLock.h”

static unsigned long int Counter = 0;static itk::SimpleFastMutexLock mutex;

ITK_THREAD_RETURN_TYPE ThreaderCallback( void * arg ) { mutex.Lock(); Counter++; mutex.UnLock();

std::cout << “Counter = “ << Counter << std::endl;

ITK_THREAD_RETURN_TYPE value; return value;}

Page 23: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Exercise 31d

Insight Toolkit - Advanced Course

Use the itk::RealTimeClock to measure how fast (or how slow)

the Mutual exclusion

Page 24: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Timing the Mutual Exclusion Class

#include “itkSimpleFastMutexLock.h”#include “itkRealTimeClock.h”static unsigned long int Counter = 0;static itk::SimpleFastMutexLock mutex;int main() { const unsigned int N = 400000L; itk::RealTimeClock clock; const double T1 = clock.GetTimestamp(); for(unsigned long i=0; i < N; i++) { mutex.Lock(); Counter++; mutex.UnLock(); } const double TT = clock.GetTimestamp() – T1; std::cout << “Time = “ << TT / N << td::endl; ITK_THREAD_RETURN_TYPE value; return value; }

Page 25: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Writing a Multi-Threading Filter

Insight Toolkit - Advanced Course

Page 26: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Insight Toolkit – Filters Hierarchy

itk::ProcessObject

public: MultiThreader * GetThreader();

private: MultiThreader m_Threader int m_NumberOfThreads

Page 27: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Insight Toolkit – Filters Hierarchy

itk::ImageSource

public: virtual void BeforeThreadedGenerateData(); virtual void AfterThreadedGenerateData();

virtual void ThreadedGenerateData( const OutputImageRegionType & region, int threadId );

Page 28: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

Insight Toolkit – GenerateData()

BeforeThreadedGenerateData

AfterThreadedGenerateData

TGD TGD TGD TGD TGD

Page 29: NA-MIC National Alliance for Medical Image Computing  ITK Workshop October 5-8, 2005 Multi-Threading.

National Alliance for Medical Image Computing http://na-mic.org

END

Insight Toolkit - Advanced Course