# CUDA toolkit selection and auto-detection

# The HPC SDK compilers use the following order of precedence when determining
# which version of the CUDA toolchain to use.

#   1. If you do not specify which CUDA version to use, the compiler picks the
#   CUDA version from the HPC SDK installation directory that matches the
#   version of the CUDA Driver installed on your system. If the HPC SDK
#   installation directory does not contain a direct match, the newest version
#   in that directory which is not newer than the CUDA driver version is used.
#   If there is no CUDA driver installed on your system, the compiler falls
#   back on an internal default. See $DETECTCUDAVERSION.

#   2. The rcfile variable DEFAULT_CUDA_HOME will override the base default.

#   3. The environment variable NVHPC_CUDA_HOME will override all of the above
#   defaults.

#   4. The environment variable NVCOMPILER_CUDA_HOME overrides all of the
#   above; it is available for advanced users in case they need to override an
#   already-defined NVHPC_CUDA_HOME.

#   5. A user-specified cudaX.Y sub-option to -gpu will override all of the
#   above defaults and the corresponding version of the CUDA toolchain located
#   in the HPC SDK installation directory will be used.

#   6. The compiler command-line assignment NVHPC_CUDA_HOME= will override all of the
#   above defaults (including the cudaX.Y sub-option).

variable NEWESTCUDASHIPPED is default(12.9);
variable OLDESTCUDASHIPPED is default(11.8);
variable DEFAULT_CUDA_HOME is default();
variable NVHPC_CUDA_HOME_ENV is default($DEFAULT_CUDA_HOME) environment(NVHPC_CUDA_HOME);

variable PGI_CUDA_HOME is default($NVHPC_CUDA_HOME_ENV) environment(PGI_CUDA_HOME);
variable NVCOMPILER_CUDA_HOME is default($PGI_CUDA_HOME) environment(NVCOMPILER_CUDA_HOME);
variable USER_SET_CUDA is default($if($USEPGICUDA,
        $COMPBASE/$CUDAMAJOR/$CUDAVERSION,
        $NVCOMPILER_CUDA_HOME));

variable NVHPC_CUDA_HOME is default();
variable CUDAROOT is default($if($notequal($NVHPC_CUDA_HOME,),$NVHPC_CUDA_HOME,$USER_SET_CUDA));

variable USECUDAROOT is default($if($notequal($CUDAROOT,),
        $if($isdir($CUDAROOT),$path($CUDAROOT),$if($not($USEPGICUDA),$fatal(The value of CUDAROOT is not a directory: $CUDAROOT))),
        $if($isdir($COMPBASE/$CUDAMAJOR/$CUDAVERSION),$COMPBASE/$CUDAMAJOR/$CUDAVERSION)));
variable USER_SET_CUDA_HOME is default($or($and($notequal($NVCOMPILER_CUDA_HOME,), $not($USEPGICUDA))
        $notequal($CUDAROOT, $USER_SET_CUDA)));
variable READCUDAVERSION is default($if($ADDCUDA,$action(grep("define CUDA_VERSION",$USECUDAROOT/include/cuda.h))));
variable CUDAXXYY1 is default($if($ADDCUDA,$remove($READCUDAVERSION,"#define CUDA_VERSION ")));
variable CUDAXXYY2 is default($if($notequal($CUDAXXYY1,),$CUDAXXYY1,$replace($CUDAVERSION,".","0")0));
variable CUDAXXYY is default($if($notequal($CUDAXXYY2,),$CUDAXXYY2,0000));
# have to give CUDAXXYY some value because it frequently appears
# in $expr($CUDAXXYY<=...) expressions
variable CUDAXDY is default($substr($CUDAXXYY,0,-4).$substr($CUDAXXYY,-2,-2));
variable CUDAXY is default($substr($CUDAXXYY,0,-4)$substr($CUDAXXYY,-2,-2));
variable CUDALIBDIRNAME is
    default($if($and($or($equal($TARGET,win64),$equal($TARGET,win64-llvm)),
                    $or($expr($CUDAXXYY>=9020), $and($expr($CUDAXXYY>=9000), $USER_SET_CUDA_HOME))),
                lib/x64,
                lib64));
variable CUDALIBDIR is default($if($notequal($USECUDAROOT,),$USECUDAROOT/$CUDALIBDIRNAME));
variable CUDASITELIB is default();
variable CUDALIBINSTALL is default();

variable READVERSIONTXT is default($if($ADDCUDA,$action(grep("CUDA Version",$USECUDAROOT/version.txt))));
variable VERSIONTXT is default($if($ADDCUDA,$remove($READVERSIONTXT,"CUDA Version ")));
variable VERSIONJSON is default($if($ADDCUDA,$action(versionjson($USECUDAROOT/version.json))));

export PGI_CURR_CUDA_HOME=$if($ADDCUDA,$USECUDAROOT);
export NVHPC_CURRENT_CUDA_HOME=$if($ADDCUDA,$USECUDAROOT);
export NVHPC_CURRENT_CUDA_VERSION=$if($ADDCUDA,$if($notequal($VERSIONTXT,),$VERSIONTXT,$if($notequal($VERSIONJSON,),$VERSIONJSON,$CUDAXDY)));

variable PGI_CUDA_HOME_ENV is environment(PGI_CUDA_HOME);
variable NVCOMPILER_CUDA_HOME_ENV is environment(NVCOMPILER_CUDA_HOME);
variable DEFCUDAVERSIONVAL is default($NEWESTCUDASHIPPED);
variable DEFCUDAVERSIONVALXXYY is default($replace($DEFCUDAVERSIONVAL,".","0")0);
variable DEFCUDAVERSION is environment(PGI_CUDA_VSN) default($DEFCUDAVERSIONVAL);
variable NVREQCUDAVERSION is default();
variable REQCUDAVERSION is default();
variable NVREQCUDAVERSIONXXYY is default($replace($NVREQCUDAVERSION,".","0")0);
variable USEPGICUDA is default(0);    # whether to use the PGI installed CUDA toolkit
variable DETECTCUDAVERSION is default($if($DETECTCUDA,$ifn($USEPGICUDA,$action(cudatoolkit($COMPBASE/$CUDAMAJOR,$REQCUDAVERSION,$DEFCUDAVERSION,$NEWESTCUDASHIPPED)))));
variable DEFAULTCUDAVER is default($if($notequal($DETECTCUDAVERSION,0.0),$DETECTCUDAVERSION));
variable ENVCUDAVERSION is environment(PGI_CUDA_V) default($DETECTCUDAVERSION);
variable CUDACUDAVERSION is default($ENVCUDAVERSION);
variable CUDAVERSION is default($CUDACUDAVERSION);
variable CUDAFEVERSION is default($CUDAVERSION);
variable CUDAVER is default($replace($CUDAVERSION,.,_));
variable SETVER is default(0);

variable USECUDAFEROOT is default($if($notequal($CUDAROOT,),$CUDAROOT,$COMPROOT/$CUDAMAJOR/$CUDAFEVERSION));

variable TREECUDADIR is default($COMPBASE/$CUDAMAJOR/$CUDAVERSION);
variable DCUDADIR is default($if($or($SETVER,$equal($NVCOMPILER_CUDA_HOME,)),$TREECUDADIR,$NVCOMPILER_CUDA_HOME));
variable CUDADIR is default($DCUDADIR/bin);

# Comm Libs
variable DEFAULT_COMMLIBSDIR is default($if($equal($USER_SET_CUDA_HOME,1), $USECUDAROOT, $COMPBASE/$COMPSYS/$COMPVER/comm_libs/$CUDAVERSION));
variable NVCOMPILER_COMM_LIBS_HOME is default($DEFAULT_COMMLIBSDIR) environment(NVCOMPILER_COMM_LIBS_HOME);
variable COMMLIBSDIR is default($if($equal($PFX,nv),$if($CUDAVERSION,$NVCOMPILER_COMM_LIBS_HOME)));

# HPCX Path for `libucc` needed by cuSolverMp
variable HPCXDIR is default($COMMLIBSDIR/hpcx/latest);
variable HPCXBINDIR is default($path($HPCXDIR/ompi/bin));
variable HPCXUCCLIBDIR is default($path($HPCXDIR/ucc/lib));
variable HPCXUCXLIBDIR is default($path($HPCXDIR/ucx/lib));

# OpenMPI Path
variable OPENMPIDIR is default($COMMLIBSDIR/openmpi4/latest);
variable OPENMPIBINDIR is default($path($OPENMPIDIR/bin));
