【发布时间】:2020-04-01 12:42:30
【问题描述】:
当我使用 vdRngUniform() 例程创建随机矩阵时,我可以使用的最大矩阵大小仅为 40000 x 40000。我们是否还有其他 MKL 例程创造更大的尺寸?我可以在 C 上通过正常方式创建,但它会影响性能。所以请指导我使用 MKL 的其他例程。
谢谢。
【问题讨论】:
当我使用 vdRngUniform() 例程创建随机矩阵时,我可以使用的最大矩阵大小仅为 40000 x 40000。我们是否还有其他 MKL 例程创造更大的尺寸?我可以在 C 上通过正常方式创建,但它会影响性能。所以请指导我使用 MKL 的其他例程。
谢谢。
【问题讨论】:
由于英特尔 MKL 论坛上也解决了这个问题,因此我在此处发布回复,以防其他人感兴趣。 链接至英特尔 MKL 论坛:https://software.intel.com/en-us/forums/intel-math-kernel-library/topic/851713
我们建议继续使用 vdRngUniform() 例程并按块生成。 您可以逐块生成所需大小的矩阵,如下所示。
此外,不确定使用 RNGUniform 是否对您的情况很重要,但您可以查看生成 M x N 矩阵的https://software.intel.com/en-us/mkl-developer-reference-c-lagge 例程。您可以链接 ILP64 mkl API 并生成超过 40k 乘 40K 的矩阵
VSLStreamStatePtr stream;
vslNewStream( &stream, BRNG, SEED );
const int64_t size = 40000*40000;
const int64_t block_size = 1000;
double* matrix;
matrix = (double*) malloc (size*sizeof(double));
for(int64_t i = 0; i < size; i+=block_size) {
vdRngUniform( VSL_RNG_METHOD_UNIFORM_STD, stream, block_size, matrix + i, 0.0, 1.0 );
}
free(matrix);
vslDeleteStream( &stream );
【讨论】:
应该添加一个注释 - 处理此类问题大小 (> 40k),用户必须链接到 MKL ILP64 版本的库并相应地使用 -DMKL_ILP64 编译器选项。
【讨论】: