迴圈通常是資料並行應用的最密集計算段,因此迴圈優化直接影響效能。當面對巢狀迴圈時,分配給執行緒的計算粒度將直接影響效能。迴圈轉換如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...