|
29 | 29 | # we should find starts here
|
30 | 30 | function fast_sortperm_int_threaded!(x, original_P, copy_P, ranges, rangelen, minval, misatleft, last_valid_range, ::Val{T}) where T
|
31 | 31 | starts = [T[] for i in 1:Threads.nthreads()]
|
32 |
| - Threads.@threads for i in 1:last_valid_range |
| 32 | + Threads.@threads :static for i in 1:last_valid_range |
33 | 33 | rangestart = ranges[i]
|
34 | 34 | i == last_valid_range ? rangeend = length(x) : rangeend = ranges[i+1] - 1
|
35 | 35 | # if (rangeend - rangestart) == 0
|
@@ -105,29 +105,57 @@ function fast_sortperm_int!(x, original_P, copy_P, ranges, rangelen, minval, mis
|
105 | 105 | end
|
106 | 106 |
|
107 | 107 | function _sortperm_int!(idx, idx_cpy, x, ranges, where, last_valid_range, missingatleft, ord, a; threads = true)
|
108 |
| - @_threadsfor threads for i in 1:last_valid_range |
109 |
| - rangestart = ranges[i] |
110 |
| - i == last_valid_range ? rangeend = length(x) : rangeend = ranges[i+1] - 1 |
111 |
| - if (rangeend - rangestart + 1) == 1 |
112 |
| - continue |
113 |
| - end |
114 |
| - _minval = stat_minimum(x, lo = rangestart, hi = rangeend) |
115 |
| - if ismissing(_minval) |
116 |
| - continue |
117 |
| - else |
118 |
| - minval::Int = _minval |
| 108 | + if threads |
| 109 | + Threads.@threads :static for i in 1:last_valid_range |
| 110 | + rangestart = ranges[i] |
| 111 | + i == last_valid_range ? rangeend = length(x) : rangeend = ranges[i+1] - 1 |
| 112 | + if (rangeend - rangestart + 1) == 1 |
| 113 | + continue |
| 114 | + end |
| 115 | + _minval = stat_minimum(x, lo = rangestart, hi = rangeend) |
| 116 | + if ismissing(_minval) |
| 117 | + continue |
| 118 | + else |
| 119 | + minval::Int = _minval |
| 120 | + end |
| 121 | + maxval::Int = stat_maximum(x, lo = rangestart, hi = rangeend) |
| 122 | + # the overflow is check before calling _sortperm_int! |
| 123 | + rangelen = maxval - minval + 1 |
| 124 | + if rangelen < div(rangeend - rangestart + 1, 2) |
| 125 | + if missingatleft |
| 126 | + ds_sort_int_missatleft!(x, idx, idx_cpy, where[Threads.threadid()], rangestart, rangeend, rangelen, minval) |
| 127 | + else |
| 128 | + ds_sort_int_missatright!(x, idx, idx_cpy, where[Threads.threadid()], rangestart, rangeend, rangelen, minval) |
| 129 | + end |
| 130 | + else |
| 131 | + ds_sort!(x, idx, rangestart, rangeend, a, ord) |
| 132 | + end |
119 | 133 | end
|
120 |
| - maxval::Int = stat_maximum(x, lo = rangestart, hi = rangeend) |
121 |
| - # the overflow is check before calling _sortperm_int! |
122 |
| - rangelen = maxval - minval + 1 |
123 |
| - if rangelen < div(rangeend - rangestart + 1, 2) |
124 |
| - if missingatleft |
125 |
| - ds_sort_int_missatleft!(x, idx, idx_cpy, where[Threads.threadid()], rangestart, rangeend, rangelen, minval) |
| 134 | + else |
| 135 | + for i in 1:last_valid_range |
| 136 | + rangestart = ranges[i] |
| 137 | + i == last_valid_range ? rangeend = length(x) : rangeend = ranges[i+1] - 1 |
| 138 | + if (rangeend - rangestart + 1) == 1 |
| 139 | + continue |
| 140 | + end |
| 141 | + _minval = stat_minimum(x, lo = rangestart, hi = rangeend) |
| 142 | + if ismissing(_minval) |
| 143 | + continue |
126 | 144 | else
|
127 |
| - ds_sort_int_missatright!(x, idx, idx_cpy, where[Threads.threadid()], rangestart, rangeend, rangelen, minval) |
| 145 | + minval::Int = _minval |
| 146 | + end |
| 147 | + maxval::Int = stat_maximum(x, lo = rangestart, hi = rangeend) |
| 148 | + # the overflow is check before calling _sortperm_int! |
| 149 | + rangelen = maxval - minval + 1 |
| 150 | + if rangelen < div(rangeend - rangestart + 1, 2) |
| 151 | + if missingatleft |
| 152 | + ds_sort_int_missatleft!(x, idx, idx_cpy, where[Threads.threadid()], rangestart, rangeend, rangelen, minval) |
| 153 | + else |
| 154 | + ds_sort_int_missatright!(x, idx, idx_cpy, where[Threads.threadid()], rangestart, rangeend, rangelen, minval) |
| 155 | + end |
| 156 | + else |
| 157 | + ds_sort!(x, idx, rangestart, rangeend, a, ord) |
128 | 158 | end
|
129 |
| - else |
130 |
| - ds_sort!(x, idx, rangestart, rangeend, a, ord) |
131 | 159 | end
|
132 | 160 | end
|
133 | 161 | end
|
|
0 commit comments