Quantcast
Channel: Intel® oneAPI Math Kernel Library & Intel® Math Kernel Library
Viewing all articles
Browse latest Browse all 2652

intel MKL library working fine in windows but cause "segmentation fault" in unix after the method "mkl_dcsrcoo"

$
0
0

I have attached a sample code below:

main:

=====
int main(int argc, char **argv)
{
    
    Mat test = makeTestMat(3, 3);
wlsFilter(test, test);
return 0;
}

wlsFilter:
=======
void wlsFilter(Mat& src, Mat& dst, float lambda, float alpha)
{

    float eps = 2.2204e-11; 
    float smallNum = 0.0001;

    Mat L;
    cv::log(src + eps, L);

    int r = src.rows;
    int c = src.cols;
    int k = r*c;

    Mat dy;
    diffy(L, dy);
    dy = F(dy, lambda, alpha, smallNum);
    copyMakeBorder(dy, dy, 0, 1, 0, 0, BORDER_CONSTANT, Scalar::all(0));
    dy = dy.t();
    dy = dy.reshape(1, k);

    Mat dx;
    diffx(L, dx);
    dx = F(dx, lambda, alpha, smallNum);
    copyMakeBorder(dx, dx, 0, 0, 0, 1, BORDER_CONSTANT, Scalar::all(0));
    dx = dx.t();
    dx = dx.reshape(1, k);

    Mat B = Mat(k, 2, CV_32FC1);
    dx.copyTo(B.col(0));
    dy.copyTo(B.col(1));

    Mat e = dx.clone();
    Mat w;
    copyMakeBorder(dx, w, r, 0, 0, 0, BORDER_CONSTANT, Scalar::all(0));
    w = w.rowRange(0, w.rows - r);

    Mat s = dy.clone();
    Mat n;
    copyMakeBorder(dy, n, 1, 0, 0, 0, BORDER_CONSTANT, Scalar::all(0));
    n = n.rowRange(0, n.rows - 1);

    Mat D = 1 - (e + w + s + n);

    solveSparse_MKL(src, B, D, r, dst);

}

solveSparse_MKL:
================
void solveSparse_MKL(Mat& img, Mat& B, Mat& D, int r, Mat &dst)
{
    MKL_INT* i_csr = 0;
    MKL_INT* j_csr = 0;
    double* a_csr = 0;

    _DOUBLE_PRECISION_t* rhs = 0;

    MKL_INT nNonZeros = spDiag2_MKL(B, -r, -1, D, i_csr, j_csr, a_csr);
.
.
.
.
}

spDiag2_MKL:
============
int spDiag2_MKL(Mat& B, int d1, int d2, Mat& D, MKL_INT*& i_csr, MKL_INT*& j_csr, double*& a_csr)
{
    MKL_INT* rowind = 0;
    MKL_INT* colind = 0;
    double* acoo = 0;

    MKL_INT nnz = 0;

    Vec2i off1, off2;
    if (d1 > 0) { off1 = Vec2i(0, d1); }
    else { off1 = Vec2i(-d1, 0); }

    if (d2 > 0) { off2 = Vec2i(0, d2); }
    else { off2 = Vec2i(-d2, 0); }

    for (int i = 0; i < B.rows; ++i)
    {
        int i1 = i + off1[0];
        int j1 = i + off1[1];

        int i2 = i + off2[0];
        int j2 = i + off2[1];

        if (i1 < B.rows && j1 < B.rows)
        {
            nnz++;
        }
        if (i2 < B.rows && j2 < B.rows)
        {
            nnz++;
        }
        ++nnz;
    }
    rowind = new MKL_INT[nnz];
    colind = new MKL_INT[nnz];
    acoo = new double[nnz];
    MKL_INT ind = 0;
    for (int i = 0; i < B.rows; ++i)
    {
        int i1 = i + off1[0];
        int j1 = i + off1[1];

        int i2 = i + off2[0];
        int j2 = i + off2[1];

        if (i1 < B.rows && j1 < B.rows)
        {
            if (j1 > i1)
            {
                rowind[ind] = i1 + 1;
                colind[ind] = j1 + 1;
                acoo[ind] = B.at<float>(i, 0);
                ++ind;
            }
            else
            {
                rowind[ind] = j1 + 1;
                colind[ind] = i1 + 1;
                acoo[ind] = B.at<float>(i, 0);
                ++ind;
            }
        }
        if (i2 < B.rows && j2 < B.rows)
        {
            if (j2 > i2)
            {
                rowind[ind] = i2 + 1;
                colind[ind] = j2 + 1;
                acoo[ind] = B.at<float>(i, 1);
                ++ind;
            }
            else
            {
                rowind[ind] = j2 + 1;
                colind[ind] = i2 + 1;
                acoo[ind] = B.at<float>(i, 1);
                ++ind;
            }
        }
        rowind[ind] = i + 1;
        colind[ind] = i + 1;
        acoo[ind] = D.at<float>(i);
        ++ind;
    }
    MKL_INT m = B.rows;
    MKL_INT n = B.rows;

    a_csr = new double[nnz];
    i_csr = new MKL_INT[m + 1]; // m+1
    j_csr = new MKL_INT[nnz];

    MKL_INT info;
    MKL_INT job[8] = { 2, // COO to CSR
        1, // 1 based indexing in CSR rows
        1, // 1 based indexing in CSR cols
        0, //
        nnz, // number of the non-zero elements
        0, // job indicator
        0,
        0
    };

    
    mkl_dcsrcoo(job, &m, a_csr, j_csr, i_csr, &nnz, acoo, rowind, colind, &info);
.
.
.
.
}

 

 

Description:

I the above code "mkl_dcsrcoo(job, &m, a_csr, j_csr, i_csr, &nnz, acoo, rowind, colind, &info);"

The values of m,nnz,acoo,rowind,colind are same in both windows and unix 
But the a_csr,j_csr,i_csr values differs.

Can you pls tell why its differs?

Before calling the mkl_dcsrcoo the values are same,but after calling the method the values differs,so i hope the issue occurs in the "mkl_dcsrcoo" method.
Pls suggest any solutions?

Thanks in advance.

 

Regards,

CIBIN

 

Thread Topic: 

Question

Viewing all articles
Browse latest Browse all 2652

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>