用MKL库vRngUniform函数产生uniform随机数的fortran模块

来源:互联网 发布:淘宝无线店铺网址 编辑:程序博客网 时间:2024/05/23 11:11

因特尔 MKL 性能库具有很高的运行效率,而且结合了intel自身处理器的特点进行了优化。MKL 包含了BLUS和LAPACK等。下面我们介绍一下怎样利用它生成uniform随机数

模块代码如下,_s 表示对应单精度 single,函数具体参数请参考intel官方手册https://software.intel.com/fr-fr/node/521872

该模块可以生成固定的随机数序列,并且通过使用变量index_s,生成一次数据流,多次调用。具体使用:

调用随机数时,随机数存储 random = gene_random_s()
在程序结束时释放数据流 end_gene_random_s()

include "mkl_vsl.f90"Module test_random_s use mkl_vsl_typeuse mkl_vslIMPLICIT NONEinteger,parameter :: nr_s = 1  !Number of values required (whatever you want)integer ::  status_s   !Error / status             integer ::  brng_s     !Index of generator to initialize stream            integer ::  method_s   !Method = 0 in case of uniform distribution          integer ::  seed_s    !Initial condition of the stream           TYPE (VSL_STREAM_STATE) ,save:: stream_s   !Random streamreal ::r_s(nr_s)real ::a_s, b_sinteger, save :: index_s = 0    containsSUBROUTINE inita_gene_random_s()               !initialize uniformIMPLICIT NONEa_s = 0.0b_s = 1.0method_s = VSL_RNG_METHOD_UNIFORM_STD    !NB - are different alternatives, but I found this worked wellbrng_s = VSL_BRNG_SFMT19937        seed_s = 777                      ! <== different values may be needed depending on applicationr_s = 0.0status_s = vslnewstream( stream_s, brng_s,  seed_s )  !Create new stream (SOBOL in this caseEND SUBROUTINE inita_gene_random_s   FUNCTION gene_random_s() result(num_random_s)    !generate random numberIMPLICIT NONEreal :: num_random_s if(index_s == 0) then    call inita_gene_random_s()    index_s = index_s + 1endifstatus_s = vsrnguniform( method_s, stream_s, nr_s, r_s, a_s, b_s )   num_random_s = r_s(1)END FUNCTION gene_random_sSUBROUTINE end_gene_random_s()             !delete the streamIMPLICIT NONEstatus_s = vsldeletestream( stream_s )   !Delete the streamEND SUBROUTINE end_gene_random_sEND MODULE test_random_s
0 0