org.apfloat.internal
Class FloatParallelFNTStrategy
java.lang.Object
org.apfloat.internal.FloatElementaryModMath
org.apfloat.internal.FloatModMath
org.apfloat.internal.FloatTableFNTStrategy
org.apfloat.internal.FloatParallelFNTStrategy
- All Implemented Interfaces:
- FloatModConstants, NTTStrategy
- Direct Known Subclasses:
- FloatSixStepFNTStrategy, FloatTwoPassFNTStrategy
- public abstract class FloatParallelFNTStrategy
- extends FloatTableFNTStrategy
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.0.1
- Author:
- Mikko Tommila
Method Summary |
static Object |
getMemoryLock(long length)
Get an object on which to synchronize data storage access.
|
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 .
|
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 java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
FloatParallelFNTStrategy
protected FloatParallelFNTStrategy()
- Default constructor.
getMemoryLock
public static Object getMemoryLock(long length)
- Get an object on which to synchronize data storage access.
If
length
is more than the memory treshold, use shared memory,
otherwise create a dummy lock that will not cause any real synchronization.
The memory threshold is determined using
ApfloatContext.getMemoryTreshold()
.
- Parameters:
length
- The length of data that will be accessed.
- Returns:
- The object on which the memory access should be synchronized.
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