Upload
ariana-mcdowell
View
220
Download
1
Tags:
Embed Size (px)
Citation preview
NA-MICNational Alliance for Medical Image Computing http://na-mic.org
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
National Alliance for Medical Image Computing http://na-mic.org
The Concept of Multi-Tasking
Insight Toolkit - Advanced Course
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
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
National Alliance for Medical Image Computing http://na-mic.org
The Concept of Multi-Threading
Insight Toolkit - Advanced Course
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
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
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
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
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
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()
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
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;
}
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
National Alliance for Medical Image Computing http://na-mic.org
DON’T PUSH THIS BUTTON !
Insight Toolkit - Advanced Course
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
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
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;}
National Alliance for Medical Image Computing http://na-mic.org
IF YOU REALLY REALLY WANT TO PUSH THIS BUTTON
Insight Toolkit - Advanced Course
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
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;}
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
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; }
National Alliance for Medical Image Computing http://na-mic.org
Writing a Multi-Threading Filter
Insight Toolkit - Advanced Course
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
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 );
National Alliance for Medical Image Computing http://na-mic.org
Insight Toolkit – GenerateData()
BeforeThreadedGenerateData
AfterThreadedGenerateData
TGD TGD TGD TGD TGD
National Alliance for Medical Image Computing http://na-mic.org
END
Insight Toolkit - Advanced Course