MCPcopy Create free account
hub / github.com/antmachineintelligence/mtgbmcode / ParallelSort

Function ParallelSort

include/LightGBM/utils/common.h:713–758  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

711}
712
713template<typename _RanIt, typename _Pr, typename _VTRanIt> inline
714static void ParallelSort(_RanIt _First, _RanIt _Last, _Pr _Pred, _VTRanIt*) {
715 size_t len = _Last - _First;
716 const size_t kMinInnerLen = 1024;
717 int num_threads = 1;
718 #pragma omp parallel
719 #pragma omp master
720 {
721 num_threads = omp_get_num_threads();
722 }
723 if (len <= kMinInnerLen || num_threads <= 1) {
724 std::sort(_First, _Last, _Pred);
725 return;
726 }
727 size_t inner_size = (len + num_threads - 1) / num_threads;
728 inner_size = std::max(inner_size, kMinInnerLen);
729 num_threads = static_cast<int>((len + inner_size - 1) / inner_size);
730 #pragma omp parallel for schedule(static, 1)
731 for (int i = 0; i < num_threads; ++i) {
732 size_t left = inner_size*i;
733 size_t right = left + inner_size;
734 right = std::min(right, len);
735 if (right > left) {
736 std::sort(_First + left, _First + right, _Pred);
737 }
738 }
739 // Buffer for merge.
740 std::vector<_VTRanIt> temp_buf(len);
741 _RanIt buf = temp_buf.begin();
742 size_t s = inner_size;
743 // Recursive merge
744 while (s < len) {
745 int loop_size = static_cast<int>((len + s * 2 - 1) / (s * 2));
746 #pragma omp parallel for schedule(static, 1)
747 for (int i = 0; i < loop_size; ++i) {
748 size_t left = i * 2 * s;
749 size_t mid = left + s;
750 size_t right = mid + s;
751 right = std::min(len, right);
752 if (mid >= right) { continue; }
753 std::copy(_First + left, _First + mid, buf + left);
754 std::merge(buf + left, buf + mid, _First + mid, _First + right, _First + left, _Pred);
755 }
756 s *= 2;
757 }
758}
759
760template<typename _RanIt, typename _Pr> inline
761static void ParallelSort(_RanIt _First, _RanIt _Last, _Pr _Pred) {

Callers 1

EvalMethod · 0.50

Calls 6

sortFunction · 0.85
copyFunction · 0.85
mergeFunction · 0.85
omp_get_num_threadsFunction · 0.70
IteratorValTypeFunction · 0.70
beginMethod · 0.45

Tested by

no test coverage detected