【问题标题】:Why random number generation using parallel processing makes different results even though they have same seed? [duplicate]为什么使用并行处理生成随机数会产生不同的结果,即使它们具有相同的种子? [复制]
【发布时间】:2020-05-13 17:56:56
【问题描述】:

我正在研究 C 上的 openMP 并行处理。

我做了一个简单的随机数测试器,种子值固定,用几种不同的方法测试同一个随机数序列。

这是 rng 测试器的一部分,没有使用并行处理

  //1. Single thread
  //set seed value
  init_genrand(2020);

  int fk[33] = {0};

  for(int i=0;i<31250;i++){
    int x = genrand_int32();
    int count = 0;

    for(int j=0;j<33;j++){
      if(x & 1) count ++;
      x = x >> 1;
    }

    fk[count]++;
  }

  int sum = 0;
  for(int i=0;i<33;i++){
    printf("fk[%d] = %d\n",i,fk[i]);
    sum += fk[i];
  }
  printf("sum = %d\n",sum);

由于 rng 函数的种子值固定,此代码始终输出相同的结果。

但是,这个使用并行处理的代码没有。

  //2. Multi Threads
  //set seed
  init_genrand(2020);

  int fkMulti[33] = {0};

  int count = 0;
  int x = 0;

  #pragma omp parallel
  {
    #pragma omp for private(count, x) reduction(+:fkMulti[:33])
    for(int i=0;i<31250;i++)
    {
      count = 0;
      x = genrand_int32();

      for(int j=0;j<33;j++){
        if(x & 1) count ++;
        x = x >> 1;
      }
      fkMulti[count]++;
    }
  }

  int sumMulti = 0;
  for(int i=0;i<33;i++){
    printf("fkMulti[%d] = %d\n",i,fkMulti[i]);
    sumMulti += fkMulti[i];
  }
  printf("sum = %d\n",sumMulti);

它们都生成32bit随机数31250次,并通过移位运算符计算每个随机数有多少个1位。 但第二个的工作方式与第一个不同。

每次运行编译文件时结果都会发生变化。

我还检查了 Rng 函数 ( genrand_int32() ) 在这两个代码中被执行了 31250 次。

为什么即使相同的种子总是产生相同的结果,也会发生这种情况?

感谢您阅读我的问题。

【问题讨论】:

  • 不得重入。
  • 只是一个 WAG,但你确定种子在所有线程中都保持不变吗?尝试将调用init_genrand 移到#pragma omps 之后
  • 您需要阅读并行随机数生成;您可以合理地从“并行随机数,像 1,2,3 一样简单”thesalmons.org/john/random123/papers/random123sc11.pdf 开始(然后请注意,各种数学库都实现了它们的算法......)

标签: c openmp


【解决方案1】:

问题是多线程时,每个线程都在修改内部的“随机”数字。 rand 函数的工作方式是它获取生成的随机数的输出并将其用作下一个要生成的随机数的种子。正因为如此,如果您有两个线程并行运行,一个线程可能会在不一致的时间修改随机数,而生成的随机数将用作另一个线程的种子,从而产生不可预测的结果(竞争条件)。您可以通过仅在程序开始时调用一次 srand() 来解决此问题。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多