主题:多线程用于快速排序
请问一个多线程用于快速排序的问题。以下是并行化后的简单例子(FORTRAN)。为什么并行化后用时反而比串行长?有什么好的建议吗?
program quicksortopenmp
implicit integer (a-z)
dimension iitem1(30)
s1=1
t1=30
DATA IITEM1/0, 10, 20, 30, 40, 50, 60, 100, 200, 500,&
600, 610, 210, 225, 200, 100, 111, 210, 225, 255,&
1, 7, 3, 5, 11, 23, 29, 18, 9, 14/
call quicksort(iitem1,s1,t1)
print *,'iitem1',iitem1
end program quicksortopenmp
recursive subroutine quicksort(iitem, s, t)
implicit integer (a-z)
dimension iitem(30)
integer s, t
integer k
if(s.lt.t) then
call quickpass(iitem, s, t, k)
!$OMP PARALLEL SECTIONS
!$OMP section
call quicksort(iitem, s, k - 1)
!$OMP section
call quicksort(iitem, k + 1, t)
!$OMP END PARALLEL SECTIONS
endif
end subroutine
subroutine quickpass(iitem, s, t, k)
implicit integer (a-z)
dimension iitem(30)
integer s, t
integer k
integer pivot
integer i, j
pivot = iitem(s)
i = s
j = t
do while(i.lt.j)
do while(i.lt.j.and.iitem(j).ge.pivot)
j = j - 1
enddo
iitem(i) = iitem(j)
do while(i.lt.j.and.iitem(i).le.pivot)
i = i + 1
enddo
iitem(j) = iitem(i)
enddo
iitem(i) = pivot
k = i
end subroutine
program quicksortopenmp
implicit integer (a-z)
dimension iitem1(30)
s1=1
t1=30
DATA IITEM1/0, 10, 20, 30, 40, 50, 60, 100, 200, 500,&
600, 610, 210, 225, 200, 100, 111, 210, 225, 255,&
1, 7, 3, 5, 11, 23, 29, 18, 9, 14/
call quicksort(iitem1,s1,t1)
print *,'iitem1',iitem1
end program quicksortopenmp
recursive subroutine quicksort(iitem, s, t)
implicit integer (a-z)
dimension iitem(30)
integer s, t
integer k
if(s.lt.t) then
call quickpass(iitem, s, t, k)
!$OMP PARALLEL SECTIONS
!$OMP section
call quicksort(iitem, s, k - 1)
!$OMP section
call quicksort(iitem, k + 1, t)
!$OMP END PARALLEL SECTIONS
endif
end subroutine
subroutine quickpass(iitem, s, t, k)
implicit integer (a-z)
dimension iitem(30)
integer s, t
integer k
integer pivot
integer i, j
pivot = iitem(s)
i = s
j = t
do while(i.lt.j)
do while(i.lt.j.and.iitem(j).ge.pivot)
j = j - 1
enddo
iitem(i) = iitem(j)
do while(i.lt.j.and.iitem(i).le.pivot)
i = i + 1
enddo
iitem(j) = iitem(i)
enddo
iitem(i) = pivot
k = i
end subroutine