迴圈優化與多面體模型

2021-09-27 08:24:38 字數 1634 閱讀 2594

迴圈通常是資料並行應用的最密集計算段,因此迴圈優化直接影響效能。當面對巢狀迴圈時,分配給執行緒的計算粒度將直接影響效能。迴圈轉換如fission(迴圈裂變)與fusion(迴圈融合)的巢狀式迴圈可促使並行化,並提高工作效率。

本文就幾種迴圈優化的方法與多面體模型的排程進行簡要闡述(因為lz已經被這些迴圈優化搞得痛不欲生了)。

顧名思義,該變換令迴圈進行了融合。如圖所示,原始**是兩個for迴圈,變化之後,對兩個迴圈中 i、j 相同的範圍進行了融合。

我們為了把該變換對映或者說排程到多面體模型中去,需要產生排程樹。

舉例如下:

有這樣一段用tc寫的**,語句s、t分別為迴圈語句。其融合操作表述如下:

band 操作將s、t所對應的迭代向量進行了融合。

loop tiling/blocking 的意思是分塊,可以將迴圈的迭代空間劃分為更小的塊,以幫助確保迴圈中使用的資料在重用之前一直儲存在快取中。迴圈迭代空間的劃分導致將大陣列劃分為更小的塊,從而將被訪問的陣列元素匹配到快取大小中,增強快取重用,消除快取大小需求。

平常的迴圈:

for

(i=0

; i++i)

變換後的迴圈,擁有乙個全新的 block 大小b:

for

(j=0

; j=b)}

更具體的例子:

下面是乙個矩陣向量乘法的例子。有三個陣列,每個陣列有100個元素。**沒有將陣列劃分為更小的大小。

int i, j, a[

100]

[100

], b[

100]

, c[

100]

;int n =

100;

for(i =

0; i < n; i++

)}

當我們應用迴圈分塊,使用2 * 2塊,**變為:

int i, j, x, y, a[

100]

[100

], b[

100]

, c[

100]

;int n =

100;

for(i =

0; i < n; i +=2

)}}}

原來的迴圈迭代空間n×n。陣列的訪問塊(i, j)也是n×n。當n過大和機器的快取容量太小,訪問陣列元素的迴圈迭代(例如,i = 1, j = 1到n)可能交叉的快取記憶體線路,導致快取丟失。

hdu1418 抱歉(多面體尤拉公式)

hdu1418 首先已知多面體尤拉定理 面數 頂點數 稜數 2 證明由於線段不相交,可以看作是三維多面體。include using namespace std intmain return0 各種尤拉公式合集 1 複數裡的尤拉公式 eix cos x isinx i為虛數單位,e為自然對數 證明 ...

python三維曲面合併 繪製多面體的三維曲面

我嘗試使用python和matplotlib來渲染乙個多面體的3d曲面,由 但是我的 如下所示 似乎沒有正確地繪製它。應該怎麼做呢?在 失敗的嘗試 import numpy as np import matplotlib.pyplot as plt from mpl toolkits.mplot3d...

迴圈體與else語句

大家一定非常熟悉else關鍵字語句,else通常是用來配合if語句使用的,但是在python的else語句並不只能用在if語句之後,還可以用在迴圈語句甚至try異常處理語句中,這雖然不是什麼秘密,但是很多人沒有發現它的好處。for else 預設情況下,只有當for迴圈語句正常執行後,最後才會執行e...