編譯原理(龍書)第十一章 並行和區域性優化學習筆記

2022-09-10 06:45:13 字數 3105 閱讀 6988

如果 $\mathcal$ 是被並行化**的比率,並且如果並行化版本在乙個有 $\mathcal$ 個處理器的機器上執行,且沒有任何通訊或者並行化開銷,那麼此時的加速比是:

$$\frac) + (\mathcal / \mathcal)}$$

迴圈是並行化的主要目標,找到迴圈中相互獨立的迭代,將這些迭代分配給多個處理器。

例子:

//**1,原始**

for (i = 0; i < n; ++i>)

//**2, 並行**

//迴圈中的迭代平均分配給各個處理器,第p個處理器被分配執行第p組迴圈

b = ceil(n / m) // n 為迴圈次數,m為處理器個數,ceil() 為向上取整

for (int i = b * p; i < min(n, b * (p + 1)); ++i)

上述的並行**是乙個spmd(single program multiple data, 單程式多資料)

將迴圈中的互相獨立的迭代分配給不同的處理器。

將不同函式的呼叫過著兩個獨立的迴圈分配給不同的處理器。但是如果要對程式進行並行性處理,任務層次不會得到太多的關注,因為對沒個程式來說,相互獨立的任務數是固定的,不能隨著資料大小的增加而增加。而迴圈中的迭代次數會因為資料量的增加而增加。

c++中陣列元素是按行進行儲存的。

//**3,按行將陣列置零

for (i = 0; i < n; ++i)

}//**4,並行按行將陣列置零

b = ceil(n / m);

for (i = b * p; i < min(n, b * (p + 1)); ++i)

}

優化問題的輸入與輸出

具體分析例子,龍書p494

作為外層迴圈下標的乙個仿射函式,每個迴圈的上下界都定義了乙個不等式,它把空間分成了兩半:對應迴圈迭代部分(即正的半空間)和不對應迭代的部分(即負的半空間)。所有的線性不等式的交(邏輯and)表示這些正的半空間的交集,該交集定義了乙個凸多面體(convex polyhedron)。這個多面體就是這個迴圈巢狀結構的迭代空間。

迭代空間是陣列中被**訪問到的部分,與資料空間不一定完全相同。

把表示迭代空間的凸多面體投影到改空間中對應於較外層迴圈的維度上。可以用投影的方式生成迴圈界限。

輸入:乙個帶有變數x1, x2, $\cdots$, xn的多面體s。也就是說,s是關於變數xi的一組線性約束。乙個給定的變數xm是被指定需要消除的變數。

輸出:乙個關於x1, x2, $\cdots$, xm - 1, $\cdots$, xm + 1, $\cdots$, xn(即除了xm以外的所有s的變數)的多面體s'。s'是s到除第m個維度之外的所有維度的投影。

方法:龍書p504 - 505

仿射變換 = 線性變換 + 平移

仿射變換示意圖

如果下列條件同時成立,我們就說乙個迴圈中的乙個陣列訪問是仿射的。

仿射陣列訪問的例子有z[i], z[i + j + 1], z[0],但是z[i * j]和z[n * j]不是仿射訪問。

一些陣列訪問和它們的矩陣 - 向量表示 矩陣f和向量f

j = n;

for (i = 0; i <= n; ++i)

改寫成:

\\ 對z陣列的訪問變成仿射訪問

j = n;

for (i = 0; i <= n; ++i)

對於區域性性優化,我們希望識別出訪問相同資料或相同快取記憶體線的迭代組合。

資料復用可以分為自復用組復用兩種。

自復用定義:復用同樣的資料的多個迭代源於同乙個靜態訪問。

如果乙個靜態訪問所指向的資料具有k個維度,且這個迴圈巢狀在乙個深度為d(d > k)的迴圈結構中,那麼同乙個資料可以被復用nd - k次。

矩陣的零空間

給定矩陣 $\mathcal$ $\in$ $\mathcal$ m $\times$ n,那麼矩陣的零空間定義為:

如果x ∈ $\mathcal$ n $\times$ 1,且有 $\mathcal$ x = 0 那麼所有這樣的x組成的線性空間就是矩陣a的零空間。

矩陣的零度

矩陣零空間的維度稱為矩陣的零度(nullity)。

秩-零定理(the rank-nullity theorem)給定矩陣$\mathcal$ $\in$ $\mathcal$ m $\times$ n,我們有

$$\mathcal + \mathcal = n$$若零數為0,則說明所有的迭代都指向不同的位置,不存在復用的可能。

零空間的基本向量是矩陣f作為係數矩陣對應齊次方程的解。

仿射訪問的秩和零數

自空間復用

空間復用的分析依賴於矩陣的資料布局。c語言的矩陣是按行存放的,fortran語言的矩陣是按列存放的。

發現和利用自空間復用的技巧是不考慮係數矩陣f中的最後一行。如果得到的截短後的矩陣的秩小於迴圈巢狀結構的深度,那麼我們就可以確保最內層迴圈只改變陣列的最後下標的值,從而保證空間區域性性。

例子分析:龍書p513

組復用復用同樣的資料的多個迭代源源於同乙個靜態訪問。

我們只在同乙個迴圈中具有相同係數矩陣的陣列訪問之間計算組復用。

給定兩個動態訪問 fi

1 + f

1 和 fi

2 + f

2,它們復用相同資料的條件是:

$$\begin

fi_1 + f_1 = fi_2 + f_2;\

f(i_1 - i_2) = (f_1 - f_2)

\end

$$

modern c design 第十一章

本章介紹了經常遇到的雙分派的一種泛型解決方案。c 在語法上實現了單分派,即虛函式,通過動態機制選擇相應的函式。雙分派是形如fun object1 a,object2 b 根據a和b的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...

第十一章3

第十一章 一 滾動元件 awt中的滾動元件包括scrollbar 滾動條 和滾動面板 scrollpane 兩種。1 滾動條scrollbar 在指定的取值範圍內快速選取某一值的功能。i.構造方法 public scrollbar int orientation,int value,int visi...

java第十一章

問題 1 錯誤 2 異常,1 編譯時異常 檢查異常 2 執行時異常 不檢查異常 是否能用 解決,是的就是異常,不是的就是錯誤 問題 1 先驗 2 捕獲 異常捕獲機智 異常的三個種類 1 檢查異常 2 執行時異常 3 錯誤 throw 提示方法呼叫者本方法可能發生異常 throw跟異常物件 throw...