代码之家  ›  专栏  ›  技术社区  ›  avgn

为什么我的特征代码不能扩展到更多线程

  •  1
  • avgn  · 技术社区  · 6 年前

    我有一个Eigen/C++代码,其目的是执行行主稀疏密集和列主密集稀疏矩阵乘法, both of which are multithreaded in Eigen

    然而,我发现只有行主要稀疏-密集乘法是缩放的,而不是密集列主要稀疏乘法。为什么会这样?下面是代码和计时。

    /*timer function*/
    double getHighResolutionTime(void) {
    struct timeval tod;
    gettimeofday(&tod, NULL);
    double time_seconds = (double) tod.tv_sec + ((double) tod.tv_usec / 1000000.0);
    return time_seconds;
    }
    

    。。。

    //define Col Major Sparse
    Map<SparseMatrix<double,ColMajor> > gcol (m, n, nz, jc_int, ir_int, pr);
    
    //define the same matrix but Row Major
    Map<SparseMatrix<double,RowMajor> > grow (m, n, nz, jc_int, ir_int, pr);
    
    //define dense matrix
    Map<MatrixXd> G (PR1, M, N );
    
    //define result
    Map<MatrixXd> result (PR2, M, N);
    
    //row major sparse - dense product
    double tic=getHighResolutionTime();
    result=grow*G;
    double toc=getHighResolutionTime();
    printf("\nsparse-dense time: %f seconds", (toc - tic));
    
    //dense - col major sparse product
    tic=getHighResolutionTime();
    result=G*gcol;
    toc=getHighResolutionTime();
    printf("\ndense-sparse time: %f seconds\n", (toc - tic));
    

    使用1、2、4、8和16个线程的输出和计时(在16核机器上)。只有稀疏密集的鳞片,而不是密集稀疏的鳞片。

    Using 1 threads...
    sparse-dense time: 5.184886 seconds
    dense-sparse time: 3.278560 seconds
    
    Using 2 threads...
    sparse-dense time: 2.808550 seconds
    dense-sparse time: 3.275191 seconds
    
    Using 4 threads...
    sparse-dense time: 1.589596 seconds
    dense-sparse time: 3.278983 seconds
    
    Using 8 threads...
    sparse-dense time: 1.005600 seconds
    dense-sparse time: 3.279466 seconds
    
    Using 16 threads...
    sparse-dense time: 0.736803 seconds
    dense-sparse time: 3.278893 seconds
    

    其他信息:矩阵为7000x7000随机、实数和双精度。稀疏矩阵是密度为1%的随机矩阵。两次乘法的数值结果都是正确的。我正在使用以下标志进行编译:

    -fomit-frame-pointer -O3 -DNDEBUG -fopenmp -march=native -fPIC
    

    编辑:

    ggael的答案非常有效。以下是新的缩放比例:

    Using 1 threads...
    sparse-dense time: 5.070809 seconds
    dense-sparse time: 3.270347 seconds
    
    Using 2 threads...
    sparse-dense time: 2.786790 seconds
    dense-sparse time: 2.070378 seconds
    
    Using 4 threads...
    sparse-dense time: 1.580925 seconds
    dense-sparse time: 1.243466 seconds
    
    Using 8 threads...
    sparse-dense time: 1.000152 seconds
    dense-sparse time: 0.887953 seconds
    
    Using 16 threads...
    sparse-dense time: 0.898228 seconds
    dense-sparse time: 0.909603 seconds
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   ggael    6 年前

    您需要Eigen的头部(参见相应的 commit )。