大量の乱数配列を必要とする SIMD スタイルの並列アプリケーションが多数あります。配列は「分散配列」であり、空間演算子をサポートするために重複する複数のタスクとノードで共有されます。私が必要としているのは、複数のスレッドで 1 つのスレッドと同じ結果が得られる乱数ジェネレーターです。すべてのタスクがマスター タスクを照会する単純なバージョンを使用することもできますが、スケーラビリティが失われます。
要約すると、マスター タスクを使用してすべての数値を提供するのと同等の結果が得られるスケーラブルな並列乱数ジェネレーターが必要です。
アドバイスをよろしくお願いします!
チャック
PSこれは、スケーラブルな実装に置き換えたい単純なシリアル化されたバージョンです。
import java.util.Random;
public class ParallelRandom {
int size; // Number of tasks in the parallel context
int rank; // Rank of this task in the parallel context
Random r; // Random number generator used by master task
public ParallelRandom( int numTasks, int taskRank, long seed ) {
// Store size and rank
size = numTasks;
rank = taskRank;
// initialize Random
r = new Random(seed);
}
// Public method that must be called synchronously by all tasks
public void nextRandomVector( double[] vector ) {
int len = vector.length;
// Loop over all tasks in the context
for (int itask=0; itask<size; itask++) {
// Set the return values for this task, otherwise just advance the random number
if (rank == itask)
for (int i=0; i<len; i++)
vector[i] = r.nextGaussian();
else
for (int i=0; i<len; i++)
r.nextGaussian();
}
}
}