#include #include #include #include #include #include #include #include #include #include "common/Utilities.h" #include "common/UnitTest.h" #ifdef USE_MPI #include "mpi.h" #endif // Function to return the call stack std::vector get_call_stack() { std::vector stack = Utilities::getCallStack(); // Trick compiler to skip inline for this function with fake recursion if ( stack.size() > 10000 ) { stack = get_call_stack(); } return stack; } // The main function int main(int argc, char *argv[]) { int rank = 0; #ifdef USE_MPI MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); #endif UnitTest ut; Utilities::setAbortBehavior( true, true, true ); // Test the memory usage double t0 = Utilities::time(); size_t n_bytes1 = Utilities::getMemoryUsage(); double time1 = Utilities::time() - t0; double *tmp = new double[0x100000]; NULL_USE(tmp); t0 = Utilities::time(); size_t n_bytes2 = Utilities::getMemoryUsage(); double time2 = Utilities::time() - t0; delete [] tmp; t0 = Utilities::time(); size_t n_bytes3 = Utilities::getMemoryUsage(); double time3 = Utilities::time() - t0; std::cout << "Number of bytes used for a basic test: " << n_bytes1 << ", " << n_bytes2 << ", " << n_bytes3 << std::endl; std::cout << " Time to query: " << time1*1e6 << " us, " << time2*1e6 << " us, " << time3*1e6 << " us" << std::endl; if ( n_bytes1==0 ) { ut.failure("getMemoryUsage returns 0"); } else { ut.passes("getMemoryUsage returns non-zero"); if ( n_bytes2>n_bytes1 ) ut.passes("getMemoryUsage increases size"); else ut.failure("getMemoryUsage increases size"); if ( n_bytes1==n_bytes3 ) ut.passes("getMemoryUsage decreases size properly"); else ut.expected_failure("getMemoryUsage does not decrease size properly"); } // Test getting the current call stack std::vector call_stack = get_call_stack(); if ( rank==0 ) { std::cout << "Call stack:" << std::endl; for (size_t i=0; i