并行算法设计与性能优化_CME 323: 分布式算法与优化(1)
這門課程是由斯坦福大學(xué)在今年 4 月份推出的線上課程,主講人是 Reza Zadeh ,總體來(lái)說(shuō)主講人講解比較幽默,內(nèi)容也是容易讓人聽(tīng)得下去,不是那么晦澀難懂。課程內(nèi)容分為兩個(gè)部分:并行計(jì)算(parallel computing),分布式計(jì)算(distributed computing)。并行計(jì)算與分布式計(jì)算有啥區(qū)別呢?主要的區(qū)別在于:并行計(jì)算主要是在共享內(nèi)存情況下的同時(shí)計(jì)算;而分布式計(jì)算則是更多需要考慮網(wǎng)路通信。
并行計(jì)算簡(jiǎn)介
為什么我們要研究并行計(jì)算呢?現(xiàn)在 CPU 性能這么強(qiáng)勁,為啥還要費(fèi)力研究用多個(gè)核一起計(jì)算呢?主要原因在于 CPU 的性能優(yōu)化受到以下限制:CPU 的運(yùn)算會(huì)有上限,3 Gigahertz;并且 CPU 的散熱也是有限的。但是與之相對(duì)的是:RAM,硬盤空間卻是處于不斷增長(zhǎng)的情況。因?yàn)橛布圃焐涕_(kāi)始從開(kāi)發(fā)更快的處理器,轉(zhuǎn)為開(kāi)發(fā)多核處理的系統(tǒng)。由于計(jì)算從連續(xù)計(jì)算變?yōu)榱瞬⑿杏?jì)算,我們也就需要開(kāi)始研究并行計(jì)算算法。
要研究并行算法,我們首先要明確的一個(gè)問(wèn)題就是我們?nèi)绾蝸?lái)評(píng)估并行算法的效率。通常來(lái)說(shuō),一個(gè)算法的效率可以用完成該算法所需要的操作數(shù)目(operation)來(lái)評(píng)估。但是當(dāng)我們研究并行算法的時(shí)候,情況可就大不一樣了。一個(gè)高效的并行算法在單個(gè)處理器上可能并不高效,反之亦然。所以,為了評(píng)估并行算法是否高效,Reza 引入了 work-depth ,并且介紹了算法如何設(shè)計(jì)來(lái)優(yōu)化該目標(biāo)。
Parallel RAM 模型
第一個(gè)要介紹的并行算法是:Parallel RAM(PRAM)。RAM(Random Access Memory) 模型是典型的連續(xù)模型, 在 RAM 中,對(duì)于一個(gè)特定的內(nèi)存單元
,有處理器 。處理器 可以在常數(shù)時(shí)間內(nèi),讀取或?qū)懭雰?nèi)存中的任意位置。當(dāng)我們研究 PRAM,它可能有多種不同的變化了。PRAM 與 RAM 的不同在于,處理器變?yōu)槎鄠€(gè),內(nèi)存還是那一塊,那么這會(huì)有什么變化呢?我們可能面臨多個(gè)處理器同時(shí)訪問(wèn)一塊內(nèi)存的情況,這可以分為以下幾種情況:一般來(lái)說(shuō),這些情況中最常用的是同時(shí)讀取,獨(dú)占寫(xiě)入的情況。當(dāng)然也會(huì)有同時(shí)寫(xiě)入的情況。
在處理同時(shí)寫(xiě)入情況時(shí),需要仔細(xì)考慮多個(gè)處理器同時(shí)向同一內(nèi)存的同一區(qū)域?qū)懭胗袥_突的情況,一般有以下方式來(lái)解決同時(shí)寫(xiě)入:
- Undefined/Garbage: 機(jī)器可能會(huì)掛掉或者寫(xiě)入的結(jié)果被當(dāng)成垃圾處理
- Arbitrary: 沒(méi)有事先定義好的確定處理器寫(xiě)入優(yōu)先級(jí)的規(guī)則,每次都隨機(jī)選取處理器進(jìn)行寫(xiě)入
- Priority: 事先確定好各處理器寫(xiě)入的順序
- Combination: 根據(jù)寫(xiě)入值來(lái)確定寫(xiě)入的順序(比如最大值,負(fù)數(shù)等優(yōu)先寫(xiě)入),與 Priority 方式不同點(diǎn)在于,這個(gè)利用了寫(xiě)入值來(lái)確定寫(xiě)入順序,而前者則是根據(jù)處理器來(lái)決定順序
通用 Parallel RAM 模型
Parallel RAM 模型主要有以下兩類:
多核共享內(nèi)存多核多內(nèi)存在實(shí)際使用的過(guò)程中,處理器與內(nèi)存之間可能還存在額外的 cache 層。
work 與 depth 的實(shí)際意義
work :算法的 work 是指完成算法消耗的時(shí)間乘以完成算法消耗的處理器的數(shù)目
depth:在并行算法中,我們需要等待計(jì)算最緩慢的處理器完成計(jì)算,整個(gè)計(jì)算過(guò)程才算真正完成,這個(gè)時(shí)間就是算法的 depth
對(duì)于同樣一個(gè)算法,如果該算法在單個(gè)處理器上進(jìn)行處理,其耗時(shí)定義為:
;如果在 個(gè)處理器上進(jìn)行處理,其耗時(shí)定義為: 。理想情況下,如果總?cè)蝿?wù)被均分為 部分,并且各個(gè)部分速度都相同,所以 滿足以下條件: ,這也是分布式算法希望達(dá)到的下界。
算法的 DAG 表示
我們可以使用一個(gè)有向無(wú)環(huán)圖來(lái)表示算法中不同操作之間的依賴關(guān)系。可以這樣來(lái)將算法構(gòu)建為 DAG: 當(dāng)節(jié)點(diǎn)
是節(jié)點(diǎn) 的輸入時(shí),用一個(gè)從 出發(fā)到 的邊來(lái)表示。最終構(gòu)成的圖不保證一定是完全連接的,因?yàn)橛幸恍┯?jì)算可能與其它部分完全獨(dú)立。DAG我們可以把 DAG 看成是一棵樹(shù),它的 root 的 depth 是 0,root 的 children 的 depth 是 1,以此類推。將
定義為樹(shù)的第 層所含有的操作的數(shù)目,同一層的操作之間沒(méi)有依賴關(guān)系因此它們可以同時(shí)計(jì)算。不同層之間的操作不能同時(shí)計(jì)算。如果要計(jì)算當(dāng)前層的操作,需要等待它所有的 children 操作都計(jì)算完成才可以進(jìn)行。對(duì)于連續(xù)算法來(lái)講,完成算法所需花費(fèi)的時(shí)間就是樹(shù)中所有節(jié)點(diǎn)的總和,所以我們可以把 work 定義為:那么當(dāng)我們擁有無(wú)限的處理器的時(shí)候,執(zhí)行算法的耗時(shí)是多少呢?耗時(shí)就是算法的 depth。定義如下:
Brent's 定理
定義:假設(shè)算法的各過(guò)程是最優(yōu)調(diào)度的
總結(jié)
以上是生活随笔為你收集整理的并行算法设计与性能优化_CME 323: 分布式算法与优化(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pip install python -
- 下一篇: 反向传播算法_反向传播算法:定义,概念,