Unverified Commit 78d021c1 authored by david-cortes's avatar david-cortes Committed by GitHub
Browse files

[R-package] Remove non-beneficial parallelization (#6209)

parent 6aea578b
...@@ -224,17 +224,19 @@ SEXP LGBM_DatasetGetSubset_R(SEXP handle, ...@@ -224,17 +224,19 @@ SEXP LGBM_DatasetGetSubset_R(SEXP handle,
_AssertDatasetHandleNotNull(handle); _AssertDatasetHandleNotNull(handle);
SEXP ret = PROTECT(R_MakeExternalPtr(nullptr, R_NilValue, R_NilValue)); SEXP ret = PROTECT(R_MakeExternalPtr(nullptr, R_NilValue, R_NilValue));
int32_t len = static_cast<int32_t>(Rf_asInteger(len_used_row_indices)); int32_t len = static_cast<int32_t>(Rf_asInteger(len_used_row_indices));
std::vector<int32_t> idxvec(len); std::unique_ptr<int32_t[]> idxvec(new int32_t[len]);
// convert from one-based to zero-based index // convert from one-based to zero-based index
const int *used_row_indices_ = INTEGER(used_row_indices); const int *used_row_indices_ = INTEGER(used_row_indices);
#pragma omp parallel for num_threads(OMP_NUM_THREADS()) schedule(static, 512) if (len >= 1024) #ifndef _MSC_VER
#pragma omp simd
#endif
for (int32_t i = 0; i < len; ++i) { for (int32_t i = 0; i < len; ++i) {
idxvec[i] = static_cast<int32_t>(used_row_indices_[i] - 1); idxvec[i] = static_cast<int32_t>(used_row_indices_[i] - 1);
} }
const char* parameters_ptr = CHAR(PROTECT(Rf_asChar(parameters))); const char* parameters_ptr = CHAR(PROTECT(Rf_asChar(parameters)));
DatasetHandle res = nullptr; DatasetHandle res = nullptr;
CHECK_CALL(LGBM_DatasetGetSubset(R_ExternalPtrAddr(handle), CHECK_CALL(LGBM_DatasetGetSubset(R_ExternalPtrAddr(handle),
idxvec.data(), len, parameters_ptr, idxvec.get(), len, parameters_ptr,
&res)); &res));
R_SetExternalPtrAddr(ret, res); R_SetExternalPtrAddr(ret, res);
R_RegisterCFinalizerEx(ret, _DatasetFinalizer, TRUE); R_RegisterCFinalizerEx(ret, _DatasetFinalizer, TRUE);
...@@ -248,13 +250,13 @@ SEXP LGBM_DatasetSetFeatureNames_R(SEXP handle, ...@@ -248,13 +250,13 @@ SEXP LGBM_DatasetSetFeatureNames_R(SEXP handle,
R_API_BEGIN(); R_API_BEGIN();
_AssertDatasetHandleNotNull(handle); _AssertDatasetHandleNotNull(handle);
auto vec_names = Split(CHAR(PROTECT(Rf_asChar(feature_names))), '\t'); auto vec_names = Split(CHAR(PROTECT(Rf_asChar(feature_names))), '\t');
std::vector<const char*> vec_sptr;
int len = static_cast<int>(vec_names.size()); int len = static_cast<int>(vec_names.size());
std::unique_ptr<const char*[]> vec_sptr(new const char*[len]);
for (int i = 0; i < len; ++i) { for (int i = 0; i < len; ++i) {
vec_sptr.push_back(vec_names[i].c_str()); vec_sptr[i] = vec_names[i].c_str();
} }
CHECK_CALL(LGBM_DatasetSetFeatureNames(R_ExternalPtrAddr(handle), CHECK_CALL(LGBM_DatasetSetFeatureNames(R_ExternalPtrAddr(handle),
vec_sptr.data(), len)); vec_sptr.get(), len));
UNPROTECT(1); UNPROTECT(1);
return R_NilValue; return R_NilValue;
R_API_END(); R_API_END();
...@@ -339,23 +341,13 @@ SEXP LGBM_DatasetSetField_R(SEXP handle, ...@@ -339,23 +341,13 @@ SEXP LGBM_DatasetSetField_R(SEXP handle,
int len = Rf_asInteger(num_element); int len = Rf_asInteger(num_element);
const char* name = CHAR(PROTECT(Rf_asChar(field_name))); const char* name = CHAR(PROTECT(Rf_asChar(field_name)));
if (!strcmp("group", name) || !strcmp("query", name)) { if (!strcmp("group", name) || !strcmp("query", name)) {
std::vector<int32_t> vec(len); CHECK_CALL(LGBM_DatasetSetField(R_ExternalPtrAddr(handle), name, INTEGER(field_data), len, C_API_DTYPE_INT32));
const int *field_data_ = INTEGER(field_data);
#pragma omp parallel for num_threads(OMP_NUM_THREADS()) schedule(static, 512) if (len >= 1024)
for (int i = 0; i < len; ++i) {
vec[i] = static_cast<int32_t>(field_data_[i]);
}
CHECK_CALL(LGBM_DatasetSetField(R_ExternalPtrAddr(handle), name, vec.data(), len, C_API_DTYPE_INT32));
} else if (!strcmp("init_score", name)) { } else if (!strcmp("init_score", name)) {
CHECK_CALL(LGBM_DatasetSetField(R_ExternalPtrAddr(handle), name, REAL(field_data), len, C_API_DTYPE_FLOAT64)); CHECK_CALL(LGBM_DatasetSetField(R_ExternalPtrAddr(handle), name, REAL(field_data), len, C_API_DTYPE_FLOAT64));
} else { } else {
std::vector<float> vec(len); std::unique_ptr<float[]> vec(new float[len]);
const double *field_data_ = REAL(field_data); std::copy(REAL(field_data), REAL(field_data) + len, vec.get());
#pragma omp parallel for num_threads(OMP_NUM_THREADS()) schedule(static, 512) if (len >= 1024) CHECK_CALL(LGBM_DatasetSetField(R_ExternalPtrAddr(handle), name, vec.get(), len, C_API_DTYPE_FLOAT32));
for (int i = 0; i < len; ++i) {
vec[i] = static_cast<float>(field_data_[i]);
}
CHECK_CALL(LGBM_DatasetSetField(R_ExternalPtrAddr(handle), name, vec.data(), len, C_API_DTYPE_FLOAT32));
} }
UNPROTECT(1); UNPROTECT(1);
return R_NilValue; return R_NilValue;
...@@ -376,24 +368,18 @@ SEXP LGBM_DatasetGetField_R(SEXP handle, ...@@ -376,24 +368,18 @@ SEXP LGBM_DatasetGetField_R(SEXP handle,
auto p_data = reinterpret_cast<const int32_t*>(res); auto p_data = reinterpret_cast<const int32_t*>(res);
// convert from boundaries to size // convert from boundaries to size
int *field_data_ = INTEGER(field_data); int *field_data_ = INTEGER(field_data);
#pragma omp parallel for num_threads(OMP_NUM_THREADS()) schedule(static, 512) if (out_len >= 1024) #ifndef _MSC_VER
#pragma omp simd
#endif
for (int i = 0; i < out_len - 1; ++i) { for (int i = 0; i < out_len - 1; ++i) {
field_data_[i] = p_data[i + 1] - p_data[i]; field_data_[i] = p_data[i + 1] - p_data[i];
} }
} else if (!strcmp("init_score", name)) { } else if (!strcmp("init_score", name)) {
auto p_data = reinterpret_cast<const double*>(res); auto p_data = reinterpret_cast<const double*>(res);
double *field_data_ = REAL(field_data); std::copy(p_data, p_data + out_len, REAL(field_data));
#pragma omp parallel for num_threads(OMP_NUM_THREADS()) schedule(static, 512) if (out_len >= 1024)
for (int i = 0; i < out_len; ++i) {
field_data_[i] = p_data[i];
}
} else { } else {
auto p_data = reinterpret_cast<const float*>(res); auto p_data = reinterpret_cast<const float*>(res);
double *field_data_ = REAL(field_data); std::copy(p_data, p_data + out_len, REAL(field_data));
#pragma omp parallel for num_threads(OMP_NUM_THREADS()) schedule(static, 512) if (out_len >= 1024)
for (int i = 0; i < out_len; ++i) {
field_data_[i] = p_data[i];
}
} }
UNPROTECT(1); UNPROTECT(1);
return R_NilValue; return R_NilValue;
...@@ -616,15 +602,10 @@ SEXP LGBM_BoosterUpdateOneIterCustom_R(SEXP handle, ...@@ -616,15 +602,10 @@ SEXP LGBM_BoosterUpdateOneIterCustom_R(SEXP handle,
_AssertBoosterHandleNotNull(handle); _AssertBoosterHandleNotNull(handle);
int is_finished = 0; int is_finished = 0;
int int_len = Rf_asInteger(len); int int_len = Rf_asInteger(len);
std::vector<float> tgrad(int_len), thess(int_len); std::unique_ptr<float[]> tgrad(new float[int_len]), thess(new float[int_len]);
const double *grad_ = REAL(grad); std::copy(REAL(grad), REAL(grad) + int_len, tgrad.get());
const double *hess_ = REAL(hess); std::copy(REAL(hess), REAL(hess) + int_len, thess.get());
#pragma omp parallel for num_threads(OMP_NUM_THREADS()) schedule(static, 512) if (int_len >= 1024) CHECK_CALL(LGBM_BoosterUpdateOneIterCustom(R_ExternalPtrAddr(handle), tgrad.get(), thess.get(), &is_finished));
for (int j = 0; j < int_len; ++j) {
tgrad[j] = static_cast<float>(grad_[j]);
thess[j] = static_cast<float>(hess_[j]);
}
CHECK_CALL(LGBM_BoosterUpdateOneIterCustom(R_ExternalPtrAddr(handle), tgrad.data(), thess.data(), &is_finished));
return R_NilValue; return R_NilValue;
R_API_END(); R_API_END();
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment