以下c ++代码与英特尔数学核心库(MKL)中的矢量统计库(VSL)提供的示例几乎相同。但是,一旦变量'总计'比例大于3 * 10 ^ 9,它会输出
MKL错误:输入vdRngUniform时参数3不正确。
所以我猜这意味着'总计'可能太大了。但是在手册中写道,SFMT19937方法的周期长度等于生成序列的2 ^ 19937-1,远远大于10 ^ 9。
我想知道上限是多少,例如双倍(我无法在手册中找到任何相关信息)。当然,任何克服这个问题的方法都将受到赞赏。提前谢谢!
......
MKL_LONG status;
VSLStreamStatePtr stream;
......
int main(){
vslNewStream(&stream, VSL_BRNG_SFMT19937, 777);
rnd_data = (double*)malloc(total * sizeof(double));
status = vdRngUniform(VSL_RNG_METHOD_UNIFORM_STD, stream, total, rnd_data, 0.0, 1.0);
vslDeleteStream(&stream);
......
}
答案 0 :(得分:2)
查看https://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-D7AD317E-34EC-4789-8027-01D0E194FAC1.htm vdRngUniform
需要一个const int
,它有能力代表2 ^ 31个非负值(在大多数现代平台上)。 3 * 10 ^ 9比那个大,所以你可能会将一些负值传递给函数(即有符号整数溢出)。