- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

I am trying to add two sparse crs matrices through mkl_dcsradd,

+ I am first converting my 0 based indices for the CSR matrix to 1-based indices in the routine

+ call the routine with request =1 to compute the nonzeros of the resulting matrix per row, ic array and also to get the nnz of the resulting operation which is returned in the last element of the ic array

+ allocate the jc and c array with the last element of the ic array

+ call the routine with request 2 this time.

however I am not find the last element of my resulting matrix right. As an example here is the simple sparse matrix I tried to add up to itself, basically C = A + beta* A, where beta =1,

1 2 0

2 3 1

0 1 4

then I convert the indices to one based and get(and they are increasing row wise as mentioned in the docs.)

1

2

1

2

3

2

3

--

1

3

6

the first set are the column indices as 1 based and the second set are the row pointer indices again 1-based. Seems correct. Calling the routine with these index arrays, and the allocation

ic = new long long int [m+1]; // as mentioned above with request 1

I find the ic

c = new double[actual_nnz_for_C];

jc = new long long int[actual_nnz_for_C];

and call routine with request 2, runs fine however, the result I get when I try to print the resulting values with

for(int k=0; k

std::cout << jc

}

I get

1 2

2 4

1 4

2 6

3 2

2 2

0 3.16202e-322

where the last entry is not right. Is there a problem with my allocations?

Where am I mistaken?

Any help is appreciated.

Best,

Umut

EDIT:

Just to test my understanding the matrices are different than above..

int main()

{

double a[] = {1,2,2,3,1,1,4};

double b[] = {1,2,2,3,1,1,4};

long long int ja[] = {1,2,1,2,3,2,3};

long long int ia[] = {1,3,6,7};

long long int jb[] = {1,3,1,2,3,2,3};

long long int ib[] = {1,3,6,7};

double* c = NULL;

long long int* jc = NULL;

long long int* ic = NULL;

//

MKL_INT m = 3;

MKL_INT n = 3;

MKL_INT k = 2;

double beta = 1.0;

char trans = 'N';

MKL_INT request = 1;

MKL_INT sort = 0;

MKL_INT nzmax = 0;

MKL_INT info;

//

ic = new long long int[m+1];

mkl_dcsradd(&trans, &request, &sort,

&m, &n,

a, ja, ia, β,

b, jb, ib, c,

jc, ic, &nzmax, &info);

//

c = new double[ic

jc = new long long int[ic

//

request = 2;

mkl_dcsradd(&trans, &request, &sort,

&m, &n,

a, ja, ia, β,

b, jb, ib, c,

jc, ic, &nzmax, &info);

//

for(int z=0;z

std::cout << c

return 0;

}

out

2

2

2

4

6

2

2

0

Link Copied

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Hello,

A few notes on the problem,

For CSR format:

This last element for ia/ib should be 8, not 7:

Also the length for c is ic

I have a bit change, and I got:

2

4

4

6

2

2

8

Thanks,

Chao

int main()

{

double a[] = {1,2,2,3,1,1,4};

double b[] = {1,2,2,3,1,1,4};

int ja[] = {1,2,1,2,3,2,3};

// long long int ia[] = {1,3,6,7};

// long long int jb[] = {1,3,1,2,3,2,3};

// long long int ib[] = {1,3,6,7};

int ia[] = {1,3,6,8};

int jb[] = {1,2,1,2,3,2,3};

int ib[] = {1,3,6,8};

double* c = NULL;

// long long int* jc = NULL;

// long long int* ic = NULL;

int* jc = NULL;

int* ic = NULL;

//

MKL_INT m = 3;

MKL_INT n = 3;

MKL_INT k = 2;

double beta = 1.0;

char trans = 'N';

MKL_INT request = 1;

MKL_INT sort = 0;

MKL_INT nzmax = 0;

MKL_INT info;

//

//ic = new long long int[m+1];

ic = new int[m+1];

mkl_dcsradd(&trans, &request, &sort,

&m, &n,

a, ja, ia, β,

b, jb, ib, c,

jc, ic, &nzmax, &info);

//

c = new double[ic

//jc = new long long int[ic

jc = new int[ic

//

request = 2;

mkl_dcsradd(&trans, &request, &sort,

&m, &n,

a, ja, ia, β,

b, jb, ib, c,

jc, ic, &nzmax, &info);

//

for(int z=0;z

std::cout << c

return 0;

}

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page