並行計算的一些背景知識

   

1.馮諾依曼結構

    經典馮諾依曼結構爲 : 主存, 中央存貯單元(CPU) , 以及 主存和中央存貯單元之間的傳輸部分。CPU 又由 ALU(計算單元)和  控制單元組成。 主存和CPU之間的分離稱爲馮諾依曼瓶頸。



2.進程,多線程及線程

   線程爲程序員提供了一種機制,將程序劃分爲多個大致獨立的任務,當某個任務阻塞時能夠執行其他任務。線程的切換比進程要快。

    進程和 線程的關係: 線程從進程中fork,當線程結束時 又join回進程。


3. 對馮諾依曼瓶頸的改進:Cache 的引入,虛擬內存,低層次並行。

   1) Cache 是利用內存連續或者數據的局部性一次讀取一整塊代碼和數據,提高速度。

// sample


int A[10][10]  
int B[10]

// 內存是連續的
for(int i =0;i<10;i++)
  for(int j =0;j<10;j++)
         sum += A[i][j] * B[j];

/* 在  row-major情況下,下面程序性能不好,每個元素之間差了10   */
for(int i =0;i<10;i++)
  for(int j =0;j<10;j++)
          sum += A[j][i] * B[j]
 


 根據文獻:實際運行時,當矩陣大小爲1000*1000時第一個比第二個快三倍左右(也沒那麼快-_-!)


   2) 虛擬存貯器

       就是常用的虛擬內存,當運行一個大型程序,程序需要訪問大型數據集,那麼所有的指令或者數據可能在主存中放不下。


 3)指令級並行

     略



 上面是對馮諾依曼的擴展, 下面是現有的一些並行系統



SIMD系統 (GPU屬於這一種)

   全稱單指令多數據流,顧名思義,SIMD通過對多個數據執行相同的指令從而實現在多個數據流上的操作。爲了實現多數據流操作, SIMD中的ALU很多, 具體可以參考GPU架構。

for(int i =0; i<n;i++)
   x[i] += y[i];

/* 在SIMD中, 每一個ALU 載入x[i]和y[i],並將計算結果放入x[i] */

  所有的ALU要麼執行相同的指令,要麼同時處於空閒。 

90年代唯一廣泛生產的是向量處理器,近來是GPU。


MMID系統

 多指令多數據流,有兩種類型,共享內存系統和分佈式內存系統。




   

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