11
/* utilities for GA test programs */
15
#define N 400 /* first dimension */
19
#define GA_DATA_TYPE MT_C_FLOAT
20
#define GA_ABS(a) (((a) >= 0) ? (a) : (-(a)))
21
#define TOLERANCE 0.000001
24
#define CLOCK_ MPI_Wtime
26
#define CLOCK_ TCGTIME_
29
DoublePrecision gTime=0.0, gStart;
32
test(int data_type, int ndim) {
33
int me=GA_Nodeid(), nproc=GA_Nnodes();
34
int g_a, g_b, g_c, g_A, g_B, g_C;
36
int dims[GA_MAX_DIM]={N,N,2,2,2,1,1};
37
int lo[GA_MAX_DIM]={1,1,1,1,1,0,0};
38
int hi[GA_MAX_DIM]={N-2,N-2,1,1,1,0,0};
39
int clo[2], chi[2], m, n, k;
40
int ld[GA_MAX_DIM]={N-2,1,1,1,0,0};
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, *value2, *alpha, *beta;
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",0);
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 += CLOCK_()-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(value1_flt != 0.0)
154
GA_Error("GA_Sgemm, NGA_Matmul_patch Failed", 0);
157
value1_dbl = GA_Ddot(g_C, g_C);
158
if(value1_dbl != 0.0)
159
GA_Error("GA_Dgemm, NGA_Matmul_patch Failed", 0);
162
value1_dcpl = GA_Zdot(g_C, g_C);
163
if(value1_dcpl.real != 0.0 || value1_dcpl.imag != 0.0)
164
GA_Error("GA_Zgemm, NGA_Matmul_patch Failed", 0);
167
value1_scpl = GA_Cdot(g_C, g_C);
168
if(value1_scpl.real != 0.0 || value1_scpl.imag != 0.0)
169
GA_Error("GA_Sgemm, NGA_Matmul_patch Failed", 0);
172
GA_Error("wrong data type", data_type);
175
if(me==0) printf("....OK\n");
185
int me = GA_Nodeid();
187
for(i=2; i<=GA_MAX_DIM; i++) {
192
if(me == 0) printf("\n\n");
199
main(int argc, char **argv) {
201
Integer heap=9000000, stack=9000000;
203
DoublePrecision time;
207
int desired = MPI_THREAD_MULTIPLE;
209
MPI_Init_thread(&argc, &argv, desired, &provided);
210
if ( provided != MPI_THREAD_MULTIPLE ) printf("provided != MPI_THREAD_MULTIPLE\n");
212
MPI_Init (&argc, &argv); /* initialize MPI */
215
PBEGIN_(argc, argv); /* initialize TCGMSG */
218
GA_Initialize(); /* initialize GA */
223
if(me==0) printf("Using %d processes\n\n",nproc);
225
if(!MA_init((Integer)MT_F_DBL, stack/nproc, heap/nproc))
226
GA_Error("MA_init failed bytes= %d",stack+heap);
230
int i, *list = (int*)malloc(nproc*sizeof(int));
231
if(!list)GA_Error("malloc failed",nproc);
233
for(i=0; i<nproc;i++)list[i]=nproc-1-i;
235
GA_Register_proclist(list, nproc);
240
if(GA_Uses_fapi())GA_Error("Program runs with C API only",0);
244
/* printf("%d: Total Time = %lf\n", me, CLOCK_()-time);
245
printf("%d: GEMM Total Time = %lf\n", me, gTime);
248
if(me==0)printf("\nSuccess\n\n");