Java 并行随机数-为不同数量的任务生成相同的结果
我有许多SIMD风格的并行应用程序,它们需要大量的随机数数组。这些阵列是“分布式阵列”,跨多个任务和节点共享,重叠以支持空间操作。我需要的是一个随机数生成器,它将在多个线程上给出与在一个线程上相同的结果。我可以使用一个过于简单的版本,其中所有任务都查询主任务,但我们将失去可伸缩性 总之,我想要一个可伸缩的并行随机数生成器,它提供了与使用主任务提供所有数字等效的结果 提前感谢您的建议 卡盘 这里是一个简单的序列化版本,我想用一个可扩展的实现来替换它:Java 并行随机数-为不同数量的任务生成相同的结果,java,multithreading,mpi,openmp,Java,Multithreading,Mpi,Openmp,我有许多SIMD风格的并行应用程序,它们需要大量的随机数数组。这些阵列是“分布式阵列”,跨多个任务和节点共享,重叠以支持空间操作。我需要的是一个随机数生成器,它将在多个线程上给出与在一个线程上相同的结果。我可以使用一个过于简单的版本,其中所有任务都查询主任务,但我们将失去可伸缩性 总之,我想要一个可伸缩的并行随机数生成器,它提供了与使用主任务提供所有数字等效的结果 提前感谢您的建议 卡盘 这里是一个简单的序列化版本,我想用一个可扩展的实现来替换它: import java.util.Random
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();
}
}
}
import java.util.Random;
公共类并行随机{
int size;//并行上下文中的任务数
int rank;//此任务在并行上下文中的排名
Random r;//主任务使用的随机数生成器
公共并行随机(int numTasks、int taskRank、长种子){
//商店规模和等级
大小=numtask;
等级=任务等级;
//随机初始化
r=新随机(种子);
}
//必须由所有任务同步调用的公共方法
public void nextRandomVector(双[]向量){
int len=向量长度;
//循环上下文中的所有任务
对于(int-itask=0;itaskSeed必须对所有对象都相同,并且您可以使用从模运算符派生的自定义生成器,它是伪随机的。类似于Lehmer生成器,具有一些已知的互质参数。假设随机数生成器返回的前两个数是N1
,然后是N2
,并且P1
然后,P2
请求一个随机数,以便P1
接收N1
,您希望P2
接收N1
,还是希望它接收N2
?换句话说,您希望RNG的行为就像每个处理器查询一个RNG一样(意味着P2
获取N2
),或者您希望它们的行为就像每个处理器都有自己的RNG一样(这意味着P2
得到N1
)?请参阅原始帖子中更新的示例代码以获得澄清。我只是好奇,为什么您需要完全相同的伪随机数序列?真正的随机模拟不会像通常情况下平均数或对全局(再次平均)感兴趣那样依赖于实际数数量。技术领域是地质统计学,我们试图用数值模拟地质可变性。我们创建“实现”,然后与它们一起工作一段时间,因此能够重新创建相同的序列是有用的,但没有必要如您所指出的那样。