| 711 | } |
| 712 | |
| 713 | template<typename _RanIt, typename _Pr, typename _VTRanIt> inline |
| 714 | static 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 | |
| 760 | template<typename _RanIt, typename _Pr> inline |
| 761 | static void ParallelSort(_RanIt _First, _RanIt _Last, _Pr _Pred) { |
no test coverage detected