Remove xgboost's thread_local and switch to dmlc::ThreadLocalStore (#2121)
* Remove xgboost's own version of thread_local and switch to dmlc::ThreadLocalStore (#2109) * Update dmlc-core
This commit is contained in:
parent
14fba01b5a
commit
d45cf240a9
@ -1 +1 @@
|
|||||||
Subproject commit 2b75a0ce6f191ad0fcb5319039b41e990968542a
|
Subproject commit b5bec5481df86e8e6728d8bd80a61d87ef3b2cd5
|
||||||
@ -4,6 +4,7 @@
|
|||||||
#include <xgboost/learner.h>
|
#include <xgboost/learner.h>
|
||||||
#include <xgboost/c_api.h>
|
#include <xgboost/c_api.h>
|
||||||
#include <xgboost/logging.h>
|
#include <xgboost/logging.h>
|
||||||
|
#include <dmlc/thread_local.h>
|
||||||
#include <rabit/rabit.h>
|
#include <rabit/rabit.h>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -13,7 +14,6 @@
|
|||||||
|
|
||||||
#include "./c_api_error.h"
|
#include "./c_api_error.h"
|
||||||
#include "../data/simple_csr_source.h"
|
#include "../data/simple_csr_source.h"
|
||||||
#include "../common/thread_local.h"
|
|
||||||
#include "../common/math.h"
|
#include "../common/math.h"
|
||||||
#include "../common/io.h"
|
#include "../common/io.h"
|
||||||
#include "../common/group_data.h"
|
#include "../common/group_data.h"
|
||||||
@ -197,7 +197,7 @@ struct XGBAPIThreadLocalEntry {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// define the threadlocal store.
|
// define the threadlocal store.
|
||||||
typedef xgboost::common::ThreadLocalStore<XGBAPIThreadLocalEntry> XGBAPIThreadLocalStore;
|
typedef dmlc::ThreadLocalStore<XGBAPIThreadLocalEntry> XGBAPIThreadLocalStore;
|
||||||
|
|
||||||
int XGDMatrixCreateFromFile(const char *fname,
|
int XGDMatrixCreateFromFile(const char *fname,
|
||||||
int silent,
|
int silent,
|
||||||
|
|||||||
@ -3,14 +3,14 @@
|
|||||||
* \file c_api_error.cc
|
* \file c_api_error.cc
|
||||||
* \brief C error handling
|
* \brief C error handling
|
||||||
*/
|
*/
|
||||||
|
#include <dmlc/thread_local.h>
|
||||||
#include "./c_api_error.h"
|
#include "./c_api_error.h"
|
||||||
#include "../common/thread_local.h"
|
|
||||||
|
|
||||||
struct XGBAPIErrorEntry {
|
struct XGBAPIErrorEntry {
|
||||||
std::string last_error;
|
std::string last_error;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef xgboost::common::ThreadLocalStore<XGBAPIErrorEntry> XGBAPIErrorStore;
|
typedef dmlc::ThreadLocalStore<XGBAPIErrorEntry> XGBAPIErrorStore;
|
||||||
|
|
||||||
const char *XGBGetLastError() {
|
const char *XGBGetLastError() {
|
||||||
return XGBAPIErrorStore::Get()->last_error.c_str();
|
return XGBAPIErrorStore::Get()->last_error.c_str();
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* \file common.cc
|
* \file common.cc
|
||||||
* \brief Enable all kinds of global variables in common.
|
* \brief Enable all kinds of global variables in common.
|
||||||
*/
|
*/
|
||||||
|
#include <dmlc/thread_local.h>
|
||||||
#include "./random.h"
|
#include "./random.h"
|
||||||
#include "./thread_local.h"
|
|
||||||
|
|
||||||
namespace xgboost {
|
namespace xgboost {
|
||||||
namespace common {
|
namespace common {
|
||||||
@ -14,7 +14,7 @@ struct RandomThreadLocalEntry {
|
|||||||
GlobalRandomEngine engine;
|
GlobalRandomEngine engine;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef ThreadLocalStore<RandomThreadLocalEntry> RandomThreadLocalStore;
|
typedef dmlc::ThreadLocalStore<RandomThreadLocalEntry> RandomThreadLocalStore;
|
||||||
|
|
||||||
GlobalRandomEngine& GlobalRandom() {
|
GlobalRandomEngine& GlobalRandom() {
|
||||||
return RandomThreadLocalStore::Get()->engine;
|
return RandomThreadLocalStore::Get()->engine;
|
||||||
|
|||||||
@ -1,91 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Copyright (c) 2015 by Contributors
|
|
||||||
* \file thread_local.h
|
|
||||||
* \brief Common utility for thread local storage.
|
|
||||||
*/
|
|
||||||
#ifndef XGBOOST_COMMON_THREAD_LOCAL_H_
|
|
||||||
#define XGBOOST_COMMON_THREAD_LOCAL_H_
|
|
||||||
|
|
||||||
#include <dmlc/base.h>
|
|
||||||
|
|
||||||
#if DMLC_ENABLE_STD_THREAD
|
|
||||||
#include <mutex>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace xgboost {
|
|
||||||
namespace common {
|
|
||||||
|
|
||||||
// macro hanlding for threadlocal variables
|
|
||||||
#ifdef __sun
|
|
||||||
#define MX_TREAD_LOCAL
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
#define MX_TREAD_LOCAL __thread
|
|
||||||
#elif __STDC_VERSION__ >= 201112L
|
|
||||||
#define MX_TREAD_LOCAL _Thread_local
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define MX_TREAD_LOCAL __declspec(thread)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MX_TREAD_LOCAL
|
|
||||||
#message("Warning: Threadlocal is not enabled");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief A threadlocal store to store threadlocal variables.
|
|
||||||
* Will return a thread local singleton of type T
|
|
||||||
* \tparam T the type we like to store
|
|
||||||
*/
|
|
||||||
template<typename T>
|
|
||||||
class ThreadLocalStore {
|
|
||||||
public:
|
|
||||||
/*! \return get a thread local singleton */
|
|
||||||
static T* Get() {
|
|
||||||
static MX_TREAD_LOCAL T* ptr = nullptr;
|
|
||||||
if (ptr == nullptr) {
|
|
||||||
ptr = new T();
|
|
||||||
Singleton()->RegisterDelete(ptr);
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
/*! \brief constructor */
|
|
||||||
ThreadLocalStore() {}
|
|
||||||
/*! \brief destructor */
|
|
||||||
~ThreadLocalStore() {
|
|
||||||
for (size_t i = 0; i < data_.size(); ++i) {
|
|
||||||
delete data_[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*! \return singleton of the store */
|
|
||||||
static ThreadLocalStore<T> *Singleton() {
|
|
||||||
static ThreadLocalStore<T> inst;
|
|
||||||
return &inst;
|
|
||||||
}
|
|
||||||
/*!
|
|
||||||
* \brief register str for internal deletion
|
|
||||||
* \param str the string pointer
|
|
||||||
*/
|
|
||||||
void RegisterDelete(T *str) {
|
|
||||||
#if DMLC_ENABLE_STD_THREAD
|
|
||||||
std::unique_lock<std::mutex> lock(mutex_);
|
|
||||||
data_.push_back(str);
|
|
||||||
lock.unlock();
|
|
||||||
#else
|
|
||||||
data_.push_back(str);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if DMLC_ENABLE_STD_THREAD
|
|
||||||
/*! \brief internal mutex */
|
|
||||||
std::mutex mutex_;
|
|
||||||
#endif
|
|
||||||
/*!\brief internal data */
|
|
||||||
std::vector<T*> data_;
|
|
||||||
};
|
|
||||||
} // namespace common
|
|
||||||
} // namespace xgboost
|
|
||||||
#endif // XGBOOST_COMMON_THREAD_LOCAL_H_
|
|
||||||
Loading…
x
Reference in New Issue
Block a user