999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

CUDA和OpenGL互操作的實現及分析*

2011-07-28 01:32:14劉進鋒
網絡安全與數據管理 2011年23期
關鍵詞:設置

劉進鋒,郭 雷

(西北工業大學 自動化學院,陜西 西安 710129)

1 CUDA與OpenGL概述

OpenGL是圖形硬件的軟件接口,它是在SGI等多家世界著名的計算機公司的倡導下,以SGI的GL三維圖形庫為基礎制定的一個通用、共享的、開放式的、性能卓越的三維圖形標準。OpenGL在醫學成像、地理信息、石油勘探、氣候模擬以及娛樂動畫上有著廣泛應用,它已經成為高性能圖形和交互式視景處理的工業標準。

OpenGL不是一種編程語言,而是一種 API(應用程序編程接口)。程序員可以使用某種編程語言 (如C或C++)編寫繪圖軟件,其中調用了一個或多個 OpenGL庫函數。作為一種API,OpenGL遵循C語言的調用約定。OpenGL開發資料可參考文獻[1]和參考文獻[2]。

圖形處理器(GPU)原本是處理計算機圖形的專用設備,近十年來,由于高清晰度復雜圖形實時處理的需求,GPU發展成為高并行度、多線程、多核的處理器。目前,主流GPU的運算能力已超過主流通用CPU,從發展趨勢上來看將來差距會越拉越大。為了合理地利用GPU資源,CUDA(統一計算設備架構)應運而生。CUDA是一種由NVIDIA推出的通用并行計算架構[3],該架構使GPU能夠解決復雜的計算問題,并且由于CUDA編程語言基于標準的C語言,從而大大提高了可編程性。

CUDA和OpenGL互操作的基本方式是使用CUDA生成數據,然后使用OpenGL在屏幕上繪制出數據所表示的圖形。兩者的結合可以通過兩種方式來實現:

(1)使用 OpenGL的 PBO(像素緩沖區對象)。在該方式下,CUDA直接生成像素數據,OpenGL顯示這些像素;

(2)使用 OpenGL的 VBO(頂點緩沖區對象)。在該方式下,CUDA生成頂點網格數據,OpenGL可以根據需要繪制出平滑的表面圖或線框圖或一系列頂點。

這兩種方式的核心都是利用cudaGLMapBufferObject函數將OpenGL的緩沖區映射到CUDA的內存空間上,這樣,程序員就可以充分利用CUDA的優點寫出性能高的程序在該內存空間上生成數據,這些數據不需要傳送,OpenGL可以直接使用。如果不使用CUDA,這些數據需要由CPU來計算產生。一方面,CPU的計算速度通常比GPU慢;另一方面,這些數據需要傳送到GPU上以供OpenGL顯示使用。鑒于此,當數據量很大時,CUDA和OpenGL的混合使用效果明顯。

2 CUDA和OpenGL互操作的過程[4]

CUDA和OpenGL互操作具體步驟如下:

(1)創建窗口及OpenGL運行環境。

(2)設置OpenGL視口和坐標系。要根據繪制的圖形是2D還是3D等具體情況設置。(1)和(2)是所有OpenGL程序必需的,這里也沒什么特殊之處,需要注意的是,后面的一些功能需要OpenGL 2.0及以上版本支持,所以在這里需要進行版本檢查。

(3)創建CUDA環境。可以使用cuGLCtxCreate或cudaGLSetGLDevice來設置CUDA環境。該設置一定要放在其他CUDA的API調用之前。

(4)產生一個或多個OpenGL緩沖區用以和CUDA共享。使用PBO和使用VBO差不多,只是有些函數調用參數不同。以下是具體過程。

//給該緩沖區分配數據,PBO方式下,parameter1設置為GL_PIXEL_UNPACK_BUFFER,parameter1設置為圖像的長度*寬度*4。VBO方式下,parameter1設置為GL_ARRAY_BUFFER,parameter2設置為頂點數*16,因為每個頂點包含3個浮點坐標(x,y,z)和4個顏色字節(RGBA),這樣一個頂點包含16B

(5)用CUDA登記緩沖區。登記可以使用cuGLRegisterBufferObject或 cudaGLRegisterBufferObject,該命令告訴OpenGL和CUDA 驅動程序該緩沖區為二者共同使用。

(6)將OpenGL緩沖區映射到CUDA內存。可以使用cuGLMapBufferObject或 cudaGLMapBufferObject,它實際是將CUDA內存的指針指向OpenGL的緩沖區,這樣如果只有一個GPU,就不需要數據傳遞。當映射完成后,OpenGL不能再使用該緩沖區。

(7)使用CUDA往該映射的內存寫圖像數據。前面的準備工作在這里真正發揮作用了,此時可以調用CUDA的kernel,像使用全局內存一樣使用映射了的緩沖區,向其中寫數據。

(8)取消OpenGL緩沖區映射。要等前面CUDA的活動完成以后,使用 cuGLUnmapBufferObject或cudaGLUnmapBufferObject函數取消映射。

(9)前面的步驟完成以后就可以真正開始繪圖了,OpenGL的PBO和VBO的繪圖方式不同,分別為以下兩個過程。

①如果只是繪制平面圖形,需要使用OpenGL的PBO及紋理。

glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//必 須 設 置 濾 波 模 式 ,GL_LINEAR 允許圖形伸縮時線性差值。如果不需要線性差值,可以用GL_TEXTURE_RECTANGLE_ARB代替GL_TEXTURE_2D以提高性能,同時在 glTexParameteri()調用里使用 GL_NEAREST替換GL_LINEAR

然后就可以指定4個角的紋理坐標,繪制長方形了。

②繪制3D場景,需要使用VBO。

//根據頂點數據繪圖,參數可以使用GL_LINES,GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES,GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS,GL_QUAD_STRIP,GL_POLYGON

(10)前后緩存區來回切換,實現動畫顯示效果。調用SwapBuffers(),緩沖區切換通常會在垂直刷新間隙來處理,因此,可以在控制面板上關掉垂直同步,使得緩沖區切換立刻進行。

3 CUDA和OpenGL互操作性能實例分析

3.1 測試實例

這是一個相對簡單的實例,其主要功能是不斷地動態改變一個紋理圖案中每個像素的顏色并顯示。該實例使用了OpenGL的PBO并利用了OpenGL與CUDA互操作方式,紋理圖案數據的生成主要由CUDA的kernel函數完成,完整程序及CUDA的kernel函數請參看參考文獻[5]。

如果不使用CUDA,整個程序結構變化不大,主要差別是生成該紋理圖案的函數在CPU上運行,因而該函數及其調用方式要重寫,具體函數如下:

其中,參數pos表示像素數組,width為圖像寬度,height為圖像高度,time是每次調用該函數時固定遞增的一個值。

3.2 測試結果

上述實例在兩種環境中做了實驗,CUDA版本都是3.2。測試環境1的主要配置如下:CPU為Intel Core i3-M380, 主頻為 2.53 GHz,GPU為 NVIDIA NVS 3100M,內存為2 GB。測試環境2的主要配置如下:CPU是Intel Core2 duo E7400,主頻為 2.8 GHz,GPU 使用 GeForce 9800 GTX+,內存為2GB。測試時,顯示設置的垂直同步要關閉。

測試時設置紋理圖像的長和寬都是512,CUDA的線程塊為1 024,每個線程塊內的線程數為256,在OpenGL的顯示回調函數里統計f/s(刷新率),結果如表1所示。

從實驗結果可以看出,CUDA與OpenGL結合的方式效果顯著,顯示速度比不使用CUDA提高了7~8倍。

CUDA是一種較新的方便使用GPU進行通用計算的架構,OpenGL是圖形處理的工業標準。兩者的互操作充分利用了GPU的特點,因而顯得非常自然和合理,實驗驗證了兩者配合使用的效果。該方式為高性能圖形圖像顯示及科學計算可視化提供了良好的模式架構。

表1 兩種測試環境下使用和不使用CUDA的性能比較

[1]WRIGHTR S, LIPCHAK B, HAEMELN.OpenGL superbible(Fourth Edition)[M].Addison-Wesley,2007.

[2]AHN S H.The OpenGL tutorials[OL].[2011-09-01].http://songho.ca/opengl/.

[3]NVIDIA Corporation.NVIDIA CUDA programming Guide Version 3.2[OL].Mar.2011,http://developer.nvidia.com/cuda.

[4]STAM J.What every CUDA programmer needs to know about OpenGL[OL].[2011-09-01].http://nvidia.fullviewmedia.com/GPU2009/1001-valley-1055.html.

[5]FARBER R.CUDA, supercomputing for the masses: Part 15[OL]. [2011-09-01].http://www.drdobbs.com/architectureand-design/222600097.

猜你喜歡
設置
中隊崗位該如何設置
少先隊活動(2021年4期)2021-07-23 01:46:22
船舶防火結構及設置的缺陷與整改
水上消防(2020年5期)2020-12-14 07:16:18
中外醫學專業與專科設置對比分析及啟示
特殊場景下列控等級轉換的設置方案
7招教你手動設置參數
動車段(所)股道有效長設置研究
我國中小學將設置人工智能相關課程
玩具世界(2017年9期)2017-11-24 05:17:29
吃紙的妖怪
本刊欄目設置說明
中俄臨床醫學專業課程設置的比較與思考
主站蜘蛛池模板: 2018日日摸夜夜添狠狠躁| 91精品国产福利| 91精品综合| 国产嫩草在线观看| 亚洲精品无码AⅤ片青青在线观看| 999精品免费视频| 国产欧美专区在线观看| 亚洲成在人线av品善网好看| 99久久精品免费视频| 欧美黄色网站在线看| 91尤物国产尤物福利在线| 国产视频你懂得| 亚洲Va中文字幕久久一区| 97人人做人人爽香蕉精品| 中文一级毛片| 欧美成人国产| 欧美成人精品一级在线观看| 中文字幕欧美日韩高清| 亚洲av无码久久无遮挡| 日韩少妇激情一区二区| 波多野结衣国产精品| 亚洲人成影视在线观看| 色屁屁一区二区三区视频国产| 国产亚洲高清在线精品99| 精品無碼一區在線觀看 | 亚洲视屏在线观看| 欧美福利在线观看| 欧美日韩中文国产va另类| 午夜性刺激在线观看免费| 久久精品无码一区二区国产区| 亚洲中文字幕在线一区播放| JIZZ亚洲国产| 亚洲视频二| 中文字幕久久亚洲一区| 五月天综合婷婷| 中文字幕无码中文字幕有码在线| 亚洲成网站| 国产精品私拍在线爆乳| 国产女人18水真多毛片18精品 | 亚洲有码在线播放| 日韩免费中文字幕| 尤物亚洲最大AV无码网站| 欧美全免费aaaaaa特黄在线| 国产第一页亚洲| 日韩视频免费| 久久午夜夜伦鲁鲁片无码免费| 国产成人一二三| 蜜桃臀无码内射一区二区三区 | 国产屁屁影院| 国产无码网站在线观看| 国产视频一区二区在线观看| 国内嫩模私拍精品视频| 真实国产乱子伦视频| 91国内在线观看| 欧美自慰一级看片免费| 丁香婷婷激情网| 欧美日韩一区二区在线免费观看 | 日韩精品无码一级毛片免费| 美美女高清毛片视频免费观看| 久一在线视频| 日本亚洲国产一区二区三区| 久一在线视频| AV老司机AV天堂| 在线视频精品一区| 欧美一级大片在线观看| 欧美午夜小视频| 色首页AV在线| 欧美在线视频不卡| 成人午夜在线播放| 亚洲熟妇AV日韩熟妇在线| 成人午夜免费观看| 久久人与动人物A级毛片| 国产97区一区二区三区无码| 久久综合色播五月男人的天堂| 亚洲人成网站日本片| 黄色福利在线| 免费人成视频在线观看网站| 欧美一级高清片久久99| 国产无码在线调教| 欧美人与牲动交a欧美精品 | 亚洲欧洲天堂色AV| 国产精品久久久久久久久久98|