- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
The description of mkl_?omatadd function in the manual is a bit confusing:
- parameter m is described as "The number of matrix rows". Which one ? (A, B or C ?) What if I want to transpose A or B ?
- same question about parameter n.
- Why is ldc an output parameter ??
I wanna do this kind of operation "C = alpha*A + beta*B^t".
Thanks in advance for your help,
Guix
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Guix,
Yes, you are right, omatadd documentation is slightly confusing.
Thank you for the question. Let me try to clarify.
Parameters m and n stand for rows and columns of matrix C (the only matrix to which op() is not applied). Since you specify the m and n, the matrices op(A) and op(B) should have the same sizes.
lda, ldb and ldc are leading dimensions for original matrices (i.e. with-out any op operations). Of course ldc is not 'out' parameter, but 'in'. This is a typo.
A small examples that performs
C <-- alpha*A + beta*B^T
#include <stdio.h>
#include "mkl.h"
static inline printA(double *x, int rows, int cols, int lda) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf("%8.0f", x[i*lda + j]);
}
printf("\n");
}
printf("\n");
}
int main() {
double a[] = {
100, 200, 300,
400, 500, 600,
700, 800, 900,
0, 0, 0 };
double b[] = {
1, 2, 3, 0, 0,
4, 5, 6, 0, 0,
7, 8, 9, 0, 0,
0, 0, 0, 0, 0 };
double c[12] = {
0, 0, 0,
0, 0, 0,
0, 0, 0 };
char transa, transb;
double alpha = 1., beta = 1.;
size_t m, n;
size_t lda = 3, ldb = 5, ldc = 3;
transa = 'N'; transb = 'T';
m = 2; n = 3;
mkl_domatadd('R', transa, transb, m, n, alpha, a, lda, beta, b, ldb, c, ldc);
printA(c, 2, 3, ldc);
return 0;
}
Here we get matrix C of form 2x3 with ldc = 3 using block 2x3 from matrix A and 3x2 from matrix B.
The result is:
101 204 307 402 505 608
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Guix,
Yes, you are right, omatadd documentation is slightly confusing.
Thank you for the question. Let me try to clarify.
Parameters m and n stand for rows and columns of matrix C (the only matrix to which op() is not applied). Since you specify the m and n, the matrices op(A) and op(B) should have the same sizes.
lda, ldb and ldc are leading dimensions for original matrices (i.e. with-out any op operations). Of course ldc is not 'out' parameter, but 'in'. This is a typo.
A small examples that performs
C <-- alpha*A + beta*B^T
#include <stdio.h>
#include "mkl.h"
static inline printA(double *x, int rows, int cols, int lda) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf("%8.0f", x[i*lda + j]);
}
printf("\n");
}
printf("\n");
}
int main() {
double a[] = {
100, 200, 300,
400, 500, 600,
700, 800, 900,
0, 0, 0 };
double b[] = {
1, 2, 3, 0, 0,
4, 5, 6, 0, 0,
7, 8, 9, 0, 0,
0, 0, 0, 0, 0 };
double c[12] = {
0, 0, 0,
0, 0, 0,
0, 0, 0 };
char transa, transb;
double alpha = 1., beta = 1.;
size_t m, n;
size_t lda = 3, ldb = 5, ldc = 3;
transa = 'N'; transb = 'T';
m = 2; n = 3;
mkl_domatadd('R', transa, transb, m, n, alpha, a, lda, beta, b, ldb, c, ldc);
printA(c, 2, 3, ldc);
return 0;
}
Here we get matrix C of form 2x3 with ldc = 3 using block 2x3 from matrix A and 3x2 from matrix B.
The result is:
101 204 307 402 505 608
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you for your explanation Evarist, it makes sense now !
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page