19
/* utilities for GA test programs */
22
#define N 400 /* first dimension */
26
#define GA_DATA_TYPE MT_C_FLOAT
27
#define GA_ABS(a) (((a) >= 0) ? (a) : (-(a)))
28
#define TOLERANCE 0.000001
31
DoublePrecision gTime=0.0, gStart;
34
test(int data_type, int ndim) {
36
int g_a, g_b, g_c, g_A, g_B, g_C;
37
int dims[GA_MAX_DIM]={N,N,2,2,2,1,1};
38
int lo[GA_MAX_DIM]={1,1,1,1,1,0,0};
39
int hi[GA_MAX_DIM]={N-2,N-2,1,1,1,0,0};
40
int clo[2], chi[2], m, n, k;
41
double value1_dbl = 2.0, value2_dbl = 2.0;
42
double alpha_dbl = 1.0, beta_dbl = 0.0;
43
float value1_flt = 2.0, value2_flt = 2.0;
44
float alpha_flt = 1.0, beta_flt = 0.0;
45
DoubleComplex value1_dcpl = {2.0, 2.0}, value2_dcpl = {2.0, 2.0};
46
DoubleComplex alpha_dcpl = {1.0, 0.0} , beta_dcpl = {0.0, 0.0};
47
SingleComplex value1_scpl = {2.0, 2.0}, value2_scpl = {2.0, 2.0};
48
SingleComplex alpha_scpl = {1.0, 0.0} , beta_scpl = {0.0, 0.0};
49
void *value1=NULL, *value2=NULL, *alpha=NULL, *beta=NULL;
53
alpha = (void *)&alpha_flt;
54
beta = (void *)&beta_flt;
55
value1 = (void *)&value1_flt;
56
value2 = (void *)&value2_flt;
57
if(me==0) printf("Single Precision: Testing GA_Sgemm,NGA_Matmul_patch for %d-Dimension", ndim);
60
alpha = (void *)&alpha_dbl;
61
beta = (void *)&beta_dbl;
62
value1 = (void *)&value1_dbl;
63
value2 = (void *)&value2_dbl;
64
if(me==0) printf("Double Precision: Testing GA_Dgemm,NGA_Matmul_patch for %d-Dimension", ndim);
67
alpha = (void *)&alpha_dcpl;
68
beta = (void *)&beta_dcpl;
69
value1 = (void *)&value1_dcpl;
70
value2 = (void *)&value2_dcpl;
71
if(me==0) printf("Double Complex: Testing GA_Zgemm,NGA_Matmul_patch for %d-Dimension", ndim);
74
alpha = (void *)&alpha_scpl;
75
beta = (void *)&beta_scpl;
76
value1 = (void *)&value1_scpl;
77
value2 = (void *)&value2_scpl;
78
if(me==0) printf("Single Complex: Testing GA_Cgemm,NGA_Matmul_patch for %d-Dimension", ndim);
81
GA_Error("wrong data type", data_type);
84
g_a = NGA_Create(data_type, ndim, dims, "array A", NULL);
85
g_b = GA_Duplicate(g_a, "array B");
86
g_c = GA_Duplicate(g_a, "array C");
87
if(!g_a || !g_b || !g_c) GA_Error("Create failed: a, b or c",1);
93
NGA_Matmul_patch('N', 'N', alpha, beta,
102
* 1. Create g_A(=g_a) and g_B(=g_b)
103
* 2. g_C = g_A*g_B; (Using Gemm routines)
104
* 3. g_A = g_c; (copy the 2-d patch og g_c into g_A)
105
* 4. g_C = g_A - g_C; (Using add() routine by making beta=-1.0)
106
* 5. If all the elements in g_C is zero, implies SUCCESS.
108
dims[0] = dims[1] = m = n = k = N-2;
109
g_A = NGA_Create(data_type, 2, dims, "array A_", NULL);
110
g_B = GA_Duplicate(g_A, "array B_");
111
g_C = GA_Duplicate(g_A, "array C_");
112
if(!g_A || !g_B || !g_C) GA_Error("Create failed: A, B or C",n);
113
GA_Fill(g_A, value1);
114
GA_Fill(g_B, value2);
120
GA_Sgemm('N', 'N', m, n, k, alpha_flt, g_A, g_B, beta_flt, g_C);
124
GA_Dgemm('N', 'N', m, n, k, alpha_dbl, g_A, g_B, beta_dbl, g_C);
128
GA_Zgemm('N', 'N', m, n, k, alpha_dcpl, g_A, g_B, beta_dcpl, g_C);
129
beta_dcpl.real = -1.0;
132
GA_Cgemm('N', 'N', m, n, k, alpha_scpl, g_A, g_B, beta_scpl, g_C);
133
beta_scpl.real = -1.0;
136
GA_Error("wrong data type", data_type);
138
gTime += MP_TIMER()-gStart;
143
chi[0] = chi[1] = N-3;
145
NGA_Copy_patch('N', g_c, lo, hi, g_A, clo, chi) ;
147
GA_Add(alpha, g_A, beta, g_C, g_C);
148
/* NGA_Add_patch (alpha, g_c, lo, hi, beta, g_C, clo, chi, g_C, clo, chi);*/
152
value1_flt = GA_Fdot(g_C, g_C);
153
if(fabsf(value1_flt) > TOLERANCE) {
154
printf("\nabs(result) = %f > %f\n", fabsf(value1_flt), TOLERANCE);
155
GA_Error("GA_Sgemm, NGA_Matmul_patch Failed", 1);
159
value1_dbl = GA_Ddot(g_C, g_C);
160
if(fabs(value1_dbl) > TOLERANCE) {
161
printf("\nabs(result) = %f > %f\n", fabs(value1_dbl), TOLERANCE);
162
GA_Error("GA_Dgemm, NGA_Matmul_patch Failed", 1);
166
value1_dcpl = GA_Zdot(g_C, g_C);
167
if(fabs(value1_dcpl.real) > TOLERANCE
168
|| fabs(value1_dcpl.imag) > TOLERANCE) {
169
printf("\nabs(result) = %f+%fi > %f\n",
170
fabs(value1_dcpl.real), fabs(value1_dcpl.imag), TOLERANCE);
171
GA_Error("GA_Zgemm, NGA_Matmul_patch Failed", 1);
175
value1_scpl = GA_Cdot(g_C, g_C);
176
if(fabsf(value1_scpl.real) > TOLERANCE
177
|| fabsf(value1_scpl.imag) > TOLERANCE) {
178
printf("\nabs(result) = %f+%fi > %f\n",
179
fabsf(value1_scpl.real), fabsf(value1_scpl.imag), TOLERANCE);
180
GA_Error("GA_Sgemm, NGA_Matmul_patch Failed", 1);
184
GA_Error("wrong data type", data_type);
187
if(me==0) printf("....OK\n");
197
int me = GA_Nodeid();
199
for(i=2; i<=GA_MAX_DIM; i++) {
204
if(me == 0) printf("\n\n");
211
main(int argc, char **argv) {
213
Integer heap=9000000, stack=9000000;
215
DoublePrecision time;
219
GA_INIT(argc,argv); /* initialize GA */
224
if(me==0) printf("Using %d processes\n\n",nproc);
226
if(!MA_init((Integer)MT_F_DBL, stack/nproc, heap/nproc))
227
GA_Error("MA_init failed bytes= %d",stack+heap);
231
int i, *list = (int*)malloc(nproc*sizeof(int));
232
if(!list)GA_Error("malloc failed",nproc);
234
for(i=0; i<nproc;i++)list[i]=nproc-1-i;
236
GA_Register_proclist(list, nproc);
241
if(GA_Uses_fapi())GA_Error("Program runs with C API only",1);
245
/* printf("%d: Total Time = %lf\n", me, MP_TIMER()-time);
246
printf("%d: GEMM Total Time = %lf\n", me, gTime);
249
if(me==0)printf("\nSuccess\n\n");