parent
05941a5f96
commit
0101a4719c
1
.gitignore
vendored
1
.gitignore
vendored
@ -33,7 +33,6 @@
|
|||||||
*tmp*
|
*tmp*
|
||||||
*.rabit
|
*.rabit
|
||||||
*.mock
|
*.mock
|
||||||
dmlc-core
|
|
||||||
recommonmark
|
recommonmark
|
||||||
recom
|
recom
|
||||||
_*
|
_*
|
||||||
|
|||||||
@ -24,11 +24,11 @@ if(RABIT_BUILD_TESTS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
foreach(lib ${rabit_libs})
|
foreach(lib ${rabit_libs})
|
||||||
#include "./internal/utils.h"
|
#include "./internal/utils.h"
|
||||||
target_include_directories(${lib} PUBLIC
|
target_include_directories(${lib} PUBLIC
|
||||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/rabit>"
|
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/rabit>"
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
if(RABIT_BUILD_TESTS)
|
if(RABIT_BUILD_TESTS)
|
||||||
@ -42,7 +42,7 @@ if(RABIT_BUILD_TESTS)
|
|||||||
if(RABIT_BUILD_MPI)
|
if(RABIT_BUILD_MPI)
|
||||||
add_executable(speed_test_mpi test/speed_test.cc)
|
add_executable(speed_test_mpi test/speed_test.cc)
|
||||||
target_link_libraries(speed_test_mpi rabit_mpi)
|
target_link_libraries(speed_test_mpi rabit_mpi)
|
||||||
install(TARGETS speed_test_mpi DESTINATION bin)
|
install(TARGETS speed_test_mpi DESTINATION bin)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
2
Makefile
2
Makefile
@ -82,7 +82,7 @@ lib/librabit_empty.a: $(BPATH)/engine_empty.o $(BPATH)/c_api.o
|
|||||||
lib/librabit_mpi.a lib/librabit_mpi.so: $(MPIOBJ)
|
lib/librabit_mpi.a lib/librabit_mpi.so: $(MPIOBJ)
|
||||||
|
|
||||||
$(OBJ) :
|
$(OBJ) :
|
||||||
$(CXX) -c $(CFLAGS) -o $@ $(firstword $(filter %.cpp %.c %.cc, $^) )
|
$(CXX) -c $(CFLAGS) -o $@ $(firstword $(filter %.cpp %.c %.cc, $^) ) -I include/
|
||||||
|
|
||||||
$(MPIOBJ) :
|
$(MPIOBJ) :
|
||||||
$(MPICXX) -c $(CFLAGS) -o $@ $(firstword $(filter %.cpp %.c %.cc, $^) )
|
$(MPICXX) -c $(CFLAGS) -o $@ $(firstword $(filter %.cpp %.c %.cc, $^) )
|
||||||
|
|||||||
@ -11,7 +11,8 @@
|
|||||||
#include <istream>
|
#include <istream>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <streambuf>
|
#include <streambuf>
|
||||||
#include "./logging.h"
|
|
||||||
|
#include "dmlc/base.h"
|
||||||
|
|
||||||
// include uint64_t only to make io standalone
|
// include uint64_t only to make io standalone
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
|||||||
@ -1,327 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Copyright (c) 2015 by Contributors
|
|
||||||
* \file logging.h
|
|
||||||
* \brief defines logging macros of dmlc
|
|
||||||
* allows use of GLOG, fall back to internal
|
|
||||||
* implementation when disabled
|
|
||||||
*/
|
|
||||||
#ifndef DMLC_LOGGING_H_
|
|
||||||
#define DMLC_LOGGING_H_
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include "./base.h"
|
|
||||||
|
|
||||||
#if DMLC_LOG_STACK_TRACE
|
|
||||||
#include <execinfo.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace dmlc {
|
|
||||||
/*!
|
|
||||||
* \brief exception class that will be thrown by
|
|
||||||
* default logger if DMLC_LOG_FATAL_THROW == 1
|
|
||||||
*/
|
|
||||||
struct Error : public std::runtime_error {
|
|
||||||
/*!
|
|
||||||
* \brief constructor
|
|
||||||
* \param s the error message
|
|
||||||
*/
|
|
||||||
explicit Error(const std::string &s) : std::runtime_error(s) {}
|
|
||||||
};
|
|
||||||
} // namespace dmlc
|
|
||||||
|
|
||||||
#if DMLC_USE_GLOG
|
|
||||||
#include <glog/logging.h>
|
|
||||||
|
|
||||||
namespace dmlc {
|
|
||||||
/*!
|
|
||||||
* \brief optionally redirect to google's init log
|
|
||||||
* \param argv0 The arguments.
|
|
||||||
*/
|
|
||||||
inline void InitLogging(const char* argv0) {
|
|
||||||
google::InitGoogleLogging(argv0);
|
|
||||||
}
|
|
||||||
} // namespace dmlc
|
|
||||||
|
|
||||||
#else
|
|
||||||
// use a light version of glog
|
|
||||||
#include <assert.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <ctime>
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma warning(disable : 4722)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace dmlc {
|
|
||||||
inline void InitLogging(const char*) {
|
|
||||||
// DO NOTHING
|
|
||||||
}
|
|
||||||
|
|
||||||
class LogCheckError {
|
|
||||||
public:
|
|
||||||
LogCheckError() : str(nullptr) {}
|
|
||||||
explicit LogCheckError(const std::string& str_) : str(new std::string(str_)) {}
|
|
||||||
~LogCheckError() { if (str != nullptr) delete str; }
|
|
||||||
operator bool() {return str != nullptr; }
|
|
||||||
std::string* str;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DEFINE_CHECK_FUNC(name, op) \
|
|
||||||
template <typename X, typename Y> \
|
|
||||||
inline LogCheckError LogCheck##name(const X& x, const Y& y) { \
|
|
||||||
if (x op y) return LogCheckError(); \
|
|
||||||
std::ostringstream os; \
|
|
||||||
os << " (" << x << " vs. " << y << ") "; /* CHECK_XX(x, y) requires x and y can be serialized to string. Use CHECK(x OP y) otherwise. NOLINT(*) */ \
|
|
||||||
return LogCheckError(os.str()); \
|
|
||||||
} \
|
|
||||||
inline LogCheckError LogCheck##name(int x, int y) { \
|
|
||||||
return LogCheck##name<int, int>(x, y); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CHECK_BINARY_OP(name, op, x, y) \
|
|
||||||
if (dmlc::LogCheckError _check_err = dmlc::LogCheck##name(x, y)) \
|
|
||||||
dmlc::LogMessageFatal(__FILE__, __LINE__).stream() \
|
|
||||||
<< "Check failed: " << #x " " #op " " #y << *(_check_err.str)
|
|
||||||
|
|
||||||
DEFINE_CHECK_FUNC(_LT, <)
|
|
||||||
DEFINE_CHECK_FUNC(_GT, >)
|
|
||||||
DEFINE_CHECK_FUNC(_LE, <=)
|
|
||||||
DEFINE_CHECK_FUNC(_GE, >=)
|
|
||||||
DEFINE_CHECK_FUNC(_EQ, ==)
|
|
||||||
DEFINE_CHECK_FUNC(_NE, !=)
|
|
||||||
|
|
||||||
// Always-on checking
|
|
||||||
#define CHECK(x) \
|
|
||||||
if (!(x)) \
|
|
||||||
dmlc::LogMessageFatal(__FILE__, __LINE__).stream() \
|
|
||||||
<< "Check failed: " #x << ' '
|
|
||||||
#define CHECK_LT(x, y) CHECK_BINARY_OP(_LT, <, x, y)
|
|
||||||
#define CHECK_GT(x, y) CHECK_BINARY_OP(_GT, >, x, y)
|
|
||||||
#define CHECK_LE(x, y) CHECK_BINARY_OP(_LE, <=, x, y)
|
|
||||||
#define CHECK_GE(x, y) CHECK_BINARY_OP(_GE, >=, x, y)
|
|
||||||
#define CHECK_EQ(x, y) CHECK_BINARY_OP(_EQ, ==, x, y)
|
|
||||||
#define CHECK_NE(x, y) CHECK_BINARY_OP(_NE, !=, x, y)
|
|
||||||
#define CHECK_NOTNULL(x) \
|
|
||||||
((x) == NULL ? dmlc::LogMessageFatal(__FILE__, __LINE__).stream() << "Check notnull: " #x << ' ', (x) : (x)) // NOLINT(*)
|
|
||||||
// Debug-only checking.
|
|
||||||
#ifdef NDEBUG
|
|
||||||
#define DCHECK(x) \
|
|
||||||
while (false) CHECK(x)
|
|
||||||
#define DCHECK_LT(x, y) \
|
|
||||||
while (false) CHECK((x) < (y))
|
|
||||||
#define DCHECK_GT(x, y) \
|
|
||||||
while (false) CHECK((x) > (y))
|
|
||||||
#define DCHECK_LE(x, y) \
|
|
||||||
while (false) CHECK((x) <= (y))
|
|
||||||
#define DCHECK_GE(x, y) \
|
|
||||||
while (false) CHECK((x) >= (y))
|
|
||||||
#define DCHECK_EQ(x, y) \
|
|
||||||
while (false) CHECK((x) == (y))
|
|
||||||
#define DCHECK_NE(x, y) \
|
|
||||||
while (false) CHECK((x) != (y))
|
|
||||||
#else
|
|
||||||
#define DCHECK(x) CHECK(x)
|
|
||||||
#define DCHECK_LT(x, y) CHECK((x) < (y))
|
|
||||||
#define DCHECK_GT(x, y) CHECK((x) > (y))
|
|
||||||
#define DCHECK_LE(x, y) CHECK((x) <= (y))
|
|
||||||
#define DCHECK_GE(x, y) CHECK((x) >= (y))
|
|
||||||
#define DCHECK_EQ(x, y) CHECK((x) == (y))
|
|
||||||
#define DCHECK_NE(x, y) CHECK((x) != (y))
|
|
||||||
#endif // NDEBUG
|
|
||||||
|
|
||||||
#if DMLC_LOG_CUSTOMIZE
|
|
||||||
#define LOG_INFO dmlc::CustomLogMessage(__FILE__, __LINE__)
|
|
||||||
#else
|
|
||||||
#define LOG_INFO dmlc::LogMessage(__FILE__, __LINE__)
|
|
||||||
#endif
|
|
||||||
#define LOG_ERROR LOG_INFO
|
|
||||||
#define LOG_WARNING LOG_INFO
|
|
||||||
#define LOG_FATAL dmlc::LogMessageFatal(__FILE__, __LINE__)
|
|
||||||
#define LOG_QFATAL LOG_FATAL
|
|
||||||
|
|
||||||
// Poor man version of VLOG
|
|
||||||
#define VLOG(x) LOG_INFO.stream()
|
|
||||||
|
|
||||||
#define LOG(severity) LOG_##severity.stream()
|
|
||||||
#define LG LOG_INFO.stream()
|
|
||||||
#define LOG_IF(severity, condition) \
|
|
||||||
!(condition) ? (void)0 : dmlc::LogMessageVoidify() & LOG(severity)
|
|
||||||
|
|
||||||
#ifdef NDEBUG
|
|
||||||
#define LOG_DFATAL LOG_ERROR
|
|
||||||
#define DFATAL ERROR
|
|
||||||
#define DLOG(severity) true ? (void)0 : dmlc::LogMessageVoidify() & LOG(severity)
|
|
||||||
#define DLOG_IF(severity, condition) \
|
|
||||||
(true || !(condition)) ? (void)0 : dmlc::LogMessageVoidify() & LOG(severity)
|
|
||||||
#else
|
|
||||||
#define LOG_DFATAL LOG_FATAL
|
|
||||||
#define DFATAL FATAL
|
|
||||||
#define DLOG(severity) LOG(severity)
|
|
||||||
#define DLOG_IF(severity, condition) LOG_IF(severity, condition)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Poor man version of LOG_EVERY_N
|
|
||||||
#define LOG_EVERY_N(severity, n) LOG(severity)
|
|
||||||
|
|
||||||
class DateLogger {
|
|
||||||
public:
|
|
||||||
DateLogger() {
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
_tzset();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
const char* HumanDate() {
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
_strtime_s(buffer_, sizeof(buffer_));
|
|
||||||
#else
|
|
||||||
time_t time_value = time(NULL);
|
|
||||||
struct tm *pnow;
|
|
||||||
#if !defined(_WIN32)
|
|
||||||
struct tm now;
|
|
||||||
pnow = localtime_r(&time_value, &now);
|
|
||||||
#else
|
|
||||||
pnow = localtime(&time_value); // NOLINT(*)
|
|
||||||
#endif
|
|
||||||
snprintf(buffer_, sizeof(buffer_), "%02d:%02d:%02d",
|
|
||||||
pnow->tm_hour, pnow->tm_min, pnow->tm_sec);
|
|
||||||
#endif
|
|
||||||
return buffer_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
char buffer_[9];
|
|
||||||
};
|
|
||||||
|
|
||||||
class LogMessage {
|
|
||||||
public:
|
|
||||||
LogMessage(const char* file, int line)
|
|
||||||
:
|
|
||||||
#ifdef __ANDROID__
|
|
||||||
log_stream_(std::cout)
|
|
||||||
#else
|
|
||||||
log_stream_(std::cerr)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
log_stream_ << "[" << pretty_date_.HumanDate() << "] " << file << ":"
|
|
||||||
<< line << ": ";
|
|
||||||
}
|
|
||||||
~LogMessage() { log_stream_ << '\n'; }
|
|
||||||
std::ostream& stream() { return log_stream_; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::ostream& log_stream_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
DateLogger pretty_date_;
|
|
||||||
LogMessage(const LogMessage&);
|
|
||||||
void operator=(const LogMessage&);
|
|
||||||
};
|
|
||||||
|
|
||||||
// customized logger that can allow user to define where to log the message.
|
|
||||||
class CustomLogMessage {
|
|
||||||
public:
|
|
||||||
CustomLogMessage(const char* file, int line) {
|
|
||||||
log_stream_ << "[" << DateLogger().HumanDate() << "] " << file << ":"
|
|
||||||
<< line << ": ";
|
|
||||||
}
|
|
||||||
~CustomLogMessage() {
|
|
||||||
Log(log_stream_.str());
|
|
||||||
}
|
|
||||||
std::ostream& stream() { return log_stream_; }
|
|
||||||
/*!
|
|
||||||
* \brief customized logging of the message.
|
|
||||||
* This function won't be implemented by libdmlc
|
|
||||||
* \param msg The message to be logged.
|
|
||||||
*/
|
|
||||||
static void Log(const std::string& msg);
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::ostringstream log_stream_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if DMLC_LOG_FATAL_THROW == 0
|
|
||||||
class LogMessageFatal : public LogMessage {
|
|
||||||
public:
|
|
||||||
LogMessageFatal(const char* file, int line) : LogMessage(file, line) {}
|
|
||||||
~LogMessageFatal() {
|
|
||||||
#if DMLC_LOG_STACK_TRACE
|
|
||||||
const int MAX_STACK_SIZE = 10;
|
|
||||||
void *stack[MAX_STACK_SIZE];
|
|
||||||
|
|
||||||
int nframes = backtrace(stack, MAX_STACK_SIZE);
|
|
||||||
log_stream_ << "\n\n" << "Stack trace returned " << nframes << " entries:\n";
|
|
||||||
char **msgs = backtrace_symbols(stack, nframes);
|
|
||||||
if (msgs != nullptr) {
|
|
||||||
for (int i = 0; i < nframes; ++i) {
|
|
||||||
log_stream_ << "[bt] (" << i << ") " << msgs[i] << "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
log_stream_ << "\n";
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
LogMessageFatal(const LogMessageFatal&);
|
|
||||||
void operator=(const LogMessageFatal&);
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
class LogMessageFatal {
|
|
||||||
public:
|
|
||||||
LogMessageFatal(const char* file, int line) {
|
|
||||||
log_stream_ << "[" << pretty_date_.HumanDate() << "] " << file << ":"
|
|
||||||
<< line << ": ";
|
|
||||||
}
|
|
||||||
std::ostringstream &stream() { return log_stream_; }
|
|
||||||
~LogMessageFatal() DMLC_THROW_EXCEPTION {
|
|
||||||
#if DMLC_LOG_STACK_TRACE
|
|
||||||
const int MAX_STACK_SIZE = 10;
|
|
||||||
void *stack[MAX_STACK_SIZE];
|
|
||||||
|
|
||||||
int nframes = backtrace(stack, MAX_STACK_SIZE);
|
|
||||||
log_stream_ << "\n\n" << "Stack trace returned " << nframes << " entries:\n";
|
|
||||||
char **msgs = backtrace_symbols(stack, nframes);
|
|
||||||
if (msgs != nullptr) {
|
|
||||||
for (int i = 0; i < nframes; ++i) {
|
|
||||||
log_stream_ << "[bt] (" << i << ") " << msgs[i] << "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// throwing out of destructor is evil
|
|
||||||
// hopefully we can do it here
|
|
||||||
// also log the message before throw
|
|
||||||
#if DMLC_LOG_BEFORE_THROW
|
|
||||||
LOG(ERROR) << log_stream_.str();
|
|
||||||
#endif
|
|
||||||
throw Error(log_stream_.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::ostringstream log_stream_;
|
|
||||||
DateLogger pretty_date_;
|
|
||||||
LogMessageFatal(const LogMessageFatal&);
|
|
||||||
void operator=(const LogMessageFatal&);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// This class is used to explicitly ignore values in the conditional
|
|
||||||
// logging macros. This avoids compiler warnings like "value computed
|
|
||||||
// is not used" and "statement has no effect".
|
|
||||||
class LogMessageVoidify {
|
|
||||||
public:
|
|
||||||
LogMessageVoidify() {}
|
|
||||||
// This has to be an operator with a precedence lower than << but
|
|
||||||
// higher than "?:". See its usage.
|
|
||||||
void operator&(std::ostream&) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace dmlc
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif // DMLC_LOGGING_H_
|
|
||||||
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
#include "./base.h"
|
#include "./base.h"
|
||||||
#include "./io.h"
|
#include "./io.h"
|
||||||
#include "./logging.h"
|
|
||||||
#include "./type_traits.h"
|
#include "./type_traits.h"
|
||||||
|
|
||||||
#if DMLC_USE_CXX11
|
#if DMLC_USE_CXX11
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "./internal/utils.h"
|
#include "./internal/utils.h"
|
||||||
#include "../dmlc/io.h"
|
#include "dmlc/io.h"
|
||||||
|
|
||||||
namespace rabit {
|
namespace rabit {
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user