How to speed up my sparse matrix solver?

前端 未结 7 1394
梦毁少年i
梦毁少年i 2020-12-14 03:22

I\'m writing a sparse matrix solver using the Gauss-Seidel method. By profiling, I\'ve determined that about half of my program\'s time is spent inside the solver. The perfo

7条回答
  •  情深已故
    2020-12-14 04:00

    I suggest putting in some prefetch statements and also researching "data oriented design":

    void step_original() {
        size_t ic = d_ny + 1, iw = d_ny, ie = d_ny + 2, is = 1, in = 2 * d_ny + 1;
        float dw_ic, dx_ic, db_ic, de_ic, dn_ic, ds_ic;
        float dx_iw, dx_is, dx_ie, dx_in, de_ic, db_ic;
        for (size_t y = 1; y < d_ny - 1; ++y) {
            for (size_t x = 1; x < d_nx - 1; ++x) {
    // Perform the prefetch
    // Sorting these statements by array may increase speed;
    //    although sorting by index name may increase speed too.
                db_ic = d_b[ic];
                dw_ic = d_w[ic];
                dx_iw = d_x[iw];
                de_ic = d_e[ic];
                dx_ie = d_x[ie];
                ds_ic = d_s[ic];
                dx_is = d_x[is];
                dn_ic = d_n[ic];
                dx_in = d_x[in];
    // Calculate
                d_x[ic] = db_ic
                    - dw_ic * dx_iw - de_ic * dx_ie
                    - ds_ic * dx_is - dn_ic * dx_in;
                ++ic; ++iw; ++ie; ++is; ++in;
            }
            ic += 2; iw += 2; ie += 2; is += 2; in += 2;
        }
    }
    

    This differs from your second method since the values are copied to local temporary variables before the calculation is performed.

提交回复
热议问题