MAGMA  1.2.0
MatrixAlgebraonGPUandMulticoreArchitectures
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
descriptor.h
Go to the documentation of this file.
1 
15 #ifndef _MAGMA_DESCRIPTOR_H_
16 #define _MAGMA_DESCRIPTOR_H_
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 /***************************************************************************/
25 inline static void *magma_geteltaddr( const magma_desc_t *A, int m, int n, int eltsize);
26 inline static void *magma_getaddr(magma_desc_t *A, int m, int n);
27 magma_desc_t magma_desc_init(MAGMA_enum dtyp, int mb, int nb, int bsiz, int lm, int ln, int i, int j, int m, int n);
28 magma_desc_t magma_desc_submatrix(magma_desc_t descA, int i, int j, int m, int n);
32 
33 extern int plasma_element_size(int type);
34 
35 #define BLKLDD(A, k) ( ( (k) + (A)->desc.i/(A)->desc.mb) < (A)->desc.lm1 ? (A)->desc.mb : (A)->desc.lm%(A)->desc.mb )
36 
37 /***************************************************************************/
40 inline static void *magma_getaddr(magma_desc_t *descA, int m, int n)
41 {
42  PLASMA_desc *A = &(descA->desc);
43  size_t mm = m+A->i/A->mb;
44  size_t nn = n+A->j/A->nb;
45  size_t eltsize = plasma_element_size(A->dtyp);
46  size_t offset = 0;
47 
48  if (mm < A->lm1) {
49  if (nn < A->ln1)
50  offset = A->bsiz*(mm+A->lm1*nn);
51  else
52  offset = A->A12 + (A->mb*(A->ln%A->nb)*mm);
53  }
54  else {
55  if (nn < A->ln1)
56  offset = A->A21 + ((A->lm%A->mb)*A->nb*nn);
57  else
58  offset = A->A22;
59  }
60 
61  return (void*)((intptr_t)A->mat + (offset*eltsize) );
62 }
63 
64 /***************************************************************************/
67 inline static void *magma_geteltaddr( const magma_desc_t *descA, int m, int n, int eltsize)
68 {
69  const PLASMA_desc *A = &(descA->desc);
70  size_t mm = m/A->mb;
71  size_t nn = n/A->nb;
72  size_t offset = 0;
73 
74  if (mm < A->lm1) {
75  if (nn < A->ln1)
76  offset = A->bsiz*(mm+A->lm1*nn) + m%A->mb + A->mb*(n%A->nb);
77  else
78  offset = A->A12 + (A->mb*(A->ln%A->nb)*mm) + m%A->mb + A->mb*(n%A->nb);
79  }
80  else {
81  if (nn < A->ln1)
82  offset = A->A21 + ((A->lm%A->mb)*A->nb*nn) + m%A->mb + (A->lm%A->mb)*(n%A->nb);
83  else
84  offset = A->A22 + m%A->mb + (A->lm%A->mb)*(n%A->nb);
85  }
86  return (void*)((intptr_t)A->mat + (offset*eltsize) );
87 }
88 
89 #ifdef __cplusplus
90 }
91 #endif
92 
93 #endif