因特尔 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_type
use mkl_vsl
IMPLICIT NONE
integer,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 stream
real ::r_s(nr_s)
real ::a_s, b_s
integer, save :: index_s = 0
contains
SUBROUTINE inita_gene_random_s() !initialize uniform
IMPLICIT NONE
a_s = 0.0
b_s = 1.0
method_s = VSL_RNG_METHOD_UNIFORM_STD !NB - are different alternatives, but I found this worked well
brng_s = VSL_BRNG_SFMT19937
seed_s = 777 ! <== different values may be needed depending on application
r_s = 0.0
status_s = vslnewstream( stream_s, brng_s, seed_s ) !Create new stream (SOBOL in this case
END SUBROUTINE inita_gene_random_s
FUNCTION gene_random_s() result(num_random_s) !generate random number
IMPLICIT NONE
real :: num_random_s
if(index_s == 0) then
call inita_gene_random_s()
index_s = index_s + 1
endif
status_s = vsrnguniform( method_s, stream_s, nr_s, r_s, a_s, b_s )
num_random_s = r_s(1)
END FUNCTION gene_random_s
SUBROUTINE end_gene_random_s() !delete the stream
IMPLICIT NONE
status_s = vsldeletestream( stream_s ) !Delete the stream
END SUBROUTINE end_gene_random_s
END MODULE test_random_s