I have a VTK app that is extremely slow due to some setup/cleanup work,
and I'ld like to multiprocess those steps, as they should be very
trivial.&nbsp; Can someone show me how this is done with VTK?<br>
<br>
My setup code is like the following:<br>
&nbsp;&nbsp;&nbsp; (first setup a vtkDataSetReader &amp; load the data)<br>
&nbsp;&nbsp;&nbsp; if ((data = (double*)malloc(sizeof(double)*bins*bins*bins)) == NULL) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror(&quot;Unable to allocate memory!\n\t&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; vtkDoubleArray *velarray = static_cast&lt;vtkDoubleArray *&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (reader-&gt;GetOutput()-&gt;GetPointData()-&gt;GetArray(&quot;Velocity&quot;));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;Using array: %s\n&quot;, velarray-&gt;GetName());<br>
&nbsp;&nbsp;&nbsp; for(id=0; id &lt; reader-&gt;GetOutput()-&gt;GetNumberOfPoints(); id++) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; velarray-&gt;GetTupleValue(id, velocity);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[id] = velocity[0];<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; reader-&gt;Delete();<br>
&nbsp;&nbsp; vtkDoubleArray *ucPointer = vtkDoubleArray::New();<br>
&nbsp;&nbsp;&nbsp; ucPointer-&gt;SetNumberOfComponents(1);<br>
&nbsp;&nbsp;&nbsp; ucPointer-&gt;SetArray(data, bins*bins*bins, 1);<br>
&nbsp;&nbsp;&nbsp; ucPointer-&gt;SetName(&quot;Velocity&quot;);<br>
<br>
&nbsp;&nbsp;&nbsp; vtkImageData *image = vtkImageData::New();<br>
&nbsp;&nbsp;&nbsp; image-&gt;Initialize();<br>
&nbsp;&nbsp;&nbsp; image-&gt;SetDimensions(bins,bins,bins);<br>
&nbsp;&nbsp;&nbsp; image-&gt;SetExtent(1, bins, 1, bins, 1, bins);<br>
&nbsp;&nbsp;&nbsp; image-&gt;SetScalarTypeToDouble();<br>
&nbsp;&nbsp;&nbsp; image-&gt;SetNumberOfScalarComponents(1);<br>
&nbsp;&nbsp;&nbsp; image-&gt;GetPointData()-&gt;SetScalars(ucPointer);<br>
<br>
&nbsp;&nbsp;&nbsp; ucPointer-&gt;Delete();<br>
Essentially, I just create a vtkImageData of the 1 field from the dataset that I want.<br>
<br>
Then I do all my computations, and at the end:<br>
<br>
&nbsp;&nbsp;&nbsp; vtkDoubleArray *fftMag = static_cast&lt;vtkDoubleArray *&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (fft-&gt;GetOutput()-&gt;GetPointData()-&gt;GetArray(&quot;Velocity&quot;));<br>
&nbsp;&nbsp;&nbsp; for(id=0; id &lt; fft-&gt;GetOutput()-&gt;GetNumberOfPoints(); id++) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fft-&gt;GetOutput()-&gt;GetPoint(id, xyz);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xpos = xyz[0];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((xyz[1] &lt;= halfbins) &amp;&amp; (xyz[0] &lt;= halfbins)) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fftMag-&gt;GetTupleValue(id, val);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sums[xpos] += ((val[0]*val[0]) + (val[1]*val[1]));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
Here I take the output of all the FFT &amp; computational stuff, and
create a simple 1-D array which is written to a text file on disk later.<br>
<br>
Both of these should be prime candidates for multithreading.&nbsp; Any suggestions?<br>
<br clear="all"><br>-- <br>Randall Hand<br>Visualization Scientist, <br>ERDC-MSRC Vicksburg, MS<br>Homepage: <a href="http://www.yeraze.com">http://www.yeraze.com</a>