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

With the help of this great forum and old post, I was able to finally execute my first example on Cholesky factorization. However, I have a question. I call the function like this:

dpotrf( &'L', &N, // A is NxN matrix A, &N, &nInfo );

Since I am planning to do a * distributed factorization*, I have to be sure about the arguments. What is the latter 'N' used for? My first thought was about the dimension of the output, but that's the same array, so I am confused.

Moreover, the documentation gives this prototype

void pdpotrf (char *uplo , MKL_INT *n , double *a , MKL_INT *ia , MKL_INT *ja , MKL_INT *desca , MKL_INT *info );

In my example, the arguments are less than what the prototype has. Why there are more arguments there?

Finally, I do not understand ia, ja and desca arguments. Come someone explain to a student like me their use?

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

Think about how one maps the two subscripts of a matrix element to a single offset into memory, and note that often (especially in F77 and earlier, which did not have ALLOCATE) the declared size of an array can be larger than the actual size used in a specific part of the program. To do the mapping, the leading dimension (i.e., the declared column size in Fortran) needs to be known, because most array arguments are passed in F77 and earlier as just the base address of the array, with no additional information regarding the extents of each subscript.

The argument list that you show is for the special case where the declared array size (the "maximum" size) is the same as the effective size (the size being used in the calculation at the moment), so you see N twice and may find it quixotic. Ask yourself, "how would things be if A was declared larger than N X N?".

The routine DPOTRF is in Lapack; PDPOTRF is in Scalapack. They are different routines in different libraries, with similar (but not identical) argument lists and objectives.

DPOTRF (and most Lapack subroutines) work with dense matrices. The routine PDPOTRF is for use with distributed matrices, and the arrays IA, JA, etc. contain details of how the distributed matrix is stored. See, for example, the comments in http://www.netlib.org/scalapack/explore-html/d5/d9e/pdpotrf_8f_source.html .

Link Copied

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

Think about how one maps the two subscripts of a matrix element to a single offset into memory, and note that often (especially in F77 and earlier, which did not have ALLOCATE) the declared size of an array can be larger than the actual size used in a specific part of the program. To do the mapping, the leading dimension (i.e., the declared column size in Fortran) needs to be known, because most array arguments are passed in F77 and earlier as just the base address of the array, with no additional information regarding the extents of each subscript.

The argument list that you show is for the special case where the declared array size (the "maximum" size) is the same as the effective size (the size being used in the calculation at the moment), so you see N twice and may find it quixotic. Ask yourself, "how would things be if A was declared larger than N X N?".

The routine DPOTRF is in Lapack; PDPOTRF is in Scalapack. They are different routines in different libraries, with similar (but not identical) argument lists and objectives.

DPOTRF (and most Lapack subroutines) work with dense matrices. The routine PDPOTRF is for use with distributed matrices, and the arrays IA, JA, etc. contain details of how the distributed matrix is stored. See, for example, the comments in http://www.netlib.org/scalapack/explore-html/d5/d9e/pdpotrf_8f_source.html .

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

Damn it, I understood that I had made a mistake in the function I used, just after a while I did the post, however, I wasn't able to update. Sorry about that.

About DPOTRF, I found this ref, which states that N is "The order of the matrix A" and LDA is "The leading dimension of the array A". I do not know any Fortran, I have a strong C/C++ background though I still do not understand the difference between this two parameters, maybe because I approach the problem from a C perspective.

About * PDPOTRF*, which is the one that I want to use, the Fortran documentation seems a bit bizarre for me. Do you have any C example on this?

I only found this SO question, which contains some code, but it does not have any MKL in it!

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

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

I can't understand that " it's not a textbook c construct", sorry.

EDIT:

I found this link, which explains the LDA. So, now, I can assume that by order of Matrix, it needs the number of rows.

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