Showing results for

- Intel Community
- Software
- Software Development SDKs and Libraries
- Intel® oneAPI Math Kernel Library
- cblas usage question

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

utab

Beginner

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

12-08-2011
09:26 AM

52 Views

cblas usage question

I would like to multiply

A = [ 1 2 6

2 3 1

6 1 4 ]

a symmetrix matrix with a dense matrix

B =[ 2 3

4 5

6 7 ];

and here is the code, but the results are wrong, what could be the problem?

int main()

{

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

double b[] = {2,3,4,5,6,7};

double c[] = {0,0,0,0,0,0};

MKL_INT r = 3;

MKL_INT cc= 3;

MKL_INT k = 2;

double alpha = 1.0;

double beta = 0.0;

//

CBLAS_ORDER ord = CblasRowMajor;

CBLAS_SIDE side = CblasLeft;

CBLAS_UPLO uplo = CblasUpper;

cblas_dsymm( ord, side, uplo,

r, cc, alpha,

a, r, b, r,

beta, c, cc );

//

for(int z=0;z<6;z++)

std::cout << c

return 0;

}

Best regards,

Umut

Link Copied

5 Replies

Chao_Y_Intel

Employee

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

12-09-2011
01:15 AM

52 Views

Umut,

could you have a check on the code bellow? The parameters do not look correct. The output for the following code is: 46 55 22 28 40 51

Thanks,

Chao

int main()

{

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

double a[] = {1,2,6,

2,3,1,

6,1,4};

double b[] = {2,3,4,5,6,7};

double c[] = {0,0,0,0,0,0};

MKL_INT r = 3;

//MKL_INT cc= 3;

MKL_INT cc= 2;

//MKL_INT k = 2;

double alpha = 1.0;

double beta = 0.0;

//

CBLAS_ORDER ord = CblasRowMajor;

CBLAS_SIDE side = CblasLeft;

CBLAS_UPLO uplo = CblasUpper;

/*cblas_dsymm( ord, side, uplo,

r, cc, alpha,

a, r, b, r,beta, c, cc );*/

cblas_dsymm( ord, side, uplo,

r, cc, alpha,

a, r, b, cc,beta, c, cc );

//

for(int z=0;z<6;z++)

std::cout << c

return 0;

}

utab

Beginner

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

12-09-2011
01:50 AM

52 Views

Thanks for the reply. The documentation is a bit confusing how the matrix is input was not clear to me. I mean understood to only input the upper triangular part of the A and then I was thinking it is ok, however it gets the whole matrix and internally does the operations I guess,

Thanks.

Umut

mecej4

Black Belt

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

12-09-2011
03:58 AM

52 Views

However, it is sufficient to fill in, i.e., define, only the upper triangle(s) of the input matrix(matrices) when you specify 'U' for

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

by

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

and you should see no change in the output. In fact, replacing the '0' values in this line by any other values should not affect the output, either.

Chao_Y_Intel

Employee

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

12-13-2011
06:41 PM

52 Views

Hello,

yes, it is right that the input A needs to rectangular arrays. but the low triangle in the matrix does not impact the computation.

thanks,

Chao

Murat_G_Intel

Employee

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

12-13-2011
07:25 PM

52 Views

As meje and Chao mentioned, we need to allocate memory large enough to store a 3x3 matrix for symmetric A matrix. However, you only need to set lower or upper triangular elements of Adepending on the uplo symm parameter.

In your example code the input paramaters to cblas_dsymm are in error. For symm, m and n are number of rows and number of columns for C matrix respectively. Also, the leading dimensions for A and B matrices should be set considering that we are using the row-major ordering. Please find the code with the required modifications below. Comments describe the paramaters.

[cpp]#include#include using namespace std; int main() { /* 3x3 A matrix (symmetric) */ double a[] = {1,2,6,2,3,1,6,1,4}; /* 3x2 B Matrix */ double b[] = {2,3,4,5,6,7}; /* 3x2 C Matrix */ double c[] = {0,0,0,0,0,0}; /* Let's define the SYMM paramaters in terms * of row count and coloumn count of C */ MKL_INT rows_c = 3; MKL_INT cols_c= 2; double alpha = 1.0; double beta = 0.0; CBLAS_ORDER ord = CblasRowMajor; CBLAS_SIDE side = CblasLeft; CBLAS_UPLO uplo = CblasUpper; /* The leading dimension for A, B and C are set considering * row-major format. * * For this particular example: * lda = # of columns A (or rows since A is symmetric) * ldb = # of columns B * ldc = # of columns C */ cblas_dsymm( ord, side, uplo, rows_c, cols_c, alpha, a, rows_c, b, cols_c, beta, c, cols_c ); /* This should print 46 55 22 28 40 51 */ for(int z=0;z<6;z++) std::cout << c << std::endl; return 0; } [/cpp]

The output is:

46 55 22 28 40 51

Best wishes,

Efe

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

For more complete information about compiler optimizations, see our Optimization Notice.