7#include <kernel/runtime.hpp>
9#include <kernel/util/dist.hpp>
10#include <kernel/util/memory_pool.hpp>
11#include <kernel/util/os_windows.hpp>
13#ifdef FEAT_HAVE_DEATH_HANDLER
14#include <death_handler.h>
22#if defined(__linux) || defined(__unix__)
33#include <kernel/util/cuda_util.hpp>
45bool Runtime::SyncGuard::sync_on =
true;
48static cudssHandle_t feat_cudss_handle =
nullptr;
57#if defined(_WIN32) && defined(FEAT_TESTING_VC)
64 std::cerr <<
"ERROR: Runtime::initialize called twice!\n";
70 std::cerr <<
"ERROR: Runtime::initialize called after Runtime::finalize!\n";
78 std::cerr <<
"ERROR: Failed to initialize Dist operations!\n";
93 Util::cuda_initialize(my_rank, 1, 1, Util::cuda_get_device_count());
94 Util::cuda_set_blocksize(256, 256, 256, 256, 256, 128);
98 if(CUDSS_STATUS_SUCCESS != cudssCreate(&feat_cudss_handle))
100 std::cerr <<
"ERROR: Failed to initialize cuDSS handle!\n";
108 for(
int iarg = 1; iarg < argc; ++iarg)
110 if(strcmp(argv[iarg],
"---build-info") == 0)
115 std::cout <<
"--- FEAT BUILD INFORMATION ---\n";
117 std::cout <<
"__cplusplus...................: " << __cplusplus <<
"\n";
118#ifdef __STDC_VERSION__
119 std::cout <<
"__STDC_VERSION__..............: " << __STDC_VERSION__ <<
"\n";
121 std::cout <<
"__STDC_VERSION__..............: -N/A-\n";
123#ifdef __STDC_HOSTED__
124 std::cout <<
"__STDC_HOSTED__...............: " << __STDC_HOSTED__ <<
"\n";
126 std::cout <<
"__STDC_HOSTED__...............: -N/A-\n";
128#ifdef __STDCPP_THREADS__
129 std::cout <<
"__STDCPP_THREADS__............: " << __STDCPP_THREADS__ <<
"\n";
131 std::cout <<
"__STDCPP_THREADS__............: -N/A-\n";
134 std::cout <<
"_OPENMP.......................: yes\n";
136 std::cout <<
"_OPENMP.......................: no\n";
140 std::cout <<
"FEAT_GIT_SHA1.................: " << FEAT_GIT_SHA1 <<
"\n";
142 std::cout <<
"FEAT_GIT_SHA1.................: -N/A-\n";
145 std::cout <<
"FEAT_BUILD_ID.................: " << FEAT_BUILD_ID <<
"\n";
147 std::cout <<
"FEAT_BUILD_ID.................: -N/A-\n";
149#ifdef FEAT_SOURCE_DIR
150 std::cout <<
"FEAT_SOURCE_DIR...............: " << FEAT_SOURCE_DIR <<
"\n";
152 std::cout <<
"FEAT_SOURCE_DIR...............: -N/A-\n";
155 std::cout <<
"FEAT_BUILD_DIR................: " << FEAT_BUILD_DIR <<
"\n";
157 std::cout <<
"FEAT_BUILD_DIR................: -N/A-\n";
160 std::cout <<
"FEAT_COMPILER.................: " << FEAT_COMPILER <<
"\n";
162 std::cout <<
"FEAT_COMPILER.................: -N/A-\n";
164#ifdef FEAT_COMPILER_GNU
165 std::cout <<
"FEAT_COMPILER_GNU.............: " << FEAT_COMPILER_GNU <<
"\n";
167 std::cout <<
"FEAT_COMPILER_GNU.............: -N/A-\n";
169#ifdef FEAT_COMPILER_CLANG
170 std::cout <<
"FEAT_COMPILER_CLANG...........: " << FEAT_COMPILER_CLANG <<
"\n";
172 std::cout <<
"FEAT_COMPILER_CLANG...........: -N/A-\n";
174#ifdef FEAT_COMPILER_CRAY
175 std::cout <<
"FEAT_COMPILER_CRAY............: " << FEAT_COMPILER_CRAY <<
"\n";
177 std::cout <<
"FEAT_COMPILER_CRAY............: -N/A-\n";
179#ifdef FEAT_COMPILER_INTEL
180 std::cout <<
"FEAT_COMPILER_INTEL...........: " << FEAT_COMPILER_INTEL <<
"\n";
182 std::cout <<
"FEAT_COMPILER_INTEL...........: -N/A-\n";
184#ifdef FEAT_COMPILER_MICROSOFT
185 std::cout <<
"FEAT_COMPILER_MICROSOFT.......: " << FEAT_COMPILER_MICROSOFT <<
"\n";
187 std::cout <<
"FEAT_COMPILER_MICROSOFT.......: -N/A-\n";
189#ifdef FEAT_DEBUG_MODE
190 std::cout <<
"FEAT_DEBUG_MODE...............: yes\n";
192 std::cout <<
"FEAT_DEBUG_MODE...............: no\n";
195 std::cout <<
"FEAT_EICKT....................: yes\n";
197 std::cout <<
"FEAT_EICKT....................: no\n";
200 std::cout <<
"FEAT_INDEX_U32................: yes\n";
202 std::cout <<
"FEAT_INDEX_U32................: no\n";
204#ifdef FEAT_MPI_THREAD_MULTIPLE
205 std::cout <<
"FEAT_MPI_THREAD_MULTIPLE......: yes\n";
207 std::cout <<
"FEAT_MPI_THREAD_MULTIPLE......: no\n";
210 std::cout <<
"FEAT_NO_CONFIG................: yes\n";
212 std::cout <<
"FEAT_NO_CONFIG................: no\n";
214#ifdef FEAT_OVERRIDE_MPI_OPS
215 std::cout <<
"FEAT_OVERRIDE_MPI_OPS.........: yes\n";
217 std::cout <<
"FEAT_OVERRIDE_MPI_OPS.........: no\n";
219#ifdef FEAT_USE_MKL_SPARSE_EXECUTOR
220 std::cout <<
"FEAT_USE_MKL_SPARSE_EXECUTOR..: yes\n";
222 std::cout <<
"FEAT_USE_MKL_SPARSE_EXECUTOR..: no\n";
224#ifdef FEAT_UNROLL_BANDED
225 std::cout <<
"FEAT_UNROLL_BANDED............: yes\n";
227 std::cout <<
"FEAT_UNROLL_BANDED............: no\n";
229#ifdef FEAT_HAVE_ALGLIB
230 std::cout <<
"FEAT_HAVE_ALGLIB..............: yes\n";
232 std::cout <<
"FEAT_HAVE_ALGLIB..............: no\n";
234#ifdef FEAT_HAVE_BOOST
235 std::cout <<
"FEAT_HAVE_BOOST...............: yes\n";
237 std::cout <<
"FEAT_HAVE_BOOST...............: no\n";
240 std::cout <<
"FEAT_HAVE_CGAL................: yes\n";
242 std::cout <<
"FEAT_HAVE_CGAL................: no\n";
245 std::cout <<
"FEAT_HAVE_CUDA................: yes\n";
247 std::cout <<
"FEAT_HAVE_CUDA................: no\n";
249#ifdef FEAT_HAVE_CUDSS
250 std::cout <<
"FEAT_HAVE_CUDSS...............: yes\n";
252 std::cout <<
"FEAT_HAVE_CUDSS...............: no\n";
254#ifdef FEAT_HAVE_DEATH_HANDLER
255 std::cout <<
"FEAT_HAVE_DEATH_HANDLER.......: yes\n";
257 std::cout <<
"FEAT_HAVE_DEATH_HANDLER.......: no\n";
259#ifdef FEAT_HAVE_FPARSER
260 std::cout <<
"FEAT_HAVE_FPARSER.............: yes\n";
262 std::cout <<
"FEAT_HAVE_FPARSER.............: no\n";
264#ifdef FEAT_HAVE_FLOATX
265 std::cout <<
"FEAT_HAVE_FLOATX..............: yes\n";
267 std::cout <<
"FEAT_HAVE_FLOATX..............: no\n";
269#ifdef FEAT_HAVE_HALFMATH
270 std::cout <<
"FEAT_HAVE_HALFMATH............: yes\n";
272 std::cout <<
"FEAT_HAVE_HALFMATH............: no\n";
274#ifdef FEAT_HAVE_HYPRE
275 std::cout <<
"FEAT_HAVE_HYPRE...............: yes\n";
277 std::cout <<
"FEAT_HAVE_HYPRE...............: no\n";
279#ifdef FEAT_HAVE_METIS
280 std::cout <<
"FEAT_HAVE_METIS...............: yes\n";
282 std::cout <<
"FEAT_HAVE_METIS...............: no\n";
285 std::cout <<
"FEAT_HAVE_MKL.................: yes\n";
287 std::cout <<
"FEAT_HAVE_MKL.................: no\n";
290 std::cout <<
"FEAT_HAVE_MPI.................: yes\n";
292 std::cout <<
"FEAT_HAVE_MPI.................: no\n";
295 std::cout <<
"FEAT_HAVE_OMP.................: yes\n";
297 std::cout <<
"FEAT_HAVE_OMP.................: no\n";
299#ifdef FEAT_HAVE_PARMETIS
300 std::cout <<
"FEAT_HAVE_PARMETIS............: yes\n";
302 std::cout <<
"FEAT_HAVE_PARMETIS............: no\n";
305 std::cout <<
"FEAT_HAVE_PMP.................: yes\n";
307 std::cout <<
"FEAT_HAVE_PMP.................: no\n";
309#ifdef FEAT_HAVE_QUADMATH
310 std::cout <<
"FEAT_HAVE_QUADMATH............: yes\n";
312 std::cout <<
"FEAT_HAVE_QUADMATH............: no\n";
314#ifdef FEAT_HAVE_SUITESPARSE
315 std::cout <<
"FEAT_HAVE_SUITESPARSE.........: yes\n";
317 std::cout <<
"FEAT_HAVE_SUITESPARSE.........: no\n";
319#ifdef FEAT_HAVE_SUPERLU_DIST
320 std::cout <<
"FEAT_HAVE_SUPERLU_DIST........: yes\n";
322 std::cout <<
"FEAT_HAVE_SUPERLU_DIST........: no\n";
324#ifdef FEAT_HAVE_TRIANGLE
325 std::cout <<
"FEAT_HAVE_TRIANGLE............: yes\n";
327 std::cout <<
"FEAT_HAVE_TRIANGLE............: no\n";
329#ifdef FEAT_HAVE_TRILINOS
330 std::cout <<
"FEAT_HAVE_TRILINOS............: yes\n";
332 std::cout <<
"FEAT_HAVE_TRILINOS............: no\n";
334#ifdef FEAT_HAVE_UMFPACK
335 std::cout <<
"FEAT_HAVE_UMFPACK.............: yes\n";
337 std::cout <<
"FEAT_HAVE_UMFPACK.............: no\n";
340 std::cout <<
"FEAT_HAVE_ZFP.................: yes\n";
342 std::cout <<
"FEAT_HAVE_ZFP.................: no\n";
345 std::cout <<
"FEAT_HAVE_ZLIB................: yes\n";
347 std::cout <<
"FEAT_HAVE_ZLIB................: no\n";
349#ifdef FEAT_HAVE_ZOLTAN
350 std::cout <<
"FEAT_HAVE_ZOLTAN..............: yes\n";
352 std::cout <<
"FEAT_HAVE_ZOLTAN..............: no\n";
354 std::cout <<
"--- END OF FEAT BUILD INFORMATION ---\n";
359 if(strcmp(argv[iarg],
"---print-pid") == 0)
364#elif defined(__linux) || defined(__unix__)
365 std::cout <<
"Process ID " << std::setw(6) << getpid() <<
" runs rank " << my_rank <<
"\n";
370#elif defined(__linux) || defined(__unix__)
371 std::cout <<
"Process ID " << std::setw(6) << getpid() <<
"\n";
377#ifdef FEAT_COMPILER_MICROSOFT
378 if(strcmp(argv[iarg],
"---debug-break") == 0)
382 for(++iarg; iarg < argc; ++iarg)
384 char* endptr =
nullptr;
385 int irank = int(std::strtol(argv[iarg], &endptr, 0));
386 if((endptr != argv[iarg]) && (*endptr ==
'\0'))
410 SyncGuard::sync_on =
true;
417#if defined(__linux) || defined(__unix__)
418#if defined(FEAT_HAVE_DEATH_HANDLER) and not defined(FEAT_HAVE_MPI)
419 Debug::DeathHandler death_handler;
423 auto bt_size = backtrace(buffer, 1024);
424 char** bt_symb = backtrace_symbols(buffer, bt_size);
425 if((bt_size > 0) && (bt_symb !=
nullptr))
427 fprintf(stderr,
"\nCall-Stack Back-Trace:\n");
428 fprintf(stderr,
"----------------------\n");
429 for(
decltype(bt_size) i(0); i < bt_size; ++i)
430 fprintf(stderr,
"%s\n", bt_symb[i]);
440 ::MPI_Abort(MPI_COMM_WORLD, 1);
449 std::cerr <<
"ERROR: Runtime::finalize called before Runtime::initialize!\n";
455 std::cerr <<
"ERROR: Runtime::finalize called twice!\n";
462#ifdef FEAT_HAVE_CUDSS
463 cudssDestroy(feat_cudss_handle);
467 Util::cuda_finalize();
479#if defined(FEAT_HAVE_CUDA) && defined(FEAT_FINALIZE_RESETS_DEVICE)
480 Util::cuda_reset_device();
490#ifdef FEAT_HAVE_CUDSS
491 return feat_cudss_handle;
int rank() const
Returns the rank of this process in this communicator.
static Comm world()
Returns a copy of the world communicator.
static void initialize()
Setup memory pools.
static void finalize()
Shutdown memory pool and clean up allocated memory pools.
static int finalize()
FEAT finalization.
static bool _finalized
signals, if finalize was called
static void * get_cudss_handle()
Returns the unique cuDSS third-party library handle.
static bool _initialized
signals, if initialize was called
static void initialize(int &argc, char **&argv)
FEAT initialization.
static void abort(bool dump_call_stack=true)
FEAT abortion.
#define FEAT_MARKER_INIT
Init the marker api.
#define FEAT_MARKER_CLOSE
Finalize marker api, writes data to file, only call once.
bool initialize(int &argc, char **&argv)
Initializes the distributed communication system.
void finalize()
Finalizes the distributed communication system.
void install_seh_filter()
Installs custom Windows Structured-Exception-Handler filter.
void dump_call_stack_to_stderr()
Dumps the call-stack to stderr.
void disable_error_prompts()
Disables Windows error dialog boxes.
unsigned long get_current_process_id()
Returns the Windows process ID for the current process.
static constexpr int version_major
FEAT major version number.
static constexpr int version_patch
FEAT patch version number.
static constexpr int version_minor
FEAT minor version number.