我有许多需要大量随机数的SIMD样式并行应用程序。这些数组是“分布式数组”,在多个任务和节点之间共享,具有重叠以支持空间运算符。我需要的是一个随机数生成器,它将在多个线程上提供与在一个线程上相同的结果。我可以使用一个简单的版本,其中所有任务都查询主任务,但我们会失去可伸缩性。
总而言之,我想要一个可扩展的并行随机数生成器,它可以使用主任务提供相同的结果来提供所有数字。
提前感谢任何建议!
查
P.S。这是一个简单的序列化版本,我想用可扩展的实现替换它:
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();
}
}
}