【问题标题】:Using MKL library create random matrix使用 MKL 库创建随机矩阵
【发布时间】:2020-04-01 12:42:30
【问题描述】:

当我使用 vdRngUniform() 例程创建随机矩阵时,我可以使用的最大矩阵大小仅为 40000 x 40000。我们是否还有其他 MKL 例程创造更大的尺寸?我可以在 C 上通过正常方式创建,但它会影响性能。所以请指导我使用 MKL 的其他例程。

谢谢。

【问题讨论】:

    标签: c matrix random intel-mkl


    【解决方案1】:

    由于英特尔 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 );
    

    【讨论】:

      【解决方案2】:

      应该添加一个注释 - 处理此类问题大小 (> 40k),用户必须链接到 MKL ILP64 版本的库并相应地使用 -DMKL_ILP64 编译器选项。

      【讨论】: