Editing Parallel package

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
The {{Forge|parallel|parallel package}} is part of the Octave Forge project. See its {{Forge|parallel|homepage}} for the latest release.
The Parallel execution package provides utilities to work with clusters, but also functions to parallelize work among cores of a single machine.


This package provides utilities to work with clusters<ref>[https://octave.sourceforge.io/parallel/package_doc/ Package documentation]</ref>, but also functions to parallelize work among cores of a single machine.
To install: {{Codeline|pkg install -forge parallel}}


* Install: {{Codeline|pkg install -forge parallel}}
And then, once on each octave session, {{Codeline|pkg load parallel}}
* Load: {{Codeline|pkg load parallel}}


== Multicore parallelization (parcellfun, pararrayfun) ==
== multicore parallelization (parcellfun, pararrayfun) ==


=== Calculation on a single array ===


<syntaxhighlight lang="octave">
See also the [[NDpar package]], for an extension of these functions to N-dimensional arrays
 
=== calculation on a single array ===
 
{{Code|simple|<pre>
# fun is the function to apply  
# fun is the function to apply  
fun = @(x) x^2;
fun = @(x) x^2;
Line 17: Line 19:


vector_y = pararrayfun(nproc, fun, vector_x)
vector_y = pararrayfun(nproc, fun, vector_x)
</syntaxhighlight>
</pre>
}}


should output
should output


<syntaxhighlight lang="text">
<code><pre>
parcellfun: 10/10 jobs done
parcellfun: 10/10 jobs done


Line 27: Line 30:


     1    4    9    16    25    36    49    64    81  100
     1    4    9    16    25    36    49    64    81  100
</syntaxhighlight>
</pre></code>


{{Codeline|nproc}} returns the number of cpus available (number of cores or twice as much with hyperthreading). One can use {{Codeline|nproc - 1}} instead, in order to leave one cpu free for instance.
{{Codeline|nproc}} returns the number of cpus available (number of cores or twice as much with hyperthreading). One can use {{Codeline|nproc - 1}} instead, in order to leave one cpu free for instance.
Line 36: Line 39:
If the function is vectorized (can act on a vector and not just on scalar input), then it can be much more efficient to use the {{Codeline|"Vectorized", true}} option.
If the function is vectorized (can act on a vector and not just on scalar input), then it can be much more efficient to use the {{Codeline|"Vectorized", true}} option.


<syntaxhighlight lang="octave">
{{Code|vectorized|<pre>
# fun is the function to apply, vectorized (see the dot)
# fun is the function to apply, vectorized (see the dot)
fun = @(x) x.^2;
fun = @(x) x.^2;
Line 43: Line 46:


vector_y = pararrayfun(nproc, fun, vector_x, "Vectorized", true, "ChunksPerProc", 1)
vector_y = pararrayfun(nproc, fun, vector_x, "Vectorized", true, "ChunksPerProc", 1)
</syntaxhighlight>
</pre>
}}
should output
should output


<syntaxhighlight lang="text">
<code><pre>
parcellfun: 4/4 jobs done
parcellfun: 4/4 jobs done
vector_y =
vector_y =


     1    4    9    16    25    36    49    64    81  100
     1    4    9    16    25    36    49    64    81  100
</syntaxhighlight>
</pre></code>


The {{Codeline|"ChunksPerProc"}} option is mandatory with {{Codeline|"Vectorized", true}}. {{Codeline|1}} means that each proc will do its job in one shot (chunk). This number can be increased to use less memory for instance. A higher number of {{Codeline|"ChunksPerProc"}} allows also more flexibility in case of long calculations on a busy machine. If one cpu has finished all its jobs, it can take over the pending jobs of another.
The {{Codeline|"ChunksPerProc"}} option is mandatory with {{Codeline|"Vectorized", true}}. {{Codeline|1}} means that each proc will do its job in one shot (chunk). This number can be increased to use less memory for instance. A higher number of {{Codeline|"ChunksPerProc"}} allows also more flexibility in case of long calculations on a busy machine. If one cpu has finished all its jobs, it can take over the pending jobs of another.
Line 57: Line 61:
=== Output in cell arrays ===
=== Output in cell arrays ===


The following sample code was an answer to [https://stackoverflow.com/questions/27422219/for-every-row-reshape-and-calculate-eigenvectors-in-a-vectorized-way this question]. The goal was to diagonalize 2x2 matrices contained as rows of a 2d array (each row of the array being a flattened 2x2 matrix).
The following sample code was an answer to [http://stackoverflow.com/questions/27422219/for-every-row-reshape-and-calculate-eigenvectors-in-a-vectorized-way this question]. The goal was to diagonalize 2x2 matrices contained as rows of a 2d array (each row of the array being a flattened 2x2 matrix).


<syntaxhighlight lang="octave">
{{code|diagonalize NxN matrices contained in an array|
<pre>
A = [0.6060168 0.8340029 0.0064574 0.7133187;
A = [0.6060168 0.8340029 0.0064574 0.7133187;
    0.6325375 0.0919912 0.5692567 0.7432627;
0.6325375 0.0919912 0.5692567 0.7432627;
    0.8292699 0.5136958 0.4171895 0.2530783;
0.8292699 0.5136958 0.4171895 0.2530783;
    0.7966113 0.1975865 0.6687064 0.3226548;
0.7966113 0.1975865 0.6687064 0.3226548;
    0.0163615 0.2123476 0.9868179 0.1478827];
0.0163615 0.2123476 0.9868179 0.1478827];


N = 2;
N = 2;
Line 70: Line 75:
                                 @(row_idx) eig(reshape(A(row_idx, :), N, N)),  
                                 @(row_idx) eig(reshape(A(row_idx, :), N, N)),  
                                 1:rows(A), "UniformOutput", false)
                                 1:rows(A), "UniformOutput", false)
</syntaxhighlight>
</pre>
}}


With {{codeline|"UniformOutput", false}}, the outputs are contained in cell arrays (one cell per slice). In the sample above, both {{codeline|eigenvectors}} and {{codeline|eigenvalues}} are {{codeline|1x5}} cell arrays.
With {{codeline|"UniformOutput", false}}, the outputs are contained in cell arrays (one cell per slice). In the sample above, both {{codeline|eigenvectors}} and {{codeline|eigenvalues}} are {{codeline|1x5}} cell arrays.


== References ==
== cluster operation ==
 
<references />
 
== See also ==


* [[File:Examples_of_how_to_use_parrarrayfun.pdf]]
Documentation can be found in the {{codeline|README.parallel}} or {{codeline|README.bw}} files, located inside the {{codeline|doc}} directory of the parallel package.
* [[NDpar package]] - an extension of these functions to N-dimensional arrays


[[Category:Octave Forge]]
[[Category:Octave Forge]]
Please note that all contributions to Octave may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Octave:Copyrights for details). Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)

Templates used on this page: