Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并行随机数-为不同数量的任务生成相同的结果_Java_Multithreading_Mpi_Openmp - Fatal编程技术网

Java 并行随机数-为不同数量的任务生成相同的结果

Java 并行随机数-为不同数量的任务生成相同的结果,java,multithreading,mpi,openmp,Java,Multithreading,Mpi,Openmp,我有许多SIMD风格的并行应用程序,它们需要大量的随机数数组。这些阵列是“分布式阵列”,跨多个任务和节点共享,重叠以支持空间操作。我需要的是一个随机数生成器,它将在多个线程上给出与在一个线程上相同的结果。我可以使用一个过于简单的版本,其中所有任务都查询主任务,但我们将失去可伸缩性 总之,我想要一个可伸缩的并行随机数生成器,它提供了与使用主任务提供所有数字等效的结果 提前感谢您的建议 卡盘 这里是一个简单的序列化版本,我想用一个可扩展的实现来替换它: import java.util.Random

我有许多SIMD风格的并行应用程序,它们需要大量的随机数数组。这些阵列是“分布式阵列”,跨多个任务和节点共享,重叠以支持空间操作。我需要的是一个随机数生成器,它将在多个线程上给出与在一个线程上相同的结果。我可以使用一个过于简单的版本,其中所有任务都查询主任务,但我们将失去可伸缩性

总之,我想要一个可伸缩的并行随机数生成器,它提供了与使用主任务提供所有数字等效的结果

提前感谢您的建议

卡盘

这里是一个简单的序列化版本,我想用一个可扩展的实现来替换它:

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
)?请参阅原始帖子中更新的示例代码以获得澄清。我只是好奇,为什么您需要完全相同的伪随机数序列?真正的随机模拟不会像通常情况下平均数或对全局(再次平均)感兴趣那样依赖于实际数数量。技术领域是地质统计学,我们试图用数值模拟地质可变性。我们创建“实现”,然后与它们一起工作一段时间,因此能够重新创建相同的序列是有用的,但没有必要如您所指出的那样。