單核單線程、單核多線程、多核多線程以及並行計算對大數據和複雜算法的簡單效應

在並行計算裏,所必要的硬件設備毫無疑問的就是CPU、 GPU等等

對開始本文之前,先述說一下未來多核計算的趨向性

1.單核設備的物理空間利用率已經達到很高水平,難以繼續提高,即便是有量子計算機(現在技術尚不成熟,沒有達到相應效果),也會有期對應不易處理的數量級數據

2.單核設備的功耗問題與散熱問題,據相關資料顯示,單核速度上述一被往往需要立方級別以上的功耗上升率,相同時間內雙核來完成單核完成任務(任務可並行)則可以大量的節省能耗問題。

   迴歸正題,

  單核單線程,就是傳統意義上的算法決定效率,以及面向過程的順序執行。在信息化爆炸級增長的數據,I/O瓶頸、網絡響應等待等等如此之類的操作都成爲了單核單線程所患的難題,這項現象不但浪費了時間,還浪費了資源,沒有充分利用計算潛能。

  單核多線程,舉一個非常典型的例子--線程池,(當然並非只有線程池纔算單核多線程,也不是說線程池都是單核多線程,事實上,更多的線城池都是用在多核結構上的)。對不同的線程有一個優先級的參數,(可以選擇棧結構存放),當一個線程需要等待響應的時候,我可以將正在該核上運行的線程掛起,然後根據優先級選取新的線程運行,這樣避免了等待的時間與消耗,其實,這已經包含了並行的思想了,在我看來,(A=‘aaaaaa’,B=‘bbbbbb’),線程1打印A,線程2打印B,核給出的結果是一個a與b交叉的串,但結果是不確定的,他做的時間是work的時間,但他在做一件事情(A)的同時,也把事情(B)給做了,這就包含了並行的思想,只不過只有一個核的資源所以時間是(work/單核=work)

  (more example to be continue...)

  多核多線程,這個就是真正物理層面上的並行,多個核做不同的進程,但每個覈實際上還是搭載了多線程的任務。繼續以前面的例子,核1打印A,核2打印B,屏幕的結果(a與b交叉的串,當然不考慮輸出設備的競爭),競爭的處理在多核計算的時候往往需要的號規劃,所以CMU的並行計算思想核心之一分治,將要處理的數據分爲多個獨立的塊,然後每個核處理不同的數據得到結果,再進行合併。處理競爭是多核協調的關鍵。

  (more information to be continue...)

   Mapreduce就是多核多線程的一個很好的例子:

      讓我舉幾個簡單的例子,求一個數組(下標i到j)的和(數組內的值當然是隨機的),單核做無論都應該是O(n),應爲我們至少需要遍歷一遍數組i到j,在MapReduce裏,假設我有(j-i+1)個核,構造f (數組,index)->數組值,這是Map的函數,根據下標計算值(O(1)),然後把map後的值加起來,兩兩並行相加,(如輸入下標爲2*i和2*i+1的核得到的結果相加)此時有S(n)=S(n/2)+O(1),得到S(n)=O(log(n))(推導見主成分分析),於是多核的結果就是O(log(n))

 這個例子可能讓你覺得多核用處不太,我花了(j-i+1)個核,效率提高不大啊,那是因爲這個簡單的例子,並行度不高,根本就不夠看,下面以舉證乘法爲例

      當你看到這裏的時候如果不知道矩陣乘法的分治做法的,請按esc鍵,然後潛心研究算法導論

      這裏給出分治的矩陣乘法的遞推關係  W(n)=8*W(n/2)+O(n^2) (主成分分析知道爲O(n^3))

      有個數學達人給出了算法,把8降到了7得到了O(n^(log7))的結果

      讓我們看看並行的結果,首先,規模爲n/2的8次矩陣乘法的遞歸調用,因爲彼此獨立,只要有了足夠的核,可以同時運算結果,在O(n^2)的矩陣copy階段,因爲矩陣的每個位置的值是獨立的,只要有了n^2個核,可以在O(1)的時間內完成,故爲S(n)=S(n/2)+O(1),我們得到O(log(n))的結果

       故一個O(n^(log7))的複雜算法就被簡化到了O(log(n))的時間完成。

(maybe this acticle to be continue...)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章