@@ -1006,6 +1006,20 @@ function pagedmergesort!(v::AbstractVector{T}, lo::Integer, hi::Integer, buf::Ab
1006
1006
return v
1007
1007
end
1008
1008
1009
+ const PAGEDMERGESORT_THREADING_THRESHOLD = 2 ^ 13
1010
+
1011
+ function sort! (v:: AbstractVector , lo:: Integer , hi:: Integer , a:: PagedMergeSortAlg , o:: Ordering )
1012
+ lo >= hi && return v
1013
+ n = hi + 1 - lo
1014
+ blocksize = isqrt (n)
1015
+ buf = Vector {eltype(v)} (undef,3 blocksize)
1016
+ nBlocks = n ÷ blocksize
1017
+ blockLocation = Vector {Int} (undef,nBlocks+ 1 )
1018
+ pagedmergesort! (v,lo,hi,buf,blockLocation,o)
1019
+ return v
1020
+ end
1021
+
1022
+ Base. @static if VERSION >= v " 1.3"
1009
1023
function threaded_pagedmergesort! (v:: AbstractVector , lo:: Integer , hi:: Integer , bufs, blockLocations, c:: Channel , threadingThreshold:: Integer , o= Base. Order. Forward)
1010
1024
len = hi + 1 - lo
1011
1025
if len <= Base. SMALL_THRESHOLD
@@ -1034,20 +1048,6 @@ function threaded_pagedmergesort!(v::AbstractVector, lo::Integer, hi::Integer, b
1034
1048
put! (c,id)
1035
1049
return v
1036
1050
end
1037
-
1038
- const PAGEDMERGESORT_THREADING_THRESHOLD = 2 ^ 13
1039
-
1040
- function sort! (v:: AbstractVector , lo:: Integer , hi:: Integer , a:: PagedMergeSortAlg , o:: Ordering )
1041
- lo >= hi && return v
1042
- n = hi + 1 - lo
1043
- blocksize = isqrt (n)
1044
- buf = Vector {eltype(v)} (undef,3 blocksize)
1045
- nBlocks = n ÷ blocksize
1046
- blockLocation = Vector {Int} (undef,nBlocks+ 1 )
1047
- pagedmergesort! (v,lo,hi,buf,blockLocation,o)
1048
- return v
1049
- end
1050
-
1051
1051
function sort! (v:: AbstractVector , lo:: Integer , hi:: Integer , a:: ThreadedPagedMergeSortAlg , o:: Ordering )
1052
1052
lo >= hi && return v
1053
1053
n = hi + 1 - lo
@@ -1065,4 +1065,8 @@ function sort!(v::AbstractVector, lo::Integer, hi::Integer, a::ThreadedPagedMerg
1065
1065
threaded_pagedmergesort! (v,lo,hi,bufs,blockLocation,c,threadingThreshold,o)
1066
1066
return v
1067
1067
end
1068
+ else
1069
+ # no multithreading in earlier versions -> use single threaded version instead
1070
+ sort! (v:: AbstractVector , lo:: Integer , hi:: Integer , a:: ThreadedPagedMergeSortAlg , o:: Ordering ) = sort! (v, lo, hi, PagedMergeSort, o)
1071
+ end
1068
1072
end # module
0 commit comments