【问题标题】:Speed up random number generation in MATLAB加快 MATLAB 中的随机数生成
【发布时间】:2017-01-08 03:19:18
【问题描述】:

有什么方法可以生成精度较低的伪随机数,从而加快处理速度?

另一件事是,我知道如果一次生成所有随机数(例如rand(100,1000))而不是一个一个生成,它可以节省时间。有人可以解释为什么这是真的吗?

【问题讨论】:

  • 根据the documentation,您可以将输出指定为'single' 精度。如果没有更多关于你到底在做什么的背景,很难回答“为什么这么慢”的问题
  • 我认为将输出指定为“单个”只会改变输出本身。因此,这些数字的计算精度与以前相同,并且在之后四舍五入,这对速度没有帮助。没有与此相关的特定程序,如果可能的话,我只是感兴趣。
  • 必须有 some 程序会产生这个问题。在我的机器上生成 900 万个随机数需要 0.047 秒。这并不慢。
  • 为什么几乎可以肯定是因为Matlab是一个解释器,它在解释器阶段解析语句之后调用编译的库模块。对带有 args 的已编译库模块的一次调用以在内部进行 1000 次计算将比 1000 次解释器解析/调用以每次调用执行一项操作要快。
  • @excaza 是的,我同意它并不慢,但我感兴趣的是,理论上,是否有可能以较低的精度生成它们,或者它是否由生成算法,它们被计算到一定的精度。

标签: performance matlab random vectorization precision


【解决方案1】:

自 R2015a 起,用于配置和播种全局生成器的 rng 函数有一个 'simdTwister' 选项,该选项使用更快的“SIMD-oriented Fast Mersenne Twister”算法:

rng(1,'twister');
R = rand(1e4); % Warmup for timing
tic
R = rand(1e4);
toc

rng(1,'simdTwister');
R = rand(1e4); % Warmup for timing
tic
R = rand(1e4);
toc

这可能是您系统中最快的内置生成器(基于 GPU 的生成器除外)。在我的计算机上,它比大型数组的默认 Mersenne Twister algorithm 快两倍多一点。

【讨论】:

    【解决方案2】:

    如果你有一个支持 CUDA 的 GPU,你可以使用random number generation on it,因为它应该会更快...特别是Philox4x32-10

    parallel.gpu.rng(0, 'Philox4x32-10');
    R = gpuArray.rand(sZ,'single'); % run this for more info: doc('gpuArray/rand')
    

    【讨论】:

      【解决方案3】:

      MATLAB 实际上实现了多个随机数生成器。它们在执行时间和“随机性”方面存在显着差异(我认为,但我没有验证)。但是,我从您的问题中了解到,速度对您来说更重要。

      % 'twister' is the default in MATLAB Versions 7.4 and later
      tic();
      for i=1:1000000
          rand('twister'); 
      end
      toc();
      %Elapsed time is 2.912960 seconds.
      
      % 'state' is the default in MATLAB versions 5 through 7.3
      tic();
      for i=1:1000000
          rand('state'); 
      end
      toc(); 
      % Elapsed time is 2.162040 seconds.
      
      % 'seed' is the default in MATLAB version 4
      tic();
      for i=1:1000000
          rand('seed'); 
      end
      toc();
      % Elapsed time is 0.758830 seconds.
      

      重要提示:我使用相当旧版本的 MATLAB(v.7.6,又名 R2008a)运行上面的脚本。在较新的版本中,语法为 rand(generator) is discouraged 。相反,您应该使用函数rng(seed, generator) (online documentation)。作为副作用,rng(seed, generator) 为您提供了更多随机数生成器可供选择。详情请查看文档。

      关于第二个问题:无论您选择哪种生成器,一次生成多个随机数总是比生成多个单个随机数要快。这是因为 MATLAB 的内部针对并行处理进行了大量优化。

      tic();
      for i=1:100000
          rand(); 
      end
      toc();
      % Elapsed time is 0.024388 seconds.
      
      tic();
      rand(100, 1000);
      toc();
      % Elapsed time is 0.000680 seconds.
      

      【讨论】:

        猜你喜欢
        • 2010-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        相关资源
        最近更新 更多