1. 程式人生 > >針對多核架構下的並行排序

針對多核架構下的並行排序

在多核環境中,排序時如果仍然使用單核時代的序列排序演算法的話,那麼只能有一個CPU核在執行,其他CPU核將得不到利用。因此多核環境中的排序一般需要用到並行排序演算法。

並行排序演算法和序列排序演算法相比,會增加一些額外的開銷,如計算開銷或空間開銷。那麼在並行排序演算法中,有那些需求呢?下面給出一些並行排序方面的需求供參考。

需求1:演算法能隨CPU核數擴充套件,即CPU核數升級後不需要修改演算法就可以取得加速比效能的線性增加。

需求2:演算法能有一個較好的能耗效率,演算法並不是越快越好,而是需要在速度和CPU能耗方面取得均衡,有時候為了追求效率,但是卻讓CPU能耗提高了許多。最好的做法是加速比能夠達到一定目標的情況下儘量降低CPU能耗。也就是說不需要片面去追求將程式並行化。有些時候程式序列執行比並行執行慢不了多少,但是CPU能耗卻降低了不少。

需求3:需要控制執行緒的粒度,否則執行緒粒度太細,頻繁建立執行緒會導致大量的額外開銷,從而使得效率大大降低。

需求4:在設計並行排序演算法時,還要考慮記憶體管理的開銷,由於並行演算法使用了多個執行緒,如果記憶體分配和釋放操作頻繁的話,那麼花費在這方面的開銷將是非常可觀的,因為常規的記憶體分配和釋放需要進行加鎖解鎖操作。

當然有一些方法來縮減記憶體管理方面的開銷

1、採用分散式記憶體管理

2、如果需要進行多塊記憶體的分配,那麼可以先分配一塊大的記憶體,然後再將分配的大的記憶體劃分成對應的多個小塊。

並行排序演算法有許多種,不同的應用場景中需要使用不同的排序演算法。一般來說,主要是針對不同的資料量,需要使用不同的算,如數量量很少的情況下,插入排序就足夠了,資料量特別大的情況下,需要使用基數排序,一般情況下可以使用快速排序和歸併排序。