《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > CUDA和OpenGL互操作的實現及分析
CUDA和OpenGL互操作的實現及分析
來源:微型機與應用2011年第23期
劉進鋒,郭 雷
(西北工業大學 自動化學院,陜西 西安 710129)
摘要: CUDA和OpenGL互操作的基本方式是使用CUDA生成數據,再利用OpenGL在屏幕上繪制出數據所表示的圖形。兩者的結合可以通過使用OpenGL的PBO(像素緩沖區對象)或VBO(頂點緩沖區對象)兩種方式來實現。描述了CUDA和OpenGL互操作的步驟并展示了一個使用PBO的實例。該實例運行結果表明,互操作的方式比單純使用OpenGL方式快了7~8倍。
Abstract:
Key words :

摘  要: CUDAOpenGL互操作的基本方式是使用CUDA生成數據,再利用OpenGL在屏幕上繪制出數據所表示的圖形。兩者的結合可以通過使用OpenGL的PBO(像素緩沖區對象)或VBO(頂點緩沖區對象)兩種方式來實現。描述了CUDA和OpenGL互操作的步驟并展示了一個使用PBO的實例。該實例運行結果表明,互操作的方式比單純使用OpenGL方式快了7~8倍。
關鍵詞: CUDA;OpenGL;像素緩沖區對象;頂點緩沖區對象

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環境??梢允褂胏uGLCtxCreate或cudaGLSetGLDevice來設置CUDA環境。該設置一定要放在其他CUDA的API調用之前。
 (4)產生一個或多個OpenGL緩沖區用以和CUDA共享。使用PBO和使用VBO差不多,只是有些函數調用參數不同。以下是具體過程。
 GLuint bufferID;
 glGenBuffers(1,&bufferID);//產生一個buffer ID
 glBindBuffer(parameter1,bufferID);
 //將其設置為當前非壓縮緩沖區,如果是PBO方式,parameter1設置為GL_PIXEL_UNPACK_BUFFER,如果
 是VBO方式,parameter1設置為GL_ARRAY_BUFFER
 glBufferData(parameter1,parameter2,NULL,GL_DYNAMIC _COPY);
 //給該緩沖區分配數據,PBO方式下,parameter1設置為GL_PIXEL_UNPACK_BUFFER,parameter1設置為圖像的長度*寬度*4。VBO方式下,parameter1設置為GL_ARRAY_BUFFER,parameter2設置為頂點數*16,因為每個頂點包含3個浮點坐標(x,y,z)和4個顏色字節(RGBA),這樣一個頂點包含16 B
 (5)用CUDA登記緩沖區。登記可以使用cuGLRegisterBufferObject或cudaGLRegisterBufferObject,該命令告訴OpenGL和CUDA 驅動程序該緩沖區為二者共同使用。
 (6)將OpenGL緩沖區映射到CUDA內存??梢允褂胏uGLMapBufferObject或cudaGLMapBufferObject,它實際是將CUDA內存的指針指向OpenGL的緩沖區,這樣如果只有一個GPU,就不需要數據傳遞。當映射完成后,OpenGL不能再使用該緩沖區。
 (7)使用CUDA往該映射的內存寫圖像數據。前面的準備工作在這里真正發揮作用了,此時可以調用CUDA的kernel,像使用全局內存一樣使用映射了的緩沖區,向其中寫數據。
 (8)取消OpenGL緩沖區映射。要等前面CUDA的活動完成以后,使用cuGLUnmapBufferObject或cudaGLUnmapBufferObject函數取消映射。
 (9)前面的步驟完成以后就可以真正開始繪圖了, OpenGL的PBO和VBO的繪圖方式不同,分別為以下兩個過程。
?、偃绻皇抢L制平面圖形,需要使用OpenGL的PBO及紋理。
 glEnable(GL_TEXTURE_2D); //使紋理可用
 glGenTextures(1,&textureID); //生成一個textureID
 glBindTexture(GL_TEXTURE_2D,textureID);
 //使該紋理成為當前可用紋理
 glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,Width, Height,0,GL_BGRA,GL_UNSIGNED_BYTE,NULL);
 //分配紋理內存。最后的參數設置數據來源,這里設置為NULL,表示數據來自PBO,不是來自主機內存
 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN _FILTER,GL_LINEAR);
 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個角的紋理坐標,繪制長方形了。
?、诶L制3D場景,需要使用VBO。
glEnableClientState(GL_VERTEX_ARRAY);
//使頂點和顏色數組可用
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3,GL_FLOAT,16,0);
//設置頂點和顏色指針
glColorPointer(4,GL_UNSIGNED_BYTE,16,12);
glDrawArrays(GL_POINTS,0,numVerticies);
//根據頂點數據繪圖,參數可以使用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上運行,因而該函數及其調用方式要重寫,具體函數如下:
void kernel(uchar4*pos,unsigned int width,unsigned int height,float time)
{ unsigned int index,x,y;
  for(x=0;x<width;x++)
    for(y=0;y<height;y++)
    {   unsigned char r=(x+(int)time)&0xff;
    unsigned char g=(y+(int)time)&0xff;
    unsigned char b=((x+y)+(int)time)&0xff;
    index=x*width+y;
    pos[index].w=0;
    pos[index].x=r;
    pos[index].y=g;
    pos[index].z=b;
     }
}
    其中,參數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+,內存為2 GB。測試時,顯示設置的垂直同步要關閉。
 測試時設置紋理圖像的長和寬都是512,CUDA的線程塊為1 024,每個線程塊內的線程數為256,在OpenGL的顯示回調函數里統計f/s(刷新率),結果如表1所示。

 從實驗結果可以看出,CUDA與OpenGL結合的方式效果顯著,顯示速度比不使用CUDA提高了7~8倍。
CUDA是一種較新的方便使用GPU進行通用計算的架構,OpenGL是圖形處理的工業標準。兩者的互操作充分利用了GPU的特點,因而顯得非常自然和合理,實驗驗證了兩者配合使用的效果。該方式為高性能圖形圖像顯示及科學計算可視化提供了良好的模式架構。
參考文獻
[1] WRIGHT R S, LIPCHAK B, HAEMEL N. 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/architecture-and-design/222600097.

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          中文av一区特黄| 国产欧美日韩在线播放| 国产精品系列在线播放| 欧美精选一区| 亚洲日本成人女熟在线观看| 国产欧美一级| 亚洲黄色一区| 欧美成人黑人xx视频免费观看| 国产精品色一区二区三区| 国产日韩欧美一区二区三区四区| 久久综合狠狠| 国产午夜精品一区二区三区欧美| 欧美成人按摩| 国产精品网站在线播放| 欧美午夜精品久久久久久人妖| 亚洲黄色有码视频| 欧美日韩成人在线观看| 韩日午夜在线资源一区二区| 国产日韩精品一区二区| 亚洲国产aⅴ天堂久久| 欧美在线观看一区二区| 国产一区二区三区免费不卡| 欧美激情综合色综合啪啪| a4yy欧美一区二区三区| 久久伊人精品天天| 亚洲人精品午夜| 久久国产精品一区二区| 欧美午夜电影一区| 亚洲美女尤物影院| 国产精品www| 欧美日本三区| 亚洲伦理在线免费看| 鲁大师影院一区二区三区| 蜜桃av一区二区| 最新中文字幕一区二区三区| 国产伪娘ts一区| 国产三级精品在线不卡| 国产精品每日更新在线播放网址| 在线亚洲美日韩| 欧美第一黄色网| 欧美日韩网址| 国产日韩欧美精品综合| 久久婷婷久久| 欧美在线观看一区二区三区| 欧美精品一二三| 亚洲激情在线观看| 国产字幕视频一区二区| 一区二区三区久久精品| 久久都是精品| 麻豆91精品91久久久的内涵| 小黄鸭精品aⅴ导航网站入口| 欧美精品在线一区二区三区| 欧美一区二区三区日韩| 欧美大香线蕉线伊人久久国产精品| 亚洲国产精品精华液网站| 国产精品99久久久久久久女警| 亚洲国产精品va在线看黑人动漫| 久久国产精品72免费观看| 欧美久久视频| 国产欧美视频一区二区| 国产精品裸体一区二区三区| 国产精品videossex久久发布| 欧美精品在线观看播放| 精品盗摄一区二区三区| 欧美激情一区二区久久久| 亚洲最新色图| 亚洲第一福利视频| 亚洲精品视频二区| 国产精品免费一区二区三区观看| 亚洲区在线播放| 国产精品极品美女粉嫩高清在线| 国产精品永久免费观看| 一色屋精品视频免费看| 欧美日韩综合| 久久夜色精品国产欧美乱| 欧美日韩精品一二三区| 一区二区三区欧美| 国内偷自视频区视频综合| 免费毛片一区二区三区久久久| 欧美大秀在线观看| 欧美风情在线观看| 最新69国产成人精品视频免费| 欧美亚洲一区三区| 国产精品揄拍500视频| 又紧又大又爽精品一区二区| 欧美高清视频www夜色资源网| 一区二区免费在线播放| 久久精品视频亚洲| 亚洲毛片av在线| 欧美日韩国产首页在线观看| 亚洲最新中文字幕| 合欧美一区二区三区| 亚洲美女视频网| 国产一二精品视频| 一区二区三区高清在线观看| 亚洲欧美日韩精品在线| 欧美一级视频| 尤物精品国产第一福利三区| 91久久久精品| 日韩视频免费观看| 亚洲午夜伦理| 欧美精品一区二区高清在线观看| 久久aⅴ国产欧美74aaa| 精品1区2区3区4区| 欧美激情免费在线| 亚洲精品美女免费| 蜜臀av国产精品久久久久| 夜夜爽99久久国产综合精品女不卡| 红桃视频成人| 欧美中文字幕视频在线观看| 夜夜爽夜夜爽精品视频| 精品999在线观看| 亚洲茄子视频| 亚洲国产精品一区在线观看不卡| 欧美刺激性大交免费视频| 一本色道久久综合狠狠躁篇怎么玩| 尤物精品国产第一福利三区| 激情综合中文娱乐网| 亚洲精品男同| 久久阴道视频| 欧美性大战xxxxx久久久| 久久这里有精品视频| 国产精品久久久久久久久久三级| 国产精品豆花视频| 国产日韩一区二区三区在线| 亚洲成人资源| 1000精品久久久久久久久| 国产精品乱码一区二三区小蝌蚪| 欧美一区二区精美| 亚洲欧美成aⅴ人在线观看| 亚洲一区二区三区在线| 国外成人在线| 亚洲一区二区四区| 另类专区欧美制服同性| 久久国产一区二区三区| 欧美a级理论片| 日韩一区二区高清| 欧美精品国产精品| 久久夜色精品亚洲噜噜国产mv| 欧美极品在线观看| 亚洲午夜激情网站| 欧美国产日韩一区二区三区| 亚洲美女91| 免费日韩av| 怡红院精品视频在线观看极品| 欧美成人高清视频| 黑人一区二区三区四区五区| 欧美午夜欧美| 最新热久久免费视频| 久久久www成人免费精品| 伊人久久综合97精品| 亚洲视频在线观看一区| 日韩手机在线导航| 亚洲另类在线视频| 欧美一区二区在线视频| 亚洲综合色丁香婷婷六月图片| 国产真实精品久久二三区| 国产偷自视频区视频一区二区| 日韩视频精品在线| 国产精品久久久久9999吃药| 日韩视频在线观看| 欧美日韩福利视频| 欧美一区二区三区在线视频| 亚洲国产专区校园欧美| 欧美国产一区在线| 99ri日韩精品视频| 国产精品成人一区二区三区吃奶| 激情视频亚洲| 亚洲性夜色噜噜噜7777| 麻豆亚洲精品| 欧美精品精品一区| 91久久久久久| 欧美视频在线观看| 麻豆九一精品爱看视频在线观看免费| 海角社区69精品视频| 亚洲精品亚洲人成人网| 欧美一区二区三区免费观看| 玖玖国产精品视频| 午夜亚洲性色视频| 亚洲专区在线| 禁久久精品乱码| 亚洲日本va午夜在线影院| 欧美精品电影在线| 亚洲精品久久久蜜桃| 欧美激情一区二区在线| 国产精品视频区| 国产精品美女久久久久av超清| 黄色成人在线网址| 国产一区香蕉久久| 欧美一区二区三区在线观看| 国产精品私房写真福利视频| 激情久久综合| 亚洲一区成人| 久久精品在线观看| 亚洲在线观看视频网站| 在线精品视频在线观看高清| 欧美精品一区二区高清在线观看| 久久精品视频免费播放| 狂野欧美激情性xxxx| 国产精品欧美在线| 欧美国产视频一区二区| 国产欧美丝祙| 国产片一区二区| 99国产成+人+综合+亚洲欧美| 亚洲无人区一区| 激情久久久久久| 久久婷婷国产综合尤物精品| 91久久夜色精品国产网站| 欧美三级在线播放| 久久只有精品| 国产精品美女在线观看| 欧美一区二区三区免费观看视频| 国产三区精品| 欧美激情二区三区| 国产精品久久一区主播| 亚洲午夜羞羞片| 国产精品成人av性教育| 国产一区二区黄色| 欧美大片在线观看一区二区| 在线电影欧美日韩一区二区私密| 亚洲精品日韩激情在线电影| 欧美成人亚洲成人| 久久精品国产一区二区三区免费看| 制服丝袜激情欧洲亚洲| 乱中年女人伦av一区二区| 国产精品久久婷婷六月丁香| 亚洲午夜日本在线观看| 欧美激情一区二区三区| 欧美激情一区二区三级高清视频| 一区二区三区精品在线| 国产精品一区二区你懂得| 欧美精品亚洲一区二区在线播放| 久久精品九九| 亚洲视频在线观看一区| 免费成年人欧美视频| 欧美日韩大片一区二区三区| 欧美三级日韩三级国产三级| 国产农村妇女精品| 亚洲一级高清| 久久中文精品| 亚洲欧美日韩精品| 99精品视频免费| 国产一区二区三区在线播放免费观看| 亚洲美女中文字幕| 国精产品99永久一区一区| 国产精品一区=区| 国产欧美日韩免费| 狠色狠色综合久久| 国产欧美日韩不卡免费| 亚洲日本视频| 在线观看成人av电影| 国产精品国码视频| 亚洲精品三级| 黄色成人在线免费| 亚洲私拍自拍| 亚洲精品一区二区在线| 国产精品午夜av在线| 国产精品无码永久免费888| 欧美日韩美女在线观看| 亚洲女女女同性video| 久久久久国产精品一区二区| 国产精品国产三级国产aⅴ9色| 亚洲激情视频网| 欧美日韩在线精品一区二区三区| 野花国产精品入口| 国产在线精品一区二区夜色| 国产精品久久一卡二卡| 欧美成人伊人久久综合网| 最新成人av网站| 亚洲伊人网站| 国产一区二区在线观看免费播放| 欧美一级视频一区二区| 欧美激情视频一区二区三区不卡| 久久国产免费看| 欧美一区二区三区在线观看| 国产日本欧美一区二区三区| 亚洲美女福利视频网站| 99精品国产在热久久下载| 亚洲精品国产精品久久清纯直播| 激情五月***国产精品| 久久激情综合| 欧美激情一区二区三区不卡| 久久精品国产999大香线蕉| 中国成人黄色视屏| 伊人色综合久久天天| 亚洲欧美日韩精品久久久久| 久久黄色级2电影| 欧美精品日韩www.p站| 夜夜爽99久久国产综合精品女不卡| 亚洲欧美在线一区二区| 欧美国产日韩一区二区三区| 欧美一区二区在线| 久久手机免费观看| 欧美91福利在线观看| 榴莲视频成人在线观看| 欧美色图一区二区三区| 国精品一区二区三区| 欧美视频一区二| 亚洲激情成人在线| 亚洲欧美国产77777| 久久夜色精品国产| 亚洲欧洲在线一区| 亚洲精品久久久久久下一站| 久久久久国内| 欧美一区二区三区婷婷月色| 欧美日韩福利在线观看| 欧美激情综合| 国产日韩欧美在线| 免费91麻豆精品国产自产在线观看| 在线一区亚洲| 亚洲欧美日韩精品久久久| 中文在线一区| 国产亚洲一区二区三区在线播放| 夜夜嗨av色一区二区不卡| 欧美午夜免费电影| 亚洲国产老妈| 久久精品亚洲一区二区三区浴池| 欧美日韩在线精品一区二区三区| 欧美日韩亚洲一区在线观看| 国产精品久久一卡二卡| 欧美三级欧美一级| 国产精品成av人在线视午夜片| 欧美黄色一级视频| 欧美另类高清视频在线| 校园春色国产精品| 女人天堂亚洲aⅴ在线观看| 中文欧美在线视频| 亚洲免费在线视频一区 二区|