QUDA  v0.5.0
A library for QCD on GPUs
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
staggered_dslash_def.h
Go to the documentation of this file.
1 // staggered_dslash_def.h - staggered Dslash kernel definitions
2 //
3 // See comments in wilson_dslash_def.h
4 
5 // initialize on first iteration
6 
7 #ifndef DD_LOOP
8 #define DD_LOOP
9 
10 #define DD_AXPY 0
11 #define DD_RECON 0
12 #define DD_PREC 0
13 #endif
14 
15 // set options for current iteration
16 
17 #define DD_FNAME staggeredDslash
18 
19 #if (DD_AXPY==0) // no axpy
20 #define DD_AXPY_F
21 #else // axpy
22 #define DD_AXPY_F Axpy
23 #define DSLASH_AXPY
24 #endif
25 
26 #if (DD_PREC == 0)
27 #define DD_PARAM_AXPY const double2 *x, const float *xNorm, const double a, const DslashParam param
28 #elif (DD_PREC == 1)
29 #define DD_PARAM_AXPY const float2 *x, const float *xNorm, const float a, const DslashParam param
30 #else
31 #define DD_PARAM_AXPY const short2 *x, const float *xNorm, const float a, const DslashParam param
32 #endif
33 
34 
35 #if (DD_RECON==0) // reconstruct from 8 reals
36 #define DD_RECON_F 8
37 
38 #if (DD_PREC==0) // DOUBLE PRECISION
39 #define DD_PARAM_GAUGE const double2 *fatGauge0, const double2 *fatGauge1, const double2* longGauge0, const double2* longGauge1
40 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_GAUGE_MATRIX_8_DOUBLE
41 
42 #ifdef DIRECT_ACCESS_FAT_LINK
43 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_DOUBLE2(FAT, gauge, dir, idx, fat_ga_stride)
44 #else
45 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_DOUBLE2_TEX(FAT, gauge, dir, idx, fat_ga_stride)
46 #endif // DIRECT_ACCESS_FAT_LINK
47 #ifdef DIRECT_ACCESS_LONG_LINK
48 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_8_DOUBLE2(LONG, gauge, dir, idx, long_ga_stride)
49 #else
50 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_8_DOUBLE2_TEX(LONG, gauge, dir, idx, long_ga_stride)
51 #endif // DIRECT_ACCESS_LONG_LINK
52 
53 #elif (DD_PREC==1) // SINGLE PRECISION
54 #define DD_PARAM_GAUGE const float2 *fatGauge0, const float2 *fatGauge1, const float4* longGauge0, const float4* longGauge1
55 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_GAUGE_MATRIX_8_SINGLE
56 
57 #ifdef DIRECT_ACCESS_FAT_LINK
58 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_FLOAT2(FAT, gauge, dir, idx, fat_ga_stride)
59 #else
60 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_FLOAT2_TEX(FAT, gauge, dir, idx, fat_ga_stride)
61 #endif // DIRECT_ACCESS_FAT_LINK
62 #ifdef DIRECT_ACCESS_LONG_LINK
63 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_8_FLOAT4(LONG, gauge, dir, idx, long_ga_stride)
64 #else
65 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_8_FLOAT4_TEX(LONG, gauge, dir, idx, long_ga_stride)
66 #endif // DIRECT_ACCESS_LONG_LINK
67 
68 #else // HALF PRECISION
69 #define DD_PARAM_GAUGE const short2 *fatGauge0, const short2* fatGauge1, const short4* longGauge0, const short4* longGauge1
70 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_GAUGE_MATRIX_8_SINGLE
71 
72 /*#ifdef DIRECT_ACCESS_FAT_LINK
73 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_SHORT2(FAT, gauge, dir, idx, fat_ga_stride); RESCALE2(FAT, fat_ga_max);
74 #else*/
75 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_SHORT2_TEX(FAT, gauge, dir, idx, fat_ga_stride); RESCALE2(FAT, fat_ga_max);
76 /*#endif // DIRECT_ACCESS_FAT_LINK
77 #ifdef DIRECT_ACCESS_LONG_LINK
78 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_8_SHORT4(LONG, gauge, dir, idx, long_ga_stride)
79 #else*/
80 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_8_SHORT4_TEX(LONG, gauge, dir, idx, long_ga_stride)
81 //#endif // DIRECT_ACCESS_LONG_LINK
82 
83 #endif // DD_PREC
84 
85 #elif (DD_RECON ==1)// reconstruct from 12 reals
86 
87 #define DD_RECON_F 12
88 
89 #if (DD_PREC==0) // DOUBLE PRECISION
90 #define DD_PARAM_GAUGE const double2 *fatGauge0, const double2 *fatGauge1, const double2* longGauge0, const double2* longGauge1
91 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_GAUGE_MATRIX_12_DOUBLE
92 
93 #ifdef DIRECT_ACCESS_FAT_LINK
94 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_DOUBLE2(FAT, gauge, dir, idx, fat_ga_stride)
95 #else
96 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_DOUBLE2_TEX(FAT, gauge, dir, idx, fat_ga_stride)
97 #endif // DIRECT_ACCESS_FAT_LINK
98 #ifdef DIRECT_ACCESS_LONG_LINK
99 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_12_DOUBLE2(LONG, gauge, dir, idx, long_ga_stride)
100 #else
101 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_12_DOUBLE2_TEX(LONG, gauge, dir, idx, long_ga_stride)
102 #endif // DIRECT_ACCESS_LONG_LINK
103 
104 #elif (DD_PREC==1) // SINGLE PRECISION
105 #define DD_PARAM_GAUGE const float2 *fatGauge0, const float2 *fatGauge1, const float4* longGauge0, const float4* longGauge1
106 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_GAUGE_MATRIX_12_SINGLE
107 
108 #ifdef DIRECT_ACCESS_FAT_LINK
109 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_FLOAT2(FAT, gauge, dir, idx, fat_ga_stride)
110 #else
111 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_FLOAT2_TEX(FAT, gauge, dir, idx, fat_ga_stride)
112 #endif // DIRECT_ACCESS_FAT_LINK
113 #ifdef DIRECT_ACCESS_LONG_LINK
114 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_12_FLOAT4(LONG, gauge, dir, idx, long_ga_stride)
115 #else
116 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_12_FLOAT4_TEX(LONG, gauge, dir, idx, long_ga_stride)
117 #endif // DIRECT_ACCESS_LONG_LINK
118 
119 #else // HALF PRECISION
120 #define DD_PARAM_GAUGE const short2 *fatGauge0, const short2 *fatGauge1, const short4* longGauge0, const short4* longGauge1
121 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_GAUGE_MATRIX_12_SINGLE
122 
123 /*#ifdef DIRECT_ACCESS_FAT_LINK
124 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_SHORT2(FAT, gauge, dir, idx, fat_ga_stride); RESCALE2(FAT, fat_ga_max);
125 #else*/
126 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_SHORT2_TEX(FAT, gauge, dir, idx, fat_ga_stride); RESCALE2(FAT, fat_ga_max);
127 /*#endif // DIRECT_ACCCESS_FAT_LINK
128 #ifdef DIRECT_ACCESS_LONG_LINK
129 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_12_SHORT4(LONG, gauge, dir, idx, long_ga_stride)
130 #else*/
131 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_12_SHORT4_TEX(LONG, gauge, dir, idx, long_ga_stride)
132  //#endif // DIRECT_ACCCESS_LONG_LINK
133 
134 #endif // DD_PREC
135 
136 #else //18 reconstruct
137 #define DD_RECON_F 18
138 #define RECONSTRUCT_GAUGE_MATRIX(dir, gauge, idx, sign)
139 
140 #if (DD_PREC==0) // DOUBLE PRECISION
141 #define DD_PARAM_GAUGE const double2 *fatGauge0, const double2 *fatGauge1, const double2* longGauge0, const double2* longGauge1
142 
143 #ifdef DIRECT_ACCESS_FAT_LINK
144 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_DOUBLE2(FAT, gauge, dir, idx, fat_ga_stride)
145 #else
146 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_DOUBLE2_TEX(FAT, gauge, dir, idx, fat_ga_stride)
147 #endif // DIRECT_ACCCESS_FAT_LINK
148 #ifdef DIRECT_ACCESS_LONG_LINK
149 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_DOUBLE2(LONG, gauge, dir, idx, long_ga_stride)
150 #else
151 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_DOUBLE2_TEX(LONG, gauge, dir, idx, long_ga_stride)
152 #endif // DIRECT_ACCCESS_LONG_LINK
153 
154 #elif (DD_PREC==1) // SINGLE PRECISION
155 
156 #define DD_PARAM_GAUGE const float2 *fatGauge0, const float2 *fatGauge1, const float4* longGauge0, const float4* longGauge1
157 
158 #ifdef DIRECT_ACCESS_FAT_LINK
159 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_FLOAT2(FAT, gauge, dir, idx, fat_ga_stride)
160 #else
161 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_FLOAT2_TEX(FAT, gauge, dir, idx, fat_ga_stride)
162 #endif // DIRECT_ACCCESS_FAT_LINK
163 #ifdef DIRECT_ACCESS_LONG_LINK
164 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_FLOAT2(LONG, gauge, dir, idx, long_ga_stride)
165 #else
166 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_FLOAT2_TEX(LONG, gauge, dir, idx, long_ga_stride)
167 #endif // DIRECT_ACCCESS_LONG_LINK
168 
169 #else // HALF PRECISION
170 
171 #define DD_PARAM_GAUGE const short2 *fatGauge0, const short2 *fatGauge1, const short4* longGauge0, const short4* longGauge1
172 
173 /*#ifdef DIRECT_ACCESS_FAT_LINK
174 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_SHORT2(FAT, gauge, dir, idx, fat_ga_stride); RESCALE2(FAT, fat_ga_max);
175 #else*/
176 #define READ_FAT_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_SHORT2_TEX(FAT, gauge, dir, idx, fat_ga_stride); RESCALE2(FAT, fat_ga_max);
177  /*#endif // DIRECT_ACCESS_FAT_LINK
178 #ifdef DIRECT_ACCESS_LONG_LINK
179 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_SHORT2(LONG, gauge, dir, idx, long_ga_stride)
180 #else*/
181 #define READ_LONG_MATRIX(gauge, dir, idx) READ_GAUGE_MATRIX_18_SHORT2_TEX(LONG, gauge, dir, idx, long_ga_stride)
182  //#endif // DIRECT_ACCCESS_LONG_LINK
183 
184 #endif // DD_PREC
185 
186 #endif // DD_RECON
187 
188 #if (DD_PREC==0) // double-precision fields
189 
190 // gauge field
191 #define DD_PREC_F D
192 #if (defined DIRECT_ACCESS_FAT_LINK) || (defined FERMI_NO_DBLE_TEX)
193 #define FATLINK0TEX fatGauge0
194 #define FATLINK1TEX fatGauge1
195 #else
196 #ifdef USE_TEXTURE_OBJECTS
197 #define FATLINK0TEX param.gauge0Tex
198 #define FATLINK1TEX param.gauge1Tex
199 #else
200 #define FATLINK0TEX fatGauge0TexDouble
201 #define FATLINK1TEX fatGauge1TexDouble
202 #endif // USE_TEXTURE_OBJECTS
203 #endif
204 
205 #if (defined DIRECT_ACCESS_LONG_LINK) || (defined FERMI_NO_DBLE_TEX)
206 #define LONGLINK0TEX longGauge0
207 #define LONGLINK1TEX longGauge1
208 #else
209 #ifdef USE_TEXTURE_OBJECTS
210 #define LONGLINK0TEX param.longGauge0Tex
211 #define LONGLINK1TEX param.longGauge1Tex
212 #else
213 #define LONGLINK0TEX longGauge0TexDouble
214 #define LONGLINK1TEX longGauge1TexDouble
215 #endif // USE_TEXTURE_OBJECTS
216 #endif
217 
218 #define GAUGE_DOUBLE
219 
220 // spinor fields
221 #define DD_PARAM_OUT double2* out, float *null1
222 #define DD_PARAM_IN const double2* in, const float *null4
223 #if (defined DIRECT_ACCESS_SPINOR) || (defined FERMI_NO_DBLE_TEX)
224 #define SPINORTEX in
225 #define READ_1ST_NBR_SPINOR READ_1ST_NBR_SPINOR_DOUBLE
226 #define READ_3RD_NBR_SPINOR READ_3RD_NBR_SPINOR_DOUBLE
227 #else
228 #ifdef USE_TEXTURE_OBJECTS
229 #define SPINORTEX param.inTex
230 #else
231 #define SPINORTEX spinorTexDouble
232 #endif // USE_TEXTURE_OBJECTS
233 #define READ_1ST_NBR_SPINOR READ_1ST_NBR_SPINOR_DOUBLE_TEX
234 #define READ_3RD_NBR_SPINOR READ_3RD_NBR_SPINOR_DOUBLE_TEX
235 #endif
236 #if (defined DIRECT_ACCESS_INTER) || (defined FERMI_NO_DBLE_TEX)
237 #define READ_AND_SUM_SPINOR READ_AND_SUM_ST_SPINOR
238 #define INTERTEX out
239 #else
240 #define READ_AND_SUM_SPINOR READ_AND_SUM_ST_SPINOR_DOUBLE_TEX
241 #ifdef USE_TEXTURE_OBJECTS
242 #define INTERTEX param.outTex
243 #else
244 #define INTERTEX interTexDouble
245 #endif
246 #endif
247 #define WRITE_SPINOR WRITE_ST_SPINOR_DOUBLE2
248 #define SPINOR_DOUBLE
249 #if (DD_AXPY==1)
250 #if (defined DIRECT_ACCESS_ACCUM) || (defined FERMI_NO_DBLE_TEX)
251 #define ACCUMTEX x
252 #define READ_ACCUM READ_ST_ACCUM_DOUBLE
253 #else
254 #ifdef USE_TEXTURE_OBJECTS
255 #define ACCUMTEX param.xTex
256 #else
257 #define ACCUMTEX accumTexDouble
258 #endif // USE_TEXTURE_OBJECTS
259 #define READ_ACCUM READ_ST_ACCUM_DOUBLE_TEX
260 #endif
261 #endif // DD_AXPY
262 
263 
264 #elif (DD_PREC==1) // single-precision fields
265 
266 // gauge fields
267 #define DD_PREC_F S
268 
269 #ifndef DIRECT_ACCESS_FAT_LINK
270 #ifdef USE_TEXTURE_OBJECTS
271 #define FATLINK0TEX param.gauge0Tex
272 #define FATLINK1TEX param.gauge1Tex
273 #else
274 #define FATLINK0TEX fatGauge0TexSingle
275 #define FATLINK1TEX fatGauge1TexSingle
276 #endif
277 #else
278 #define FATLINK0TEX fatGauge0
279 #define FATLINK1TEX fatGauge1
280 #endif
281 
282 #ifndef DIRECT_ACCESS_LONG_LINK //longlink access
283 #ifdef USE_TEXTURE_OBJECTS
284 #define LONGLINK0TEX param.longGauge0Tex
285 #define LONGLINK1TEX param.longGauge1Tex
286 #else
287 #if (DD_RECON ==2)
288 #define LONGLINK0TEX longGauge0TexSingle_norecon
289 #define LONGLINK1TEX longGauge1TexSingle_norecon
290 #else
291 #define LONGLINK0TEX longGauge0TexSingle
292 #define LONGLINK1TEX longGauge1TexSingle
293 #endif
294 #endif // USE_TEXTURE_OBJECTS
295 #else
296 #define LONGLINK0TEX longGauge0
297 #define LONGLINK1TEX longGauge1
298 #endif
299 
300 // spinor fields
301 #define DD_PARAM_OUT float2* out, float *null1
302 #define DD_PARAM_IN const float2* in, const float *null4
303 #ifndef DIRECT_ACCESS_SPINOR
304 #ifdef USE_TEXTURE_OBJECTS
305 #define SPINORTEX param.inTex
306 #else
307 #define SPINORTEX spinorTexSingle2
308 #endif // USE_TEXTURE_OBJECTS
309 #define READ_1ST_NBR_SPINOR READ_1ST_NBR_SPINOR_SINGLE_TEX
310 #define READ_3RD_NBR_SPINOR READ_3RD_NBR_SPINOR_SINGLE_TEX
311 #else
312 #define SPINORTEX in
313 #define READ_1ST_NBR_SPINOR READ_1ST_NBR_SPINOR_SINGLE
314 #define READ_3RD_NBR_SPINOR READ_3RD_NBR_SPINOR_SINGLE
315 #endif
316 #if (defined DIRECT_ACCESS_INTER)
317 #define READ_AND_SUM_SPINOR READ_AND_SUM_ST_SPINOR
318 #define INTERTEX out
319 #else
320 #define READ_AND_SUM_SPINOR READ_AND_SUM_ST_SPINOR_SINGLE_TEX
321 #ifdef USE_TEXTURE_OBJECTS
322 #define INTERTEX param.outTex
323 #else
324 #define INTERTEX interTexSingle2
325 #endif // USE_TEXTURE_OBJECTS
326 #endif
327 #define WRITE_SPINOR WRITE_ST_SPINOR_FLOAT2
328 #if (DD_AXPY==1)
329 #if (defined DIRECT_ACCESS_ACCUM)
330 #define ACCUMTEX x
331 #define READ_ACCUM READ_ST_ACCUM_SINGLE
332 #else
333 #ifdef USE_TEXTURE_OBJECTS
334 #define ACCUMTEX param.xTex
335 #else
336 #define ACCUMTEX accumTexSingle2
337 #endif // USE_TEXTURE_OBJECTS
338 #define READ_ACCUM READ_ST_ACCUM_SINGLE_TEX
339 #endif
340 #endif // DD_AXPY
341 
342 
343 #else // half-precision fields
344 
345 // all reads done through texture cache regardless
346 
347 // gauge fields
348 #define DD_PREC_F H
349 #ifdef USE_TEXTURE_OBJECTS
350 #define FATLINK0TEX param.gauge0Tex
351 #define FATLINK1TEX param.gauge1Tex
352 #define LONGLINK0TEX param.longGauge0Tex
353 #define LONGLINK1TEX param.longGauge1Tex
354 #else
355 #define FATLINK0TEX fatGauge0TexHalf
356 #define FATLINK1TEX fatGauge1TexHalf
357 #if (DD_RECON ==2)
358 #define LONGLINK0TEX longGauge0TexHalf_norecon
359 #define LONGLINK1TEX longGauge1TexHalf_norecon
360 #else
361 #define LONGLINK0TEX longGauge0TexHalf
362 #define LONGLINK1TEX longGauge1TexHalf
363 #endif
364 #endif // USE_TEXTURE_OBJECTS
365 
366 #define READ_1ST_NBR_SPINOR READ_1ST_NBR_SPINOR_HALF_TEX
367 #define READ_3RD_NBR_SPINOR READ_3RD_NBR_SPINOR_HALF_TEX
368 #ifdef USE_TEXTURE_OBJECTS
369 #define SPINORTEX param.inTex
370 #else
371 #define SPINORTEX spinorTexHalf2
372 #endif // USE_TEXTURE_OBJECTS
373 #define DD_PARAM_OUT short2* out, float *outNorm
374 #define DD_PARAM_IN const short2* in, const float *inNorm
375 #if (defined DIRECT_ACCESS_INTER)
376 #define READ_AND_SUM_SPINOR READ_AND_SUM_ST_SPINOR_HALF
377 #define INTERTEX out
378 #else
379 #define READ_AND_SUM_SPINOR READ_AND_SUM_ST_SPINOR_HALF_TEX
380 #ifdef USE_TEXTURE_OBJECTS
381 #define INTERTEX param.outTex
382 #else
383 #define INTERTEX interTexHalf2
384 #endif // USE_TEXTURE_OBJECTS
385 #endif
386 #define WRITE_SPINOR WRITE_ST_SPINOR_SHORT2
387 #if (DD_AXPY==1)
388 #ifdef USE_TEXTURE_OBJECTS
389 #define ACCUMTEX param.xTex
390 #else
391 #define ACCUMTEX accumTexHalf2
392 #endif // USE_TEXTURE_OBJECTS
393 #define READ_ACCUM READ_ST_ACCUM_HALF_TEX
394 #endif // DD_AXPY
395 
396 #endif
397 
398 // only build double precision if supported
399 #if !(__COMPUTE_CAPABILITY__ < 130 && DD_PREC == 0)
400 
401 #define DD_CONCAT(n,r,x) n ## r ## x ## Kernel
402 #define DD_FUNC(n,r,x) DD_CONCAT(n,r,x)
403 
404 // define the kernel
405 
406 template <KernelType kernel_type>
407 __global__ void DD_FUNC(DD_FNAME, DD_RECON_F, DD_AXPY_F)
409 #ifdef GPU_STAGGERED_DIRAC
410  #include "staggered_dslash_core.h"
411 #endif
412 }
413 
414 #endif // !(__COMPUTE_CAPABILITY__ < 130 && DD_PREC == 0)
415 
416 
417 // clean up
418 
419 #undef DD_PREC_F
420 #undef DD_RECON_F
421 #undef DD_AXPY_F
422 #undef DD_PARAM_OUT
423 #undef DD_PARAM_GAUGE
424 #undef DD_PARAM_IN
425 #undef DD_PARAM_AXPY
426 #undef DD_FNAME
427 #undef DD_CONCAT
428 #undef DD_FUNC
429 
430 #undef DSLASH_AXPY
431 #undef READ_GAUGE_MATRIX
432 #undef RECONSTRUCT_GAUGE_MATRIX
433 #undef FATLINK0TEX
434 #undef FATLINK1TEX
435 #undef LONGLINK0TEX
436 #undef LONGLINK1TEX
437 #undef SPINORTEX
438 #undef WRITE_SPINOR
439 #undef READ_AND_SUM_SPINOR
440 #undef INTERTEX
441 #undef ACCUMTEX
442 #undef READ_ACCUM
443 #undef CLOVERTEX
444 #undef READ_CLOVER
445 #undef DSLASH_CLOVER
446 #undef GAUGE_DOUBLE
447 #undef SPINOR_DOUBLE
448 #undef CLOVER_DOUBLE
449 #undef READ_FAT_MATRIX
450 #undef READ_LONG_MATRIX
451 #undef READ_1ST_NBR_SPINOR
452 #undef READ_3RD_NBR_SPINOR
453 
454 
455 // prepare next set of options, or clean up after final iteration
456 
457 #if (DD_AXPY==0)
458 #undef DD_AXPY
459 #define DD_AXPY 1
460 #else
461 #undef DD_AXPY
462 #define DD_AXPY 0
463 
464 #if (DD_RECON==0)
465 #undef DD_RECON
466 #define DD_RECON 1
467 #elif (DD_RECON ==1)
468 #undef DD_RECON
469 #define DD_RECON 2
470 #else
471 #undef DD_RECON
472 #define DD_RECON 0
473 
474 #if (DD_PREC==0)
475 #undef DD_PREC
476 #define DD_PREC 1
477 #elif (DD_PREC==1)
478 #undef DD_PREC
479 #define DD_PREC 2
480 #else
481 #undef DD_PREC
482 #define DD_PREC 0
483 
484 #undef DD_LOOP
485 #undef DD_AXPY
486 #undef DD_RECON
487 #undef DD_PREC
488 
489 #endif // DD_PREC
490 #endif // DD_RECON
491 #endif // DD_AXPY
492 
493 #ifdef DD_LOOP
494 #include "staggered_dslash_def.h"
495 #endif