@everywhere function mergesort_serial(data, istart, iend) if(istart < iend) mid = (istart + iend) >>>1 mergesort_serial(data, istart, mid) mergesort_serial(data, mid+1, iend) merge(data, istart, mid, iend) end end @everywhere function merge( data, istart, mid, iend) n = iend - istart + 1 temp = zeros(n) s = istart m = mid+1 for tem = 1:n if s <= mid && (m > iend || data[s] <= data[m]) temp[tem] = data[s] s=s+1 else temp[tem] = data[m] m=m+1 end end data[istart:iend] = temp[1:n] end @everywhere function mergesort_parallel(data, istart, iend, depth) if ((iend - istart) < 2000000) || (depth == 0) mergesort_serial(data, istart, iend) else mid = (istart + iend) >>>1 r = @spawn mergesort_parallel(data, istart, mid, depth-1) mergesort_parallel(data, mid+1, iend, depth-1) fetch(r) merge(data, istart, mid, iend) end end n = 10^5 A = [rem(rand(Int32),10) for i =1:n]; mergesort_parallel(SA, 1, n, 2); n = 10^7 A = [rem(rand(Int32),10) for i =1:n]; @time mergesort_serial(A, 1, n); SA = convert(SharedArray, A); @time mergesort_parallel(SA, 1, n, 4); n = 2 * n A = [rem(rand(Int32),10) for i =1:n]; @time mergesort_serial(A, 1, n); SA = convert(SharedArray, A); @time mergesort_parallel(SA, 1, n, 4);