PLASMA 2.3.1

/home/mathieu/ICL/Plasma/svn/trunk/tools/plasma_2.4.0/control/descriptor.h

00001 
00014 #ifndef _PLASMA_DESCRIPTOR_H_
00015 #define _PLASMA_DESCRIPTOR_H_
00016 
00017 #ifdef __cplusplus
00018 extern "C" {
00019 #endif
00020 
00021 /***************************************************************************/
00024 inline static void *plasma_geteltaddr( const PLASMA_desc *A, int m, int n, int eltsize);
00025 inline static void *plasma_getaddr(PLASMA_desc A, int m, int n);
00026 PLASMA_desc plasma_desc_init(PLASMA_enum dtyp, int mb, int nb, int bsiz, int lm, int ln, int i, int j, int m, int n);
00027 PLASMA_desc plasma_desc_submatrix(PLASMA_desc descA, int i, int j, int m, int n);
00028 int plasma_desc_check(PLASMA_desc *desc);
00029 int plasma_desc_mat_alloc(PLASMA_desc *desc);
00030 int plasma_desc_mat_free(PLASMA_desc *desc);
00031 
00032 /***************************************************************************/
00035 inline static void *plasma_getaddr(PLASMA_desc A, int m, int n)
00036 {
00037     size_t mm = m+A.i/A.mb;
00038     size_t nn = n+A.j/A.nb;
00039     size_t eltsize = plasma_element_size(A.dtyp);
00040     size_t offset = 0;
00041 
00042     if (mm < A.lm1) {
00043         if (nn < A.ln1)
00044             offset = A.bsiz*(mm+A.lm1*nn);
00045         else
00046             offset = A.A12 + (A.mb*(A.ln%A.nb)*mm);
00047     }
00048     else {
00049         if (nn < A.ln1)
00050             offset = A.A21 + ((A.lm%A.mb)*A.nb*nn);
00051         else
00052             offset = A.A22;
00053     }
00054 
00055     return (void*)((intptr_t)A.mat + (offset*eltsize) );
00056 }
00057 
00058 /***************************************************************************/
00061 inline static void *plasma_geteltaddr( const PLASMA_desc *A, int m, int n, int eltsize)
00062 {
00063     size_t mm = m/A->mb;
00064     size_t nn = n/A->nb;
00065     size_t offset = 0;
00066 
00067     if (mm < A->lm1) {
00068         if (nn < A->ln1)
00069             offset = A->bsiz*(mm+A->lm1*nn) + m%A->mb + A->mb*(n%A->nb);
00070         else
00071             offset = A->A12 + (A->mb*(A->ln%A->nb)*mm) + m%A->mb + A->mb*(n%A->nb);
00072     }
00073     else {
00074         if (nn < A->ln1)
00075             offset = A->A21 + ((A->lm%A->mb)*A->nb*nn) + m%A->mb + (A->lm%A->mb)*(n%A->nb);
00076         else
00077             offset = A->A22 + m%A->mb  + (A->lm%A->mb)*(n%A->nb);
00078     }
00079     return (void*)((intptr_t)A->mat + (offset*eltsize) );
00080 }
00081 
00082 /***************************************************************************/
00085 int PLASMA_Desc_Create(PLASMA_desc **desc, void *mat, PLASMA_enum dtyp, int mb, int nb, int bsiz, int lm, int ln, int i, int j, int m, int n);
00086 int PLASMA_Desc_Destroy(PLASMA_desc **desc);
00087 
00088 #ifdef __cplusplus
00089 }
00090 #endif
00091 
00092 #endif
 All Data Structures