<html>
<br>
We have received several questions about how to use new multiprocessing
features in VTK (i.e. MPI with VTK).&nbsp; Here is a summary of what has
been done so far, and what we plan to do in the future:<br>
<br>
Kitware has been contracted to extend VTK to handle extremely large data
sets on multiprocessing/distributed systems.&nbsp; The parallel-VTK&nbsp;
tri-lab project (LosAlamos, Sandia, Lawence Livermoore) is being funded
by the ASCI/VIEWS project and is being led by Jim Ahrens from LANL.<br>
<br>
<b>Controllers and MPI :<br>
</b>VTK2.4 had new objects to manage VTK in multiple processes.&nbsp;
Unfortunately, these objects were not operational in the official VTK3.1
release.&nbsp; They are now working and available in the nightly
releases.<br>
<br>
vtkMultiProcessController provides an api for communication.&nbsp; It
initially sets up the processes at the start of the program, and manages
communication between these processes.&nbsp; It can sends arrays, and has
methods for sending vtk data objects between processes.&nbsp; It also
implements remote method invocations (RMIs).&nbsp; Currently, there are
two concrete implementations for the controller object.&nbsp; The default
vtkThreadedController just runs multiple threads and takes advantage of
shared memory to implement the communication methods.&nbsp;
vtkMPIController uses MPI for its communications.&nbsp; The MPI
controller allows VTK to be run on distributed clusters.<br>
<br>
In order to use MPI you have to do several things.&nbsp; The first thing
you need to have are the MPI libraries an header files.&nbsp; Argonne
Nat. Lab. has a free version of MPI at
<a href="http://www-unix.mcs.anl.gov/mpi/mpich/" eudora="autourl">http://www-unix.mcs.anl.gov/mpi/mpich/</a>
.&nbsp; You need to edit you user.make to point to the MPI libraries and include directories.&nbsp; Here is an example from my user.make:<br>
<br>
MPI_INCLUDE=-I/home/lawcc/mpich/include<br>
MPI_LIBS=/home/lawcc/mpich/build/LINUX/ch_p4/lib/libmpich.a /home/lawcc/mpich/build/LINUX/ch_p4/lib/libpmpich.a <br>
<br>
The last step is to use the option &quot;--with-mpi&quot; when you configure VTK.&nbsp; This will make the vtkMPIController the default implementation of the vtkMultiProcessController object.&nbsp; If you want to switch back to the threaded controller, you can set an environment variable (setenv <br>
VTK_CONTROLLER Threaded).<br>
<br>
.../vtk/contrib/examplesCxx/TestController.cxx has a simple example of how controllers are used.<br>
<br>
<b>Ports<br>
</b>vtkInputPort and vtkOutputPort are classes that were initially developed and contributed by Jim Ahrens.&nbsp; They allow you to connect pipelines in separate processes.&nbsp; They use the default controller for communication, and manage pipeline protocol necessary for updating the pipeline.&nbsp; Examples are:<br>
.../vtk/contrib/examplesCxx/TestImagePort.cxx<br>
.../vtk/contrib/examplesCxx/TestStructuredGridPort.cxx<br>
.../vtk/contrib/examplesCxx/TestStructuredGridPort.cxx<br>
.../vtk/contrib/examplesCxx/TestPolyDataPort.cxx<br>
<br>
<br>
<b>Data Parallelism<br>
</b>To take advantage of parallelism, you can break up processing between multiple processes.&nbsp; The easiest way to do this is to divide up the data and have each process handle a piece of it.&nbsp; The image processing pipeline has always had the ability process structured volumes in pieces.&nbsp; This featured has been used to breakup the datasets for streaming (pieces processed one after another).&nbsp; VTK3.1 extended the graphics (unstructured) pipeline to also process pieces.&nbsp; Unstructured pieces are specified by &quot;Borg&quot; notation: piece n of m.&nbsp; It is the responsibility of the source to determine which cells belong in what piece.<br>
<br>
For an example of how unstructured pieces can be used to implement data parallelism take a look at:<br>
.../vtk/contrib/examplesCxx/ParallelIso.cxx<br>
In this example, the append filter asks for different pieces from its inputs.<br>
<br>
Although the pipeline can handle unstructured pieces, only a hand full of sources have been extended to supply pieces.&nbsp; Most use the default behavior of putting the entire dataset in the first piece, and leaving the other pieces empty.&nbsp; We are currently working on expanding the number of sources that can divide their output intelligently.<br>
<br>
<b>Boundaries<br>
</b>The above approach for defining pieces has a problem when filters use information from neighboring cells (i.e. smoothing).&nbsp; The filters treat piece boundaries as dataset boundaries.&nbsp; This will produce seams between pieces.&nbsp; We are working on ways to solve this problem.&nbsp; Filters that require neighboring information would at least give the user an option to disallow pieces.&nbsp; Another proposed solution is to implement ghost cells.&nbsp; Boundary cells would be duplicated in pieces with a special &quot;ghost&quot; status.&nbsp; The last solution will use custom communication during the execute methods of equivalent filters in different processes.<br>
<br>
<br>
<br>
Charles Law.<br>
<br>
<br>
<br>
<br>
<br>
<br>
&nbsp; <br>
<br>
<br>
</html>