C 之OpenMP並行程式設計 列舉排序

2021-10-12 00:26:21 字數 1858 閱讀 1381

(這是自己高新能與雲計算課程的乙個作業)可以看之前那篇visual studio 2017之openmp執行環境配置

列舉排序演算法:

是一種最簡單的排序演算法,通常也稱為秩排序(rank sort)。 該演算法的具體思想是(假設按關鍵字遞增排序),對每乙個待排序的元素統計小於它的所有 元素的個數,從而得到該元素最終處於序列中的位置。

1、序列演算法:

假定待排序的 n 個數存在 a[1]…a[n] 中。首先將 a[1]與 a[2]…a[n]比較,記錄比其小的數的個數,令其為k,a[1]就被存入有序的 陣列 b[1]…b[n]的 b[k+1]位置上;然後將 a[2]與 a[1],a[3]…a[n]比較,記錄比其小的數的個數,依此類推。這樣的比較操作共n(n-1)次,所以序列秩排序的時間複雜度為o(n平方)。

2、並行演算法

在該並行演算法中,使用了n個處理器,由於每個處理器定位乙個元素,所以步驟⑵的時 間複雜度為 o(n);步驟⑶中主程序完成的陣列元素重定位操作的時間複雜度為 o(n),通 信複雜度分別為 o(n);同時⑴中的通訊複雜度為 o(n平方);所以總的計算複雜度為 o(n), 總的通訊複雜度為 o(n平方)。

#include

#include

#include

#include

using

namespace std;

//序列排序

void

enumsort

(int

*a,int

*b,int n)

while

(b[k]!=0

) k++

; b[k]

= a[i];}

}//並行排序

void

paenumsort

(int

*a,int

*b,int n)

while

(b[k]!=0

) k++

; b[k]

= a[i];}

}int

main()

s1 =

omp_get_wtime()

;enumsort

(a, b, n)

; e1 =

omp_get_wtime()

; cout <<

<< e1 - s1 << endl;

s2 =

omp_get_wtime()

;paenumsort

(a, b2, n)

; e2 =

omp_get_wtime()

; cout <<

<< e2 - s2 << endl;

cout << endl;

delete a, b, b2;

}system

("pause");

}

(只不過**其實有些問題,好像分配不了那麼多執行緒。。。先放著後面解決了再看吧)

藍色為平行計算,橙色為序列計算。

分析:剛開始並行演算法執行時間是多於序列演算法的,隨後從4000開始,並行演算法的時間比序列時間少;可見隨著陣列長度的變大,並行演算法的優勢就體現出來了。

OpenMP並行程式設計(一)

openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...

OpenMP並行程式設計(一)

openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...

OpenMP並行程式設計(一)

openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...