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

CUDA和OpenGL互操作的實(shí)現(xiàn)及分析*

2011-07-28 01:32:14劉進(jìn)鋒
關(guān)鍵詞:設(shè)置

劉進(jìn)鋒,郭 雷

(西北工業(yè)大學(xué) 自動(dòng)化學(xué)院,陜西 西安 710129)

1 CUDA與OpenGL概述

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

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

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

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

(1)使用 OpenGL的 PBO(像素緩沖區(qū)對象)。在該方式下,CUDA直接生成像素?cái)?shù)據(jù),OpenGL顯示這些像素;

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

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

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

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

(1)創(chuàng)建窗口及OpenGL運(yùn)行環(huán)境。

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

(3)創(chuàng)建CUDA環(huán)境。可以使用cuGLCtxCreate或cudaGLSetGLDevice來設(shè)置CUDA環(huán)境。該設(shè)置一定要放在其他CUDA的API調(diào)用之前。

(4)產(chǎn)生一個(gè)或多個(gè)OpenGL緩沖區(qū)用以和CUDA共享。使用PBO和使用VBO差不多,只是有些函數(shù)調(diào)用參數(shù)不同。以下是具體過程。

//給該緩沖區(qū)分配數(shù)據(jù),PBO方式下,parameter1設(shè)置為GL_PIXEL_UNPACK_BUFFER,parameter1設(shè)置為圖像的長度*寬度*4。VBO方式下,parameter1設(shè)置為GL_ARRAY_BUFFER,parameter2設(shè)置為頂點(diǎn)數(shù)*16,因?yàn)槊總€(gè)頂點(diǎn)包含3個(gè)浮點(diǎn)坐標(biāo)(x,y,z)和4個(gè)顏色字節(jié)(RGBA),這樣一個(gè)頂點(diǎn)包含16B

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

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

(7)使用CUDA往該映射的內(nèi)存寫圖像數(shù)據(jù)。前面的準(zhǔn)備工作在這里真正發(fā)揮作用了,此時(shí)可以調(diào)用CUDA的kernel,像使用全局內(nèi)存一樣使用映射了的緩沖區(qū),向其中寫數(shù)據(jù)。

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

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

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

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

然后就可以指定4個(gè)角的紋理坐標(biāo),繪制長方形了。

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

//根據(jù)頂點(diǎn)數(shù)據(jù)繪圖,參數(shù)可以使用GL_LINES,GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES,GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS,GL_QUAD_STRIP,GL_POLYGON

(10)前后緩存區(qū)來回切換,實(shí)現(xiàn)動(dòng)畫顯示效果。調(diào)用SwapBuffers(),緩沖區(qū)切換通常會在垂直刷新間隙來處理,因此,可以在控制面板上關(guān)掉垂直同步,使得緩沖區(qū)切換立刻進(jìn)行。

3 CUDA和OpenGL互操作性能實(shí)例分析

3.1 測試實(shí)例

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

如果不使用CUDA,整個(gè)程序結(jié)構(gòu)變化不大,主要差別是生成該紋理圖案的函數(shù)在CPU上運(yùn)行,因而該函數(shù)及其調(diào)用方式要重寫,具體函數(shù)如下:

其中,參數(shù)pos表示像素?cái)?shù)組,width為圖像寬度,height為圖像高度,time是每次調(diào)用該函數(shù)時(shí)固定遞增的一個(gè)值。

3.2 測試結(jié)果

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

測試時(shí)設(shè)置紋理圖像的長和寬都是512,CUDA的線程塊為1 024,每個(gè)線程塊內(nèi)的線程數(shù)為256,在OpenGL的顯示回調(diào)函數(shù)里統(tǒng)計(jì)f/s(刷新率),結(jié)果如表1所示。

從實(shí)驗(yàn)結(jié)果可以看出,CUDA與OpenGL結(jié)合的方式效果顯著,顯示速度比不使用CUDA提高了7~8倍。

CUDA是一種較新的方便使用GPU進(jìn)行通用計(jì)算的架構(gòu),OpenGL是圖形處理的工業(yè)標(biāo)準(zhǔn)。兩者的互操作充分利用了GPU的特點(diǎn),因而顯得非常自然和合理,實(shí)驗(yàn)驗(yàn)證了兩者配合使用的效果。該方式為高性能圖形圖像顯示及科學(xué)計(jì)算可視化提供了良好的模式架構(gòu)。

表1 兩種測試環(huán)境下使用和不使用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.

猜你喜歡
設(shè)置
中隊(duì)崗位該如何設(shè)置
船舶防火結(jié)構(gòu)及設(shè)置的缺陷與整改
水上消防(2020年5期)2020-12-14 07:16:18
中外醫(yī)學(xué)專業(yè)與專科設(shè)置對比分析及啟示
特殊場景下列控等級轉(zhuǎn)換的設(shè)置方案
7招教你手動(dòng)設(shè)置參數(shù)
動(dòng)車段(所)股道有效長設(shè)置研究
我國中小學(xué)將設(shè)置人工智能相關(guān)課程
玩具世界(2017年9期)2017-11-24 05:17:29
吃紙的妖怪
本刊欄目設(shè)置說明
中俄臨床醫(yī)學(xué)專業(yè)課程設(shè)置的比較與思考
主站蜘蛛池模板: 成人伊人色一区二区三区| 日韩无码视频专区| 亚洲无码电影| 免费看av在线网站网址| 2021亚洲精品不卡a| 国产成a人片在线播放| 伊人久热这里只有精品视频99| 欧美中文字幕无线码视频| yy6080理论大片一级久久| 免费国产在线精品一区| 精品国产成人av免费| 97综合久久| 亚洲一道AV无码午夜福利| 19国产精品麻豆免费观看| 亚洲三级成人| 久久精品无码国产一区二区三区| 久久久久无码精品| 91视频精品| 高清乱码精品福利在线视频| 亚洲欧美自拍视频| 国产浮力第一页永久地址| 亚洲人成网18禁| 好吊色妇女免费视频免费| 91无码网站| 国产毛片片精品天天看视频| 亚洲欧美天堂网| 日韩a级片视频| 第一区免费在线观看| 亚洲天堂视频网| 国产精品久久精品| 国产精品久久久久婷婷五月| 四虎永久在线| 福利在线不卡一区| 国产亚洲精久久久久久无码AV | 91成人在线观看视频| 日韩黄色大片免费看| 精品午夜国产福利观看| 黄色网站在线观看无码| 欧美国产日韩在线观看| 久久久久久久久久国产精品| 国产精品女主播| 久久久久久午夜精品| 亚洲色成人www在线观看| 国产日韩欧美成人| 欧美三级日韩三级| 手机在线国产精品| 丝袜美女被出水视频一区| 片在线无码观看| 91精品专区| 国产美女自慰在线观看| 亚洲永久视频| 99精品一区二区免费视频| a欧美在线| 91精品免费高清在线| 国产香蕉在线| 一级一级一片免费| 久久天天躁夜夜躁狠狠| 国产91透明丝袜美腿在线| 91青草视频| 日韩A级毛片一区二区三区| 青青青国产视频| 国产精品福利导航| 国产在线91在线电影| 亚洲欧洲日本在线| 亚洲午夜福利精品无码不卡| 成色7777精品在线| 色哟哟精品无码网站在线播放视频| 日韩区欧美区| 亚洲欧美不卡| 91在线免费公开视频| 国产精品免费福利久久播放| 国产00高中生在线播放| 在线色国产| 欧美a在线看| 制服丝袜无码每日更新| 在线欧美a| 中文字幕在线看视频一区二区三区| 国产香蕉97碰碰视频VA碰碰看| 国产精品黄色片| 91精品免费久久久| 欧美中文字幕无线码视频| 国产乱子伦精品视频|