org.apfloat.internal
Class FloatParallelFNTStrategy

java.lang.Object
  extended by org.apfloat.internal.FloatElementaryModMath
      extended by org.apfloat.internal.FloatModMath
          extended by org.apfloat.internal.FloatTableFNTStrategy
              extended by org.apfloat.internal.FloatParallelFNTStrategy
All Implemented Interfaces:
ParallelNTTStrategy, NTTStrategy
Direct Known Subclasses:
FloatFactor3SixStepNTTStrategy, FloatSixStepFNTStrategy, FloatTwoPassFNTStrategy

public abstract class FloatParallelFNTStrategy
extends FloatTableFNTStrategy
implements ParallelNTTStrategy

Common methods to calculate Fast Number Theoretic Transforms in parallel using multiple threads.

Note that to get any performance gain from running many threads in parallel, the JVM must be executing native threads. If the JVM is running in green threads mode, there is no advantage of having multiple threads, as the JVM will in fact execute just one thread and divide its time to multiple simulated threads.

Version:
1.5.1
Author:
Mikko Tommila

Field Summary
protected  ParallelRunner parallelRunner
          The parallel runner.
 
Constructor Summary
protected FloatParallelFNTStrategy()
          Default constructor.
 
Method Summary
protected  void multiplyElements(ArrayAccess arrayAccess, int startRow, int rows, int columns, float w, float scaleFactor)
          Multiply each matrix element (i, j) by wi * j * scaleFactor.
 void setParallelRunner(ParallelRunner parallelRunner)
          Set the parallel runner to be used when executing the transform.
protected  void transformRows(int length, int count, boolean isInverse, ArrayAccess arrayAccess, float[] wTable, int[] permutationTable)
          Transform the rows of the data matrix.
 
Methods inherited from class org.apfloat.internal.FloatTableFNTStrategy
getTransformLength, inverseTableFNT, inverseTransform, tableFNT, transform
 
Methods inherited from class org.apfloat.internal.FloatModMath
createWTable, getForwardNthRoot, getInverseNthRoot, modDivide, modInverse, modPow, negate
 
Methods inherited from class org.apfloat.internal.FloatElementaryModMath
getModulus, modAdd, modMultiply, modSubtract, setModulus
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.apfloat.spi.NTTStrategy
getTransformLength, inverseTransform, transform
 

Field Detail

parallelRunner

protected ParallelRunner parallelRunner
The parallel runner.

Constructor Detail

FloatParallelFNTStrategy

protected FloatParallelFNTStrategy()
Default constructor.

Method Detail

setParallelRunner

public void setParallelRunner(ParallelRunner parallelRunner)
Description copied from interface: ParallelNTTStrategy
Set the parallel runner to be used when executing the transform.

Specified by:
setParallelRunner in interface ParallelNTTStrategy
Parameters:
parallelRunner - The parallel runner.

multiplyElements

protected void multiplyElements(ArrayAccess arrayAccess,
                                int startRow,
                                int rows,
                                int columns,
                                float w,
                                float scaleFactor)
                         throws ApfloatRuntimeException
Multiply each matrix element (i, j) by wi * j * scaleFactor. The matrix size is n1 x n2.

Parameters:
arrayAccess - The memory array to multiply.
startRow - Which row in the whole matrix the starting row in the arrayAccess is.
rows - The number of rows in the arrayAccess to multiply.
columns - The number of columns in the matrix (= n2).
w - The n:th root of unity (where n = n1 * n2).
scaleFactor - An extra factor by which all elements are multiplied.
Throws:
ApfloatRuntimeException

transformRows

protected void transformRows(int length,
                             int count,
                             boolean isInverse,
                             ArrayAccess arrayAccess,
                             float[] wTable,
                             int[] permutationTable)
                      throws ApfloatRuntimeException
Transform the rows of the data matrix. If only one processor is available, it runs all transforms in the current thread. If more than one processor are available, it dispatches the calculations to multiple threads to parallelize the calculation. The number of processors is determined using ApfloatContext.getNumberOfProcessors().

Parameters:
length - Length of one transform (one row).
count - Number of rows.
isInverse - true if an inverse transform is performed, false if a forward transform is performed.
arrayAccess - The memory array to split to rows and to transform.
wTable - Table of powers of n:th root of unity (where n is the transform length).
permutationTable - Table of permutation indexes, or null if no permutation should be done.
Throws:
ApfloatRuntimeException