使用opengl進行通用計算需要解決幾個問題
1.計算流水線的終點是幀快取或顯示器,而科學計算的結果一般需要寫入儲存器,這是怎麼做到的?
使用紋理快取。
2.圖形流水線處理的是座標資訊和畫素資訊,怎麼才能使它處理通用資料?
使用正對投影平面的正交投影。
3.opengl提供的有限數量的圖形處理函式對資料處理效果非常單一,而且都是針對三維模型和畫素值的函式,如何制定科學計算所需的演算法?
gpgpu的計算過程:
1)將資料資料儲存為紋理圖
使用者可以將資料放置在二維陣列或三維陣列中。因為紋理元最多只能有rgba四個顏色通道,所以在存為三維陣列時,第三維不能大於4。
2)將資料載入到紋理快取
傳輸前注意視訊記憶體大小,以及所支援的最大單張紋理圖尺寸。超出限制,可對資料分批進行計算。
3)使用正對投影平面的正交投影
在常規的opengl三維圖形顯示原理中,投影的過程常常伴隨著對原來物件整體的放大或縮小(比如透視投影),以及在某乙個方向上的尺寸縮放(如將乙個略有側轉的平面正交投影到投影平面後,雖然物體整體尺寸未變,但在側轉方向上的投影圖形略有縮短)。在gpgpu中,每個畫素對使用者來說都是乙個資料,在整個投影過程中應保證這個畫素不被縮短(遮擋),也不被拉長(或複製),即應避免任何次尺寸的變化。這要求投影必須是正交投影,且物件(用於紋理對映的表面)是正對投影平面放置的(物件與投影平面平行)。物件的放置和攝像機(觀察點)的位置對投影效果都有影響。因此,物件被繪製得正對投影平面這一條件,與從正對物件得方向觀察物件這一條件是需要被同時滿足得。最簡單得方法就是將物件繪製得與座標軸垂直,然後順著座標軸得方向觀察物件。
glmatrixmode(gl_projection);
glloadidentity();
gluortho2d(0.0, unwidth, 0.0, unheight);
glmatrixmode(gl_modelview);
glloadidentity();
此處物件指乙個用於紋理對映得表面。在紋理對映過程中,紋理圖會貼在該表面上。既然該表面必須正對投影平面,即它是與投影方向垂直的,那麼這個表面一定是乙個平面。事實上,為了與矩形紋理圖配合,繪製的表面也是乙個與紋理圖等大的矩形。
4)設定視口和紋理圖尺寸
視口選擇與原點對齊,然後將視口尺寸設定成物件的尺寸
5)繪製乙個與紋理圖等大的矩形
「用繪製來呼叫」的關鍵步驟是:需要繪製乙個與紋理圖等大的矩形來作為紋理對映的物件,因為該物件的表面與紋理圖的尺寸完全相同,紋理對映就可以保證覆蓋紋理圖的每個紋理元,且對映比例為1:1.實際上,這樣對映就是資料的複製。紋理元被讀取並複製到流水線的入口,進入頂點著色器。根據1:1的紋理座標,矩形物件上的每個片段(或畫素)都會被賦予對應位置紋理元的畫素值。
// set render destination
gldrawbuffer(gl_color_attachment0_ext);
// hit all texels in quad.
glpolygonmode(gl_front, gl_fill);
// render quad with unnormalized texcoords
glbegin(gl_quads);
gltexcoord2f(0.0, 0.0);
glvertex2f(0.0, 0.0);
gltexcoord2f(unwidth, 0.0);
glvertex2f(unwidth, 0.0);
gltexcoord2f(unwidth, unheight);
glvertex2f(unwidth, unheight);
gltexcoord2f(0.0, unheight);
glvertex2f(0.0, unheight);
glend();
上面**中設定紋理座標時使用了非單位化的座標值,這是因為使用的紋理種類為gl_texture_rectangle_arb,而gl_texture_2d要求單位化座標。
6)將紋理圖對映至矩形物件
7)讀回資料
void transferfromtexture(float *data)
桌球技術
當演算法有多個步驟時,乙個步驟的計算結果是下乙個步驟的輸入資料時,就需要用到桌球技術。這時。多塊紋理快取需要被分配。它們充當不同階段的輸入、輸出快取。
GPGPU線性複雜度的高維資料降維與視覺化
今天閱讀 vis 2019 會議大資料與降維領域的 gpgpu linear complexity t sne optimization 作者是nicola pezzotti,人工智慧和視覺分析研究科學家和工程師。開發了乙個在 tensorflow.js 家族中發布的開源庫。目前在飛利浦研究公司工作...
前端基礎 call,apply,bind的的理解
背景 前兩天在做小程式的需求的時候用到bind的時候才想起自己對這三的東西的了解比較淺薄,這個時候用的時候就有點怕。時候還是要好好學習下,理解下怎麼玩。let obj1 let obj2 console.log obj1.getname copyes console.log obj1.getname...
Paas Iaas Saas三個概念的形象理解
型別 說明比喻 例子iaas infrastructure as a service 基礎設施即服務 提供的服務是計算基礎設施 地皮,需要自己蓋房子 amazon ec2 亞馬遜彈性雲計算 paas platform as a service 平台即服務 提供的服務是軟體研發的平台或業務基礎平台 商...