并行合并排序

时间:2012-05-15 13:50:33

标签: parallel-processing openmp pascal

我使用pascal作为我的并行语言。(我不喜欢它,但强迫。)所以

与fork&并行合并排序加入不工作,有人可以告诉我为什么?

这是我的代码:

program parrallelmergesort;
architecture shared(100);
const 
    n=100;(*big array*)
    size=10;
var 
    t,globalCounter:integer;
    unsorted:array[1..n] of integer;

procedure CallMerge(var lower,mid,high:integer);
    var 
        i,j,k,count:integer;
        S:array[1..n] of integer;
BEGIN
    i:=lower;
    j:=mid+1;
    k:=lower;
    count:=high-lower+1;
    while (i<=mid) and (j<=high) do
        begin
            if unsorted[i]<unsorted[j] then
                begin
                    S[k] :=unsorted[i];
                    i :=i+1;
                end
            else
                begin
                    S[k] :=unsorted[j];
                    j :=j+1;
                end;
            k:=k+1;
        end;
    if i>mid then
        begin
            while j<=high do
                begin
                    S[k] :=unsorted[j];
                    j :=j+1;
                    k :=k+1;
                end;
        end
    else if j>high then
        begin
                while i<=mid do
                begin
                    S[k] :=unsorted[i];
                    i :=i+1;
                    k :=k+1;
                end;
        end;
    for t:=lower  to high do
            unsorted[t] :=S[t];
end;

procedure CallMergeSort(bottom,up:integer);
    var middle,nextOfMiddle:integer;
begin
    if up>bottom then
    begin
        middle := (up+bottom) div 2;
        nextofMiddle :=middle+1;
        fork CallMergeSort(bottom,middle);
        fork CallMergeSort(nextOfMiddle,up);
        join;join;
        CallMerge(bottom,middle,up);
    end;

end;


begin
    unsorted[1] :=4; unsorted[2] :=3; unsorted[3] :=10; unsorted[4] :=5;   unsorted[5] :=0;
    unsorted[6] :=1; unsorted[7] :=8; unsorted[8] :=6;  unsorted[9] :=11;  unsorted[10] :=12;
    CallMergeSort(1,size);
    for globalCounter:=1 to size do
     writeln(unsorted[globalCounter]);
    readln;
end.

我什么时候应该使用叉子?在CallMergeSort(递归)之前?

最后一行是pascal中的主要功能。

1 个答案:

答案 0 :(得分:0)

不要在rec函数内部调用fork和join。 只需从主电话中拨打两次电话。