QUDA  v0.5.0
A library for QCD on GPUs
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
wilson_dslash_def.h
Go to the documentation of this file.
1 // wilson_dslash_def.h - Dslash kernel definitions
2 
3 // There are currently 72 different variants of the Wilson Dslash
4 // kernel, each one characterized by a set of 5 options, where each
5 // option can take one of several values (2*3*2*2*3 = 72). This file
6 // is structured so that the C preprocessor loops through all 72
7 // variants (in a manner resembling a counter), sets the appropriate
8 // macros, and defines the corresponding functions.
9 //
10 // As an example of the function naming conventions, consider
11 //
12 // cloverDslash12DaggerXpayKernel(float4* out, ...).
13 //
14 // This is a clover Dslash^dagger kernel where the result is
15 // multiplied by "a" and summed with an input vector (Xpay), and the
16 // gauge matrix is reconstructed from 12 real numbers. More
17 // generally, each function name is given by the concatenation of the
18 // following 4 fields, with "Kernel" at the end:
19 //
20 // DD_NAME_F = dslash, cloverDslash
21 // DD_RECON_F = 8, 12, 18
22 // DD_DAG_F = Dagger, [blank]
23 // DD_XPAY_F = Xpay, [blank]
24 //
25 // In addition, the kernels are templated on the precision of the
26 // fields (double, single, or half).
27 
28 // initialize on first iteration
29 
30 #ifndef DD_LOOP
31 #define DD_LOOP
32 #define DD_DAG 0
33 #define DD_XPAY 0
34 #define DD_RECON 0
35 #define DD_PREC 0
36 #define DD_CLOVER 0
37 #endif
38 
39 // set options for current iteration
40 
41 #if (DD_CLOVER==0) // no clover
42 #define DD_NAME_F dslash
43 #elif (DD_CLOVER==1) // clover
44 #define DSLASH_CLOVER
45 #define DD_NAME_F cloverDslash
46 #else
47 #define DSLASH_CLOVER
48 #define DSLASH_CLOVER_XPAY
49 #define DD_NAME_F asymCloverDslash
50 #endif
51 
52 #if (DD_DAG==0) // no dagger
53 #define DD_DAG_F
54 #else // dagger
55 #define DD_DAG_F Dagger
56 #endif
57 
58 // DSLASH_CLOVER_XPAY implies DD_XPAY=1
59 #if (DD_XPAY==0) && defined(DSLASH_CLOVER_XPAY)
60 #undef DD_XPAY
61 #define DD_XPAY 1
62 #endif
63 
64 #if (DD_XPAY==0) // no xpay
65 #define DD_XPAY_F
66 #else // xpay
67 #define DD_XPAY_F Xpay
68 #define DSLASH_XPAY
69 #endif
70 
71 #if (DD_PREC == 0)
72 #define DD_PARAM_XPAY const double2 *x, const float *xNorm, const double a,
73 #elif (DD_PREC == 1)
74 #define DD_PARAM_XPAY const float4 *x, const float *xNorm, const float a,
75 #else
76 #define DD_PARAM_XPAY const short4 *x, const float *xNorm, const float a,
77 #endif
78 
79 #if (DD_RECON==0) // reconstruct from 8 reals
80 #define DD_RECON_F 8
81 
82 #if (DD_PREC==0)
83 #define DD_PARAM_GAUGE const double2 *gauge0, const double2 *gauge1,
84 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_8_DOUBLE
85 #ifdef DIRECT_ACCESS_LINK
86 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_8_DOUBLE2
87 #else
88 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_8_DOUBLE2_TEX
89 #endif // DIRECT_ACCESS_LINK
90 
91 #elif (DD_PREC==1)
92 #define DD_PARAM_GAUGE const float4 *gauge0, const float4 *gauge1,
93 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_8_SINGLE
94 #ifdef DIRECT_ACCESS_LINK
95 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_8_FLOAT4
96 #else
97 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_8_FLOAT4_TEX
98 #endif // DIRECT_ACCESS_LINK
99 
100 #else
101 #define DD_PARAM_GAUGE const short4 *gauge0, const short4* gauge1,
102 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_8_SINGLE
103 #ifdef DIRECT_ACCESS_LINK
104 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_8_SHORT4
105 #else
106 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_8_SHORT4_TEX
107 #endif // DIRECT_ACCESS_LINK
108 #endif // DD_PREC
109 #elif (DD_RECON==1) // reconstruct from 12 reals
110 #define DD_RECON_F 12
111 
112 #if (DD_PREC==0)
113 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_12_DOUBLE
114 #ifdef DIRECT_ACCESS_LINK
115 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_12_DOUBLE2
116 #else
117 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_12_DOUBLE2_TEX
118 #endif // DIRECT_ACCESS_LINK
119 #define DD_PARAM_GAUGE const double2 *gauge0, const double2 *gauge1,
120 
121 #elif (DD_PREC==1)
122 #define DD_PARAM_GAUGE const float4 *gauge0, const float4 *gauge1,
123 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_12_SINGLE
124 #ifdef DIRECT_ACCESS_LINK
125 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_12_FLOAT4
126 #else
127 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_12_FLOAT4_TEX
128 #endif // DIRECT_ACCESS_LINK
129 
130 #else
131 #define DD_PARAM_GAUGE const short4 *gauge0, const short4 *gauge1,
132 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_12_SINGLE
133 #ifdef DIRECT_ACCESS_LINK
134 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_12_SHORT4
135 #else
136 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_12_SHORT4_TEX
137 #endif // DIRECT_ACCESS_LINK
138 #endif // DD_PREC
139 #else // no reconstruct, load all components
140 #define DD_RECON_F 18
141 #define GAUGE_FLOAT2
142 #if (DD_PREC==0)
143 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_18_DOUBLE
144 #ifdef DIRECT_ACCESS_LINK
145 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_18_DOUBLE2
146 #else
147 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_18_DOUBLE2_TEX
148 #endif // DIRECT_ACCESS_LINK
149 #define DD_PARAM_GAUGE const double2 *gauge0, const double2 *gauge1,
150 
151 #elif (DD_PREC==1)
152 #define DD_PARAM_GAUGE const float4 *gauge0, const float4 *gauge1, // FIXME for direct reading, really float2
153 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_18_SINGLE
154 #ifdef DIRECT_ACCESS_LINK
155 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_18_FLOAT2
156 #else
157 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_18_FLOAT2_TEX
158 #endif // DIRECT_ACCESS_LINK
159 
160 #else
161 #define DD_PARAM_GAUGE const short4 *gauge0, const short4 *gauge1, // FIXME for direct reading, really short2
162 #define RECONSTRUCT_GAUGE_MATRIX RECONSTRUCT_MATRIX_18_SINGLE
163 #ifdef DIRECT_ACCESS_LINK
164 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_18_SHORT2
165 #else
166 #define READ_GAUGE_MATRIX READ_GAUGE_MATRIX_18_SHORT2_TEX
167 #endif //DIRECT_ACCESS_LINK
168 #endif
169 #endif
170 
171 #if (DD_PREC==0) // double-precision fields
172 
173 #define TPROJSCALE tProjScale
174 
175 // double-precision gauge field
176 #if (defined DIRECT_ACCESS_LINK) || (defined FERMI_NO_DBLE_TEX)
177 #define GAUGE0TEX gauge0
178 #define GAUGE1TEX gauge1
179 #else
180 #ifdef USE_TEXTURE_OBJECTS
181 #define GAUGE0TEX param.gauge0Tex
182 #define GAUGE1TEX param.gauge1Tex
183 #else
184 #define GAUGE0TEX gauge0TexDouble2
185 #define GAUGE1TEX gauge1TexDouble2
186 #endif
187 #endif
188 
189 #define GAUGE_FLOAT2
190 
191 // double-precision spinor fields
192 #define DD_PARAM_OUT double2* out, float *null1,
193 #define DD_PARAM_IN const double2* in, const float *null4,
194 
195 #if (defined DIRECT_ACCESS_WILSON_SPINOR) || (defined FERMI_NO_DBLE_TEX)
196 #define READ_SPINOR READ_SPINOR_DOUBLE
197 #define READ_SPINOR_UP READ_SPINOR_DOUBLE_UP
198 #define READ_SPINOR_DOWN READ_SPINOR_DOUBLE_DOWN
199 #define SPINORTEX in
200 #else
201 #define READ_SPINOR READ_SPINOR_DOUBLE_TEX
202 #define READ_SPINOR_UP READ_SPINOR_DOUBLE_UP_TEX
203 #define READ_SPINOR_DOWN READ_SPINOR_DOUBLE_DOWN_TEX
204 #ifdef USE_TEXTURE_OBJECTS
205 #define SPINORTEX param.inTex
206 #else
207 #define SPINORTEX spinorTexDouble
208 #endif // USE_TEXTURE_OBJECTS
209 #endif
210 #if (defined DIRECT_ACCESS_WILSON_INTER) || (defined FERMI_NO_DBLE_TEX)
211 #define READ_INTERMEDIATE_SPINOR READ_SPINOR_DOUBLE
212 #define INTERTEX out
213 #else
214 #define READ_INTERMEDIATE_SPINOR READ_SPINOR_DOUBLE_TEX
215 #ifdef USE_TEXTURE_OBJECTS
216 #define INTERTEX param.outTex
217 #else
218 #define INTERTEX interTexDouble
219 #endif
220 #endif
221 #define WRITE_SPINOR WRITE_SPINOR_DOUBLE2_STR
222 #define SPINOR_DOUBLE
223 #if (DD_XPAY==1)
224 #if (defined DIRECT_ACCESS_WILSON_ACCUM) || (defined FERMI_NO_DBLE_TEX)
225 #define ACCUMTEX x
226 #define READ_ACCUM READ_ACCUM_DOUBLE
227 #else
228 #ifdef USE_TEXTURE_OBJECTS
229 #define ACCUMTEX param.xTex
230 #else
231 #define ACCUMTEX accumTexDouble
232 #endif // USE_TEXTURE_OBJECTS
233 #define READ_ACCUM READ_ACCUM_DOUBLE_TEX
234 #endif
235 
236 #endif
237 
238 #define SPINOR_HOP 12
239 
240 // double-precision clover field
241 #if (DD_CLOVER==0)
242 #define DD_PARAM_CLOVER
243 #else
244 #define DD_PARAM_CLOVER const double2 *clover, const float *null3,
245 #endif
246 #if (defined DIRECT_ACCESS_CLOVER) || (defined FERMI_NO_DBLE_TEX)
247 #define CLOVERTEX clover
248 #define READ_CLOVER READ_CLOVER_DOUBLE_STR
249 #else
250 #ifdef USE_TEXTURE_OBJECTS
251 #define CLOVERTEX (param.cloverTex)
252 #else
253 #define CLOVERTEX cloverTexDouble
254 #endif
255 #define READ_CLOVER READ_CLOVER_DOUBLE_TEX
256 #endif
257 #define CLOVER_DOUBLE
258 
259 #elif (DD_PREC==1) // single-precision fields
260 
261 #define TPROJSCALE tProjScale_f
262 
263 // single-precision gauge field
264 #ifdef DIRECT_ACCESS_LINK
265 #define GAUGE0TEX gauge0
266 #define GAUGE1TEX gauge1
267 #else
268 #ifdef USE_TEXTURE_OBJECTS
269 #define GAUGE0TEX param.gauge0Tex
270 #define GAUGE1TEX param.gauge1Tex
271 #else
272 #if (DD_RECON_F == 18)
273 #define GAUGE0TEX gauge0TexSingle2
274 #define GAUGE1TEX gauge1TexSingle2
275 #else
276 #define GAUGE0TEX gauge0TexSingle4
277 #define GAUGE1TEX gauge1TexSingle4
278 #endif
279 #endif // USE_TEXTURE_OBJECTS
280 #endif
281 
282 
283 // single-precision spinor fields
284 #define DD_PARAM_OUT float4* out, float *null1,
285 #define DD_PARAM_IN const float4* in, const float *null4,
286 #ifdef DIRECT_ACCESS_WILSON_SPINOR
287 #define READ_SPINOR READ_SPINOR_SINGLE
288 #define READ_SPINOR_UP READ_SPINOR_SINGLE_UP
289 #define READ_SPINOR_DOWN READ_SPINOR_SINGLE_DOWN
290 #define SPINORTEX in
291 #else
292 #define READ_SPINOR READ_SPINOR_SINGLE_TEX
293 #define READ_SPINOR_UP READ_SPINOR_SINGLE_UP_TEX
294 #define READ_SPINOR_DOWN READ_SPINOR_SINGLE_DOWN_TEX
295 #ifdef USE_TEXTURE_OBJECTS
296 #define SPINORTEX param.inTex
297 #else
298 #define SPINORTEX spinorTexSingle
299 #endif // USE_TEXTURE_OBJECTS
300 #endif
301 #ifdef DIRECT_ACCESS_WILSON_INTER
302 #define READ_INTERMEDIATE_SPINOR READ_SPINOR_SINGLE
303 #define INTERTEX out
304 #else
305 #define READ_INTERMEDIATE_SPINOR READ_SPINOR_SINGLE_TEX
306 #ifdef USE_TEXTURE_OBJECTS
307 #define INTERTEX param.outTex
308 #else
309 #define INTERTEX interTexSingle
310 #endif // USE_TEXTURE_OBJECTS
311 #endif
312 #define WRITE_SPINOR WRITE_SPINOR_FLOAT4_STR
313 #if (DD_XPAY==1)
314 #ifdef DIRECT_ACCESS_WILSON_ACCUM
315 #define ACCUMTEX x
316 #define READ_ACCUM READ_ACCUM_SINGLE
317 #else
318 #ifdef USE_TEXTURE_OBJECTS
319 #define ACCUMTEX param.xTex
320 #else
321 #define ACCUMTEX accumTexSingle
322 #endif // USE_TEXTURE_OBJECTS
323 #define READ_ACCUM READ_ACCUM_SINGLE_TEX
324 #endif
325 #endif
326 
327 #define SPINOR_HOP 6
328 
329 // single-precision clover field
330 #if (DD_CLOVER==0)
331 #define DD_PARAM_CLOVER
332 #else
333 #define DD_PARAM_CLOVER const float4 *clover, const float *null3,
334 #endif
335 #ifdef DIRECT_ACCESS_CLOVER
336 #define CLOVERTEX clover
337 #define READ_CLOVER READ_CLOVER_SINGLE
338 #else
339 #ifdef USE_TEXTURE_OBJECTS
340 #define CLOVERTEX (param.cloverTex)
341 #else
342 #define CLOVERTEX cloverTexSingle
343 #endif
344 #define READ_CLOVER READ_CLOVER_SINGLE_TEX
345 #endif
346 
347 #else // half-precision fields
348 
349 #define TPROJSCALE tProjScale_f
350 
351 // half-precision gauge field
352 #ifdef DIRECT_ACCESS_LINK
353 #define GAUGE0TEX gauge0
354 #define GAUGE1TEX gauge1
355 #else
356 #ifdef USE_TEXTURE_OBJECTS
357 #define GAUGE0TEX param.gauge0Tex
358 #define GAUGE1TEX param.gauge1Tex
359 #else
360 #if (DD_RECON_F == 18)
361 #define GAUGE0TEX gauge0TexHalf2
362 #define GAUGE1TEX gauge1TexHalf2
363 #else
364 #define GAUGE0TEX gauge0TexHalf4
365 #define GAUGE1TEX gauge1TexHalf4
366 #endif
367 #endif // USE_TEXTURE_OBJECTS
368 #endif
369 
370 
371 // half-precision spinor fields
372 #ifdef DIRECT_ACCESS_WILSON_SPINOR
373 #define READ_SPINOR READ_SPINOR_HALF
374 #define READ_SPINOR_UP READ_SPINOR_HALF_UP
375 #define READ_SPINOR_DOWN READ_SPINOR_HALF_DOWN
376 #define SPINORTEX in
377 #else
378 #define READ_SPINOR READ_SPINOR_HALF_TEX
379 #define READ_SPINOR_UP READ_SPINOR_HALF_UP_TEX
380 #define READ_SPINOR_DOWN READ_SPINOR_HALF_DOWN_TEX
381 #ifdef USE_TEXTURE_OBJECTS
382 #define SPINORTEX param.inTex
383 #else
384 #define SPINORTEX spinorTexHalf
385 #endif // USE_TEXTURE_OBJECTS
386 #endif
387 #ifdef DIRECT_ACCESS_WILSON_INTER
388 #define READ_INTERMEDIATE_SPINOR READ_SPINOR_HALF
389 #define INTERTEX out
390 #else
391 #define READ_INTERMEDIATE_SPINOR READ_SPINOR_HALF_TEX
392 #ifdef USE_TEXTURE_OBJECTS
393 #define INTERTEX param.outTex
394 #else
395 #define INTERTEX interTexHalf
396 #endif // USE_TEXTURE_OBJECTS
397 #endif
398 #define DD_PARAM_OUT short4* out, float *outNorm,
399 #define DD_PARAM_IN const short4* in, const float *inNorm,
400 #define WRITE_SPINOR WRITE_SPINOR_SHORT4_STR
401 #if (DD_XPAY==1)
402 #ifdef DIRECT_ACCESS_WILSON_ACCUM
403 #define ACCUMTEX x
404 #define READ_ACCUM READ_ACCUM_HALF
405 #else
406 #ifdef USE_TEXTURE_OBJECTS
407 #define ACCUMTEX param.xTex
408 #else
409 #define ACCUMTEX accumTexHalf
410 #endif // USE_TEXTURE_OBJECTS
411 #define READ_ACCUM READ_ACCUM_HALF_TEX
412 #endif
413 #endif
414 
415 #define SPINOR_HOP 6
416 
417 // half-precision clover field
418 #if (DD_CLOVER==0)
419 #define DD_PARAM_CLOVER
420 #else
421 #define DD_PARAM_CLOVER const short4 *clover, const float *cloverNorm,
422 #endif
423 #ifdef DIRECT_ACCESS_CLOVER
424 #define CLOVERTEX clover
425 #define READ_CLOVER READ_CLOVER_HALF
426 #else
427 #ifdef USE_TEXTURE_OBJECTS
428 #define CLOVERTEX (param.cloverTex)
429 #define CLOVERTEXNORM (param.cloverNormTex)
430 #else
431 #define CLOVERTEX cloverTexHalf
432 #define CLOVERTEXNORM cloverTexNorm
433 #endif
434 #define READ_CLOVER READ_CLOVER_HALF_TEX
435 #endif
436 
437 #endif
438 
439 // only build double precision if supported
440 #if !(__COMPUTE_CAPABILITY__ < 130 && DD_PREC == 0)
441 
442 #define DD_CONCAT(n,r,d,x) n ## r ## d ## x ## Kernel
443 #define DD_FUNC(n,r,d,x) DD_CONCAT(n,r,d,x)
444 
445 // define the kernel
446 
447 template <KernelType kernel_type>
448 __global__ void DD_FUNC(DD_NAME_F, DD_RECON_F, DD_DAG_F, DD_XPAY_F)
450 
451  // build Wilson or clover as appropriate
452 #if ((DD_CLOVER==0 && defined(GPU_WILSON_DIRAC)) || ((DD_CLOVER==1 || DD_CLOVER==2) && defined(GPU_CLOVER_DIRAC)))
453 
454 #if (__COMPUTE_CAPABILITY__ >= 200 && defined(SHARED_WILSON_DSLASH)) // Fermi optimal code
455 
456 #ifdef DSLASH_CLOVER_XPAY
457 
458 #if DD_DAG
460 #else
462 #endif
463 
464 #else
465 
466 #if DD_DAG
468 #else
470 #endif
471 
472 #endif
473 
474 #elif (__COMPUTE_CAPABILITY__ >= 120) // GT200 optimal code
475 
476 #ifdef DSLASH_CLOVER_XPAY
477 
478 #if DD_DAG
480 #else
482 #endif
483 
484 #else
485 
486 #if DD_DAG
488 #else
490 #endif
491 
492 #endif
493 
494 #else // fall-back is original G80
495 
496 #ifdef DSLASH_CLOVER_XPAY
497 
498 #if DD_DAG
500 #else
502 #endif
503 
504 #else
505 
506 #if DD_DAG
508 #else
509 #include "wilson_dslash_g80_core.h"
510 #endif
511 
512 #endif // DSLASH_CLOVER_XPAY
513 
514 
515 #endif // __COMPUTE_CAPABILITY
516 
517 
518 #endif // DD_CLOVER
519 
520 }
521 
522 #endif
523 
524 // clean up
525 
526 #undef DD_NAME_F
527 #undef DD_RECON_F
528 #undef DD_DAG_F
529 #undef DD_XPAY_F
530 #undef DD_PARAM_OUT
531 #undef DD_PARAM_GAUGE
532 #undef DD_PARAM_CLOVER
533 #undef DD_PARAM_IN
534 #undef DD_PARAM_XPAY
535 #undef DD_CONCAT
536 #undef DD_FUNC
537 
538 #undef DSLASH_XPAY
539 #undef READ_GAUGE_MATRIX
540 #undef RECONSTRUCT_GAUGE_MATRIX
541 #undef GAUGE0TEX
542 #undef GAUGE1TEX
543 #undef READ_SPINOR
544 #undef READ_SPINOR_UP
545 #undef READ_SPINOR_DOWN
546 #undef SPINORTEX
547 #undef READ_INTERMEDIATE_SPINOR
548 #undef INTERTEX
549 #undef WRITE_SPINOR
550 #undef READ_ACCUM
551 #undef ACCUMTEX
552 #undef READ_CLOVER
553 #undef CLOVERTEX
554 #undef DSLASH_CLOVER
555 #undef DSLASH_CLOVER_XPAY
556 #undef GAUGE_FLOAT2
557 #undef SPINOR_DOUBLE
558 #undef CLOVER_DOUBLE
559 #undef SPINOR_HOP
560 
561 #undef TPROJSCALE
562 
563 // prepare next set of options, or clean up after final iteration
564 
565 #if (DD_DAG==0)
566 #undef DD_DAG
567 #define DD_DAG 1
568 #else
569 #undef DD_DAG
570 #define DD_DAG 0
571 
572 #if (DD_XPAY==0)
573 #undef DD_XPAY
574 #define DD_XPAY 1
575 #else
576 #undef DD_XPAY
577 #define DD_XPAY 0
578 
579 #if (DD_RECON==0)
580 #undef DD_RECON
581 #define DD_RECON 1
582 #elif (DD_RECON==1)
583 #undef DD_RECON
584 #define DD_RECON 2
585 #else
586 #undef DD_RECON
587 #define DD_RECON 0
588 
589 #if (DD_PREC==0)
590 #undef DD_PREC
591 #define DD_PREC 1
592 #elif (DD_PREC==1)
593 #undef DD_PREC
594 #define DD_PREC 2
595 #else
596 #undef DD_PREC
597 #define DD_PREC 0
598 
599 #if (DD_CLOVER==0)
600 #undef DD_CLOVER
601 #define DD_CLOVER 1
602 #elif (DD_CLOVER==1)
603 #undef DD_CLOVER
604 #define DD_CLOVER 2
605 
606 #else
607 
608 #undef DD_LOOP
609 #undef DD_DAG
610 #undef DD_XPAY
611 #undef DD_RECON
612 #undef DD_PREC
613 #undef DD_CLOVER
614 
615 #endif // DD_CLOVER
616 #endif // DD_PREC
617 #endif // DD_RECON
618 #endif // DD_XPAY
619 #endif // DD_DAG
620 
621 #ifdef DD_LOOP
622 #include "wilson_dslash_def.h"
623 #endif