|
PLASMA 2.3.1
|
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
1.7.3