Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cleanup/gf format fixes #1204

Open
wants to merge 40 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
66130f7
Add gf test interface to allow fine grained control over the GF testing
cpviolator May 1, 2021
0071401
Move the gauge al test to a ctest, make a new interface to the gauge …
cpviolator May 1, 2021
d9bbbfa
Move the gauge_alg_test to a ctest, make a new interface to the gauge…
cpviolator May 1, 2021
815f601
Merge branch 'cleanup/gf_test_interface' of https://github.com/lattic…
cpviolator May 1, 2021
9aa3aca
clang tidy
cpviolator May 1, 2021
b34ef65
Allow for single case testing in gauge_alg_ctest, minor clean up of g…
cpviolator May 2, 2021
d38486b
Clang tidy
cpviolator May 2, 2021
426076b
Add gf test interface to allow fine grained control over the GF testing
cpviolator May 1, 2021
fd30f59
Move the gauge al test to a ctest, make a new interface to the gauge …
cpviolator May 1, 2021
01e2726
Move the gauge_alg_test to a ctest, make a new interface to the gauge…
cpviolator May 1, 2021
a4fee79
clang tidy
cpviolator May 1, 2021
15b7e4c
Allow for single case testing in gauge_alg_ctest, minor clean up of g…
cpviolator May 2, 2021
fe83fa8
Clang tidy
cpviolator May 2, 2021
59c3beb
Rebase to GK
cpviolator Aug 5, 2021
dfb2668
Add gauge param argument
cpviolator Aug 5, 2021
feadc0d
GK merge
cpviolator Sep 24, 2021
3da3b1d
mid merge
cpviolator Oct 10, 2021
ab88e35
Even with develop
cpviolator Oct 11, 2021
bb9c0de
Make gf_fft_autotune default to true
cpviolator Oct 11, 2021
8265843
Remove alpha autotuning in FFT gauge fixing, add comments where appro…
cpviolator Oct 12, 2021
50b74bf
Merge remote-tracking branch 'origin/develop' into cleanup/gf_test_in…
cpviolator Oct 29, 2021
040be93
Revert MPI test params
cpviolator Oct 29, 2021
bb91ecd
Use device_timer instead of Timer
cpviolator Oct 29, 2021
f2558fe
Remove extra semi-colon
cpviolator Oct 29, 2021
4f98cc5
Consolidate the gauge fixing interafce, use new parameter struct Quda…
cpviolator Oct 29, 2021
5ef51f7
Use host_timer_t in gauge_alg_ctest.cpp
cpviolator Oct 30, 2021
97b4c0b
Clang tidy
cpviolator Oct 30, 2021
c7801b1
typo in Doxygen comment
cpviolator Oct 30, 2021
e82ba2a
Merge remote-tracking branch 'origin/develop' into cleanup/gf_format_…
cpviolator Nov 1, 2021
35ee71b
Rename gauge_alg to original
cpviolator Nov 1, 2021
46bc1a0
Add support for host and device gauge input
cpviolator Dec 16, 2021
adbf72f
Merge remote-tracking branch 'origin/develop' into cleanup/gf_format_…
cpviolator Dec 16, 2021
6975267
Use gauge fix param for GPU fix function. Need to fix interface for C…
cpviolator Dec 17, 2021
84b675d
Restrict interface to CPU gauge fields, enforces GPU kernel call for …
cpviolator Dec 22, 2021
0e020b9
Set gauge fixing parameters once only, use a CL supplied seed (update…
cpviolator Dec 22, 2021
0887b53
Merge remote-tracking branch 'origin' into cleanup/gf_format_fixes
cpviolator Dec 22, 2021
5672515
Develop merge, clang tidy
cpviolator Dec 22, 2021
984c45a
Add precision parameter to QudaGaugeFixParam to specify gauge fixing …
cpviolator Dec 22, 2021
7e83e14
clang tidy
cpviolator Dec 22, 2021
b1e25b0
Adjust determinant tolerance for double precision
cpviolator Dec 22, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions include/enum_quda.h
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,12 @@ typedef enum QudaWFlowType_s {
QUDA_WFLOW_TYPE_INVALID = QUDA_INVALID_ENUM
} QudaWFlowType;

typedef enum QudaGaugeFixType_s {
QUDA_GAUGEFIX_TYPE_OVR = 0,
QUDA_GAUGEFIX_TYPE_FFT = 1,
QUDA_GAUGEFIX_TYPE_INVALID = QUDA_INVALID_ENUM
} QudaGaugeFixType;

// Allows to choose an appropriate external library
typedef enum QudaExtLibType_s {
QUDA_CUSOLVE_EXTLIB,
Expand Down
10 changes: 10 additions & 0 deletions include/enum_quda_fortran.h
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,16 @@
#define QUDA_CONTRACT_GAMMA_S34 15
#define QUDA_CONTRACT_GAMMA_INVALID QUDA_INVALID_ENUM

#define QudaWFlowType integer(4)
#define QUDA_WFLOW_TYPE_WILSON 0
#define QUDA_WFLOW_TYPE_SYMANZIK 1
#define QUDA_WFLOW_TYPE_INVALID QUDA_INVALID_ENUM

#define QudaGaugeFixType integer(4)
#define QUDA_GAUGEFIX_TYPE_OVR 0
#define QUDA_GAUGEFIX_TYPE_FFT 1
#define QUDA_GAUGEFIX_TYPE_INVALID QUDA_INVALID_ENUM

#define QudaExtLibType integer(4)
#define QUDA_CUSOLVE_EXTLIB 0
#define QUDA_EIGEN_EXTLIB 1
Expand Down
26 changes: 4 additions & 22 deletions include/gauge_tools.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,34 +113,16 @@ namespace quda
/**
* @brief Gauge fixing with overrelaxation with support for single and multi GPU.
* @param[in,out] data, quda gauge field
* @param[in] gauge_dir, 3 for Coulomb gauge fixing, other for Landau gauge fixing
* @param[in] Nsteps, maximum number of steps to perform gauge fixing
* @param[in] verbose_interval, print gauge fixing info when iteration count is a multiple of this
* @param[in] relax_boost, gauge fixing parameter of the overrelaxation method, most common value is 1.5 or 1.7.
* @param[in] tolerance, torelance value to stop the method, if this
* value is zero then the method stops when iteration reachs the
* maximum number of steps defined by Nsteps
* @param[in] reunit_interval, reunitarize gauge field when iteration count is a multiple of this
* @param[in] stopWtheta, 0 for MILC criterion and 1 to use the theta value
* @param[in] fix_param Parameter struct that defines the gauge fixing
*/
void gaugeFixingOVR(GaugeField &data, const int gauge_dir, const int Nsteps, const int verbose_interval,
const double relax_boost, const double tolerance, const int reunit_interval, const int stopWtheta);
void gaugeFixingOVR(GaugeField &data, QudaGaugeFixParam &fix_param);

/**
* @brief Gauge fixing with Steepest descent method with FFTs with support for single GPU only.
* @param[in,out] data, quda gauge field
* @param[in] gauge_dir, 3 for Coulomb gauge fixing, other for Landau gauge fixing
* @param[in] Nsteps, maximum number of steps to perform gauge fixing
* @param[in] verbose_interval, print gauge fixing info when iteration count is a multiple of this
* @param[in] alpha, gauge fixing parameter of the method, most common value is 0.08
* @param[in] autotune, 1 to autotune the method, i.e., if the Fg inverts its tendency we decrease the alpha value
* @param[in] tolerance, torelance value to stop the method, if this
* value is zero then the method stops when iteration reachs the
* maximum number of steps defined by Nsteps
* @param[in] stopWtheta, 0 for MILC criterion and 1 to use the theta value
* @param[in] fix_param Parameter struct that defines the gauge fixing
*/
void gaugeFixingFFT(GaugeField &data, const int gauge_dir, const int Nsteps, const int verbose_interval,
const double alpha, const int autotune, const double tolerance, const int stopWtheta);
void gaugeFixingFFT(GaugeField &data, QudaGaugeFixParam &fix_param);

/**
@brief Compute the Fmunu tensor
Expand Down
72 changes: 39 additions & 33 deletions include/quda.h
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,24 @@ extern "C" {
QudaBLASDataOrder data_order; /**< Specifies if using Row or Column major */
} QudaBLASParam;

typedef struct QudaGaugeFixParam_s {
size_t struct_size; /**< Size of this struct in bytes. Used to ensure that the host application and QUDA see the same struct size */

QudaGaugeFixType fix_type; /**< The aglorithm to use for gauge fixing */
int gauge_dir; /**< The orthogonal direction of the gauge fixing, 3=Coulomb, 4=Landau. (default 4) */
int maxiter; /**< The maximum number of gauge fixing iterations to be applied (default 10000) */
int verbosity_interval; /**< Print the gauge fixing progress every N steps (default 100) */
double ovr_relaxation_boost; /**< The overrelaxation boost parameter for the overrelaxation method (default 1.5) */
double fft_alpha; /**< The Alpha parameter in the FFT method (default 0.8) */
QudaBoolean fft_autotune; /**< Autotune the Alpha parameter in the FFT method (default true) */
int reunit_interval; /**< Reunitarise the gauge field every N steps (default 10) */
double tolerance; /**< The tolerance of the gauge fixing quality (default 1e-6) */
QudaBoolean theta_condition; /**< "Use the theta value to determine the gauge fixing if true. If false, use the
delta value (default false)" */
QudaPrecision precision; /**< The precision used by the algorithm */

} QudaGaugeFixParam;

/*
* Interface functions, found in interface_quda.cpp
*/
Expand Down Expand Up @@ -954,6 +972,15 @@ extern "C" {
*/
QudaBLASParam newQudaBLASParam(void);

/**
* A new QudaGaugeFixParam should always be initialized immediately
* after it's defined (and prior to explicitly setting its members)
* using this function. Typical usage is as follows:
*
* QudaGaugeFixParam fix_param = newQudaGaugeFixParam();
*/
QudaGaugeFixParam newQudaGaugeFixParam(void);

/**
* Print the members of QudaGaugeParam.
* @param param The QudaGaugeParam whose elements we are to print.
Expand Down Expand Up @@ -990,6 +1017,12 @@ extern "C" {
*/
void printQudaBLASParam(QudaBLASParam *param);

/**
* Print the members of QudaGaugeFixParam.
* @param param The QudaGaugeFixParam whose elements we are to print.
*/
void printQudaGaugeFixParam(QudaGaugeFixParam *param);

/**
* Load the gauge field from the host.
* @param h_gauge Base pointer to host gauge field (regardless of dimensionality)
Expand Down Expand Up @@ -1519,41 +1552,14 @@ extern "C" {
const int *X);

/**
* @brief Gauge fixing with overrelaxation with support for single and multi GPU.
* @param[in,out] gauge, gauge field to be fixed
* @param[in] gauge_dir, 3 for Coulomb gauge fixing, other for Landau gauge fixing
* @param[in] Nsteps, maximum number of steps to perform gauge fixing
* @param[in] verbose_interval, print gauge fixing info when iteration count is a multiple of this
* @param[in] relax_boost, gauge fixing parameter of the overrelaxation method, most common value is 1.5 or 1.7.
* @param[in] tolerance, torelance value to stop the method, if this value is zero then the method stops when
* iteration reachs the maximum number of steps defined by Nsteps
* @param[in] reunit_interval, reunitarize gauge field when iteration count is a multiple of this
* @param[in] stopWtheta, 0 for MILC criterion and 1 to use the theta value
* @param[in] param The parameters of the external fields and the computation settings
* @param[out] timeinfo
*/
int computeGaugeFixingOVRQuda(void *gauge, const unsigned int gauge_dir, const unsigned int Nsteps,
const unsigned int verbose_interval, const double relax_boost, const double tolerance,
const unsigned int reunit_interval, const unsigned int stopWtheta,
QudaGaugeParam *param, double *timeinfo);
/**
* @brief Gauge fixing with Steepest descent method with FFTs with support for single GPU only.
* @brief Gauge fixing with overrelaxation with support for single and multi GPU, and steepest descent FFT with
* support for single GPU only.
* @param[in,out] gauge, gauge field to be fixed
* @param[in] gauge_dir, 3 for Coulomb gauge fixing, other for Landau gauge fixing
* @param[in] Nsteps, maximum number of steps to perform gauge fixing
* @param[in] verbose_interval, print gauge fixing info when iteration count is a multiple of this
* @param[in] alpha, gauge fixing parameter of the method, most common value is 0.08
* @param[in] autotune, 1 to autotune the method, i.e., if the Fg inverts its tendency we decrease the alpha value
* @param[in] tolerance, torelance value to stop the method, if this value is zero then the method stops when
* iteration reachs the maximum number of steps defined by Nsteps
* @param[in] stopWtheta, 0 for MILC criterion and 1 to use the theta value
* @param[in] param The parameters of the external fields and the computation settings
* @param[out] timeinfo
* @param[in] gauge_param The parameters of the external fields and the computation settings
* @param[in] fix_param Container for the gauge fixing algorithm and parameters to use.
* @param[out] timeinfo Array to track timings
*/
int computeGaugeFixingFFTQuda(void *gauge, const unsigned int gauge_dir, const unsigned int Nsteps,
const unsigned int verbose_interval, const double alpha, const unsigned int autotune,
const double tolerance, const unsigned int stopWtheta, QudaGaugeParam *param,
double *timeinfo);
int computeGaugeFixingQuda(void *gauge, QudaGaugeParam *gauge_param, QudaGaugeFixParam *fix_param, double *timeinfo);

/**
* @brief Strided Batched GEMM
Expand Down
41 changes: 39 additions & 2 deletions lib/check_params.h
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ void printQudaCloverParam(QudaInvertParam *param)

#if defined CHECK_PARAM
if (param->struct_size != (size_t)INVALID_INT && param->struct_size != sizeof(*param))
errorQuda("Unexpected QudaInvertParam struct size %lu, expected %lu", param->struct_size, sizeof(*param));
errorQuda("Unexpected QudaCloverParam struct size %lu, expected %lu", param->struct_size, sizeof(*param));
#else
P(struct_size, (size_t)INVALID_INT);
#endif
Expand Down Expand Up @@ -1047,8 +1047,45 @@ void printQudaBLASParam(QudaBLASParam *param)
#endif
}

// clean up
#if defined INIT_PARAM
QudaGaugeFixParam newQudaGaugeFixParam(void)
{
QudaGaugeFixParam ret;
#elif defined CHECK_PARAM
static void checkGaugeFixParam(QudaGaugeFixParam *param)
{
#else
void printQudaGaugeFixParam(QudaGaugeFixParam *param)
{
printfQuda("QUDA gauge fix parameters:\n");
#endif

#if defined CHECK_PARAM
if (param->struct_size != (size_t)INVALID_INT && param->struct_size != sizeof(*param))
errorQuda("Unexpected QudaGaugeFixParam struct size %lu, expected %lu", param->struct_size, sizeof(*param));
#else
P(struct_size, (size_t)INVALID_INT);
#endif

P(gauge_dir, INVALID_INT);
P(maxiter, INVALID_INT);
P(verbosity_interval, INVALID_INT);
P(reunit_interval, INVALID_INT);
P(ovr_relaxation_boost, INVALID_DOUBLE);
P(fft_alpha, INVALID_DOUBLE);
P(tolerance, INVALID_DOUBLE);

#ifndef CHECK_PARAM
P(fft_autotune, QUDA_BOOLEAN_FALSE);
P(theta_condition, QUDA_BOOLEAN_FALSE);
#endif

#ifdef INIT_PARAM
return ret;
#endif
}

// clean up
#undef INVALID_INT
#undef INVALID_DOUBLE
#undef P
70 changes: 36 additions & 34 deletions lib/gauge_fix_fft.cu
Original file line number Diff line number Diff line change
Expand Up @@ -182,19 +182,26 @@ namespace quda {
};

template <typename Float, QudaReconstructType recon, int gauge_dir>
void gaugeFixingFFT(GaugeField& data, int Nsteps, int verbose_interval,
double alpha0, int autotune, double tolerance, int stopWtheta)
void gaugeFixingFFT(GaugeField& data, QudaGaugeFixParam &fix_param)
{
TimeProfile profileInternalGaugeFixFFT("InternalGaugeFixQudaFFT", false);


QudaBoolean autotune = fix_param.fft_autotune;
double alpha0 = fix_param.fft_alpha;
double tolerance = fix_param.tolerance;
QudaBoolean theta_condition = fix_param.theta_condition;
int steps = fix_param.maxiter;
int verbose_interval = fix_param.verbosity_interval;

profileInternalGaugeFixFFT.TPSTART(QUDA_PROFILE_COMPUTE);

if (getVerbosity() >= QUDA_SUMMARIZE) {
printfQuda("\tAuto tune active: %s\n", autotune ? "true" : "false");
if(autotune == QUDA_BOOLEAN_TRUE) printfQuda("\tAuto tune active: alpha will be adjusted as the algorithm progresses\n");
else printfQuda("\tAuto tune not active: alpha will remain constant as the algorithm progresses\n");
printfQuda("\tAlpha parameter of the Steepest Descent Method: %e\n", alpha0);
printfQuda("\tTolerance: %lf\n", tolerance);
printfQuda("\tStop criterion method: %s\n", stopWtheta ? "Theta" : "Delta");
printfQuda("\tMaximum number of iterations: %d\n", Nsteps);
printfQuda("\tTolerance: %e\n", tolerance);
printfQuda("\tStop criterion method: %s\n", theta_condition == QUDA_BOOLEAN_TRUE ? "Theta" : "Delta");
printfQuda("\tMaximum number of iterations: %d\n", steps);
printfQuda("\tPrint convergence results at every %d steps\n", verbose_interval);
}

Expand All @@ -217,11 +224,11 @@ namespace quda {
GaugeFixQuality<decltype(argQ)> gfixquality(argQ, data);
gfixquality.apply(device::get_default_stream());
double action0 = argQ.getAction();
if(getVerbosity() >= QUDA_SUMMARIZE) printf("Step: %d\tAction: %.16e\ttheta: %.16e\n", 0, argQ.getAction(), argQ.getTheta());
if(getVerbosity() >= QUDA_SUMMARIZE) printf("Step: %05d\tAction: %.16e\ttheta: %.16e\n", 0, argQ.getAction(), argQ.getTheta());

double diff = 0.0;
int iter = 0;
for (iter = 0; iter < Nsteps; iter++) {
for (iter = 0; iter < steps; iter++) {
for (int k = 0; k < 6; k++) {
//------------------------------------------------------------------------
// Set a pointer do the element k in lattice volume
Expand Down Expand Up @@ -285,23 +292,23 @@ namespace quda {
double action = argQ.getAction();
diff = abs(action0 - action);
if ((iter % verbose_interval) == (verbose_interval - 1) && getVerbosity() >= QUDA_SUMMARIZE)
printf("Step: %d\tAction: %.16e\ttheta: %.16e\tDelta: %.16e\n", iter + 1, argQ.getAction(), argQ.getTheta(), diff);
if ( autotune && ((action - action0) < -1e-14) ) {
printf("Step: %05d\tAction: %.16e\ttheta: %.16e\tDelta: %.16e\n", iter + 1, argQ.getAction(), argQ.getTheta(), diff);
if ( autotune == QUDA_BOOLEAN_TRUE && ((action - action0) < -1e-14) ) {
if ( arg.alpha > 0.01 ) {
arg.alpha = 0.95 * arg.alpha;
if(getVerbosity() >= QUDA_SUMMARIZE) printf(">>>>>>>>>>>>>> Warning: changing alpha down -> %.4e\n", arg.alpha);
if(getVerbosity() >= QUDA_SUMMARIZE) printf("Changing alpha down -> %.4e\n", arg.alpha);
}
}
//------------------------------------------------------------------------
// Check gauge fix quality criterion
//------------------------------------------------------------------------
if ( stopWtheta ) { if ( argQ.getTheta() < tolerance ) break; }
if ( theta_condition == QUDA_BOOLEAN_TRUE ) { if ( argQ.getTheta() < tolerance ) break; }
else { if ( diff < tolerance ) break; }

action0 = action;
}
if ((iter % verbose_interval) != 0 && getVerbosity() >= QUDA_SUMMARIZE)
printf("Step: %d\tAction: %.16e\ttheta: %.16e\tDelta: %.16e\n", iter, argQ.getAction(), argQ.getTheta(), diff);
printf("Step: %05d\tAction: %.16e\ttheta: %.16e\tDelta: %.16e\n", iter, argQ.getAction(), argQ.getTheta(), diff);

// Reunitarize at end
const double unitarize_eps = 1e-14;
Expand Down Expand Up @@ -356,45 +363,40 @@ namespace quda {

gflops = (gflops * 1e-9) / (secs);
gbytes = gbytes / (secs * 1e9);
if (getVerbosity() > QUDA_SUMMARIZE) printfQuda("Time: %6.6f s, Gflop/s = %6.1f, GB/s = %6.1f\n", secs, gflops, gbytes);

if (getVerbosity() > QUDA_SUMMARIZE)
printfQuda("Time: %6.6f s, Gflop/s = %6.1f, GB/s = %6.1f\n", secs, gflops, gbytes);

host_free(num_failures_h);
}

template<typename Float, int nColors, QudaReconstructType recon> struct GaugeFixingFFT {
GaugeFixingFFT(GaugeField& data, int gauge_dir, int Nsteps, int verbose_interval,
double alpha, int autotune, double tolerance, int stopWtheta)
GaugeFixingFFT(GaugeField& data, QudaGaugeFixParam &fix_param)
{
if (gauge_dir != 3) {
if (getVerbosity() > QUDA_SUMMARIZE) printfQuda("Starting Landau gauge fixing with FFTs...\n");
gaugeFixingFFT<Float, recon, 4>(data, Nsteps, verbose_interval, alpha, autotune, tolerance, stopWtheta);
if (fix_param.gauge_dir == 4) {
if (getVerbosity() > QUDA_SUMMARIZE) printfQuda("Starting Landau gauge fixing with FFTs\n");
gaugeFixingFFT<Float, recon, 4>(data, fix_param);
} else if (fix_param.gauge_dir == 3) {
if (getVerbosity() > QUDA_SUMMARIZE) printfQuda("Starting Coulomb gauge fixing with FFTs\n");
gaugeFixingFFT<Float, recon, 3>(data, fix_param);
} else {
if (getVerbosity() > QUDA_SUMMARIZE) printfQuda("Starting Coulomb gauge fixing with FFTs...\n");
gaugeFixingFFT<Float, recon, 3>(data, Nsteps, verbose_interval, alpha, autotune, tolerance, stopWtheta);
errorQuda("Unexpected gauge_dir = %d", fix_param.gauge_dir);
}
}
};

/**
* @brief Gauge fixing with Steepest descent method with FFTs with support for single GPU only.
* @param[in,out] data, quda gauge field
* @param[in] gauge_dir, 3 for Coulomb gauge fixing, other for Landau gauge fixing
* @param[in] Nsteps, maximum number of steps to perform gauge fixing
* @param[in] verbose_interval, print gauge fixing info when iteration count is a multiple of this
* @param[in] alpha, gauge fixing parameter of the method, most common value is 0.08
* @param[in] autotune, 1 to autotune the method, i.e., if the Fg inverts its tendency we decrease the alpha value
* @param[in] tolerance, torelance value to stop the method, if this value is zero then the method stops when iteration reachs the maximum number of steps defined by Nsteps
* @param[in] stopWtheta, 0 for MILC criterion and 1 to use the theta value
* @param[in] fix_param Parameter struct defining the gauge fixing
*/
#if defined(GPU_GAUGE_ALG)
void gaugeFixingFFT(GaugeField& data, const int gauge_dir, const int Nsteps, const int verbose_interval, const double alpha,
const int autotune, const double tolerance, const int stopWtheta)
void gaugeFixingFFT(GaugeField& data, QudaGaugeFixParam &fix_param)
{
if (comm_partitioned()) errorQuda("Gauge Fixing with FFTs in multi-GPU support NOT implemented yet!");
instantiate<GaugeFixingFFT, ReconstructNo12>(data, gauge_dir, Nsteps, verbose_interval, alpha, autotune, tolerance, stopWtheta);
instantiate<GaugeFixingFFT, ReconstructNo12>(data, fix_param);
}
#else
void gaugeFixingFFT(GaugeField&, const int, const int, const int, const double, const int, const double, const int)
void gaugeFixingFFT(GaugeField&, QudaGaugeFixParam &)
{
errorQuda("Gauge fixing has bot been built");
}
Expand Down
Loading