上一篇文章中,咱們學習瞭如何在CUDA中隱藏數據傳輸,而其中用到的主要技術就是併發計算。這時你可能會問,這個專欄不是CUDA並行計算嗎?怎麼又說什麼併發計算呢?其實,這裏所說的「CUDA並行計算」並非純粹的並行計算,而是並行計算與併發計算相結合的一種技術。那麼這二者的區別又是什麼呢?我以爲是時候講一下二者的區別與聯繫了,不然會對以後的學習產生誤導。算法
並行(parallelism)是指在具備多個處理單元(如GPU或者多核CPU)的系統上,經過將計算或數據劃分爲多個部分,將各個部分分配到不一樣的處理單元上,各處理單元相互協做,同時運行,已達到加快求解速度或者提升求解問題規模的目的。併發
併發是一個程序、算法或者問題的可分解屬性,它由多個順序不依賴性或者局部順序依賴性的結構或單元組成。這就意味着這些單元不管以何種順序執行或者運算,最終結果都是同樣的。性能
咱們一般所接觸到的併發大可能是基於單處理機的,這經常是爲了知足應用的功能需求。好比具備圖形界面的程序,應該具備同時響應多個事件的能力,這樣給用戶的錯覺就是同時執行,但實際上總的執行速度並無提升。然而,併發並不老是基於單處理機的。對於基於多處理機的併發計算,能夠得到很好的性能提高——大大提升執行速度。學習
我在網上看到不少講併發計算與並行計算區別的文章,感受不少講得不是很抽象就是不全面,所以我決定本身好好總結一下。閒話少說,先看一張圖。spa
仔細看一下這張圖,先有個大概印象再繼續往下讀。操作系統
loading ... ...設計
看完上面的圖以後,這是我總結的幾點:blog
併發計算能夠基於單處理器或者多處理器,基於單處理器時多個任務分時執行,輪流使用處理器;並行計算必須基於多處理器,多個任務同時使用多個處理器進程
併發計算能夠同時執行多個不一樣的任務;並行計算通常是同時執行多個相同的任務事件
NOTE:爲了更好地比較並行與併發計算,我加入了串行計算。
從專一程度上來看,三者的排名以下:
串行計算->並行計算->併發計算
串行計算最老實也最死板,任什麼時候候只作一件事,雷打不動,這件完成才能作下一件事;並行計算相比就沒有那麼專一了,它能夠同時作多個相同的事情;併發計算就更沒有那麼專一了,它能夠同時作多個不一樣的事情。
並行計算與併發計算關係密切。咱們在操做系統課程中所學到的併發大可能是基於單處理器的,進程交替執行,表現出一種同時執行的外部特徵。這種併發計算沒法實現真正的加速效果。
並行計算(純粹的)一般是將一個較大的問題分爲較小的多個子問題,而後同時處理這些子問題,相似於算法中的分治法。這種執行方式雖然能夠得到較好的加速效果,可是還能夠得到更好的加速效果。
在基於多核的計算中,經常將併發計算與並行計算相結合,這樣能夠得到比並行計算更好的加速效果。在專欄的上一篇文章中,咱們應用的就是這個技術。
這篇文章主要介紹了並行計算與併發計算的區別與聯繫。若是要深刻地學習併發計算,能夠參考操做系統的相關書籍,好比比較經典的《操做系統精髓與設計原理》。在掌握了兩者的區別與聯繫以後,咱們會繼續學習CUDA並行計算。
維基百科-Concurrent_computing
維基百科-Parallel_computing
操做系統精髓與設計原理 第六版, [美]William Stallings, 機械工業出版社