下面的c++代码与Intel的Math Kernel Library (MKL)中的Vector Statistical Library (VSL)提供的示例几乎相同。然而,一旦变量'total'大于,比如说3*10^9,它将输出
MKL ERROR: Parameter 3 was incorrect on entry to vdRngUniform.
所以我猜这意味着"total"可能太大了。但手册中写着"SFMT19937方法的周期长度等于生成序列的2^19937-1",远远大于10^9。
我想知道上限到底是多少,例如,对于double(我在手册中找不到任何相关信息)。当然,任何能解决这个问题的方法都会受到赞赏。提前感谢!
......
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);
......
}
查看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比这个大,所以你很可能传递了一些负值给函数(即有符号整数溢出)。