Detect if program was compiled with optimizations
Users and developers might accidentally build a program or library without optimizations when they are desired. This could make the runtime 10 to 1000 times or more slower than it would be with optimizations. This could be devastating in computational cost on HPC and cause needless schedule delays. Programmatically detecting or using a heuristic to determine if a program was built with optimizations can help prevent this. Such methods are language-specific.
- CMake,
NDEBUG
is set if CMAKE_BUILD_TYPE isRelease
orRelWithDebInfo
. - Meson:
NDEBUG
is set ifbuildtype
isrelease
ordebugoptimized
with
project(..., default_options: ['b_ndebug=if-release'])
C / C++
There is currently no universal language standard method in C / C++ to determine if optimization was used on build.
The presence of macro NDEBUG
is used by the
standard library
to
disable assertions.
One could use if NDEBUG
is defined as an indication if optimizations were used.
bool fs_is_optimized(){
// This is a heuristic, trusting the build system or user to set NDEBUG if optimized.
#if defined(NDEBUG)
return true;
#else
return false;
#endif
}
Fortran
If the Fortran code is compiled with preprocessing, a method using NDEBUG
as above could be used.
Fortran iso_fortran_env
provides functions
compiler_version
and
compiler_options.
These could be used in a fine-grained, per compiler way to determine if optimizations were used.
Python
Distributed Python environments would virtually always be optimized. One can use heuristic checks to help indicate if the Python executable was built in debug mode. I am not yet aware of a universal method to determine if the CPython executable was built with optimizations.
import sysconfig
debug = bool(sysconfig.get_config_var('Py_DEBUG'))