版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
GPU并行計(jì)算與CUDA編程第10課本周介紹內(nèi)容CUDA與OpenGL混合編程做圖形渲染OpenGL介紹OpenGL安裝CUDA混合編程代碼例程:simpleGL.cuOpenGL介紹無(wú)論是對(duì)于游戲軟件還是高性能計(jì)算,OpenGL是可視化程序最通用的編程接口。作為一種標(biāo)準(zhǔn)化接口,開(kāi)發(fā)者可以使用OpenGL制作出運(yùn)行在任何支持OpenGL硬件和操作系統(tǒng)的圖形和特效,使得3D游戲軟件可以移植到多種平臺(tái)上。參考《WhateEveryCUDAProgrammerShouldKnowaboutOpenGL》:“參考資料/1055_gtc09.pdf”O(jiān)penGL介紹-CUDA和OpenGL的分離從編程角度
當(dāng)OpenGL將內(nèi)存映射入CUDA內(nèi)存空間之前,OpenGL的專家可以盡量地利用舊式程序和他們的專業(yè)知識(shí),以及所有強(qiáng)大的工具,如GLSL(OpenGLShadingLanguage)和Cg。當(dāng)緩沖區(qū)映射入CUDA內(nèi)存空間之后,CUDA編程者則可以展現(xiàn)他們的計(jì)算才能。從開(kāi)發(fā)投入的角度
該映射方式可有效利用現(xiàn)有的傳統(tǒng)OpenGL軟件。從本質(zhì)上說(shuō),通過(guò)將緩沖區(qū)映射到CUDA存儲(chǔ)空間,DUDA代碼可以逐步加入到現(xiàn)有的傳統(tǒng)支持庫(kù)與應(yīng)用程序中。該特性使得一些組織可以在較低風(fēng)險(xiǎn)下測(cè)試CUDA代碼,從這種編程方法中獲得了性能和編程效率上的好處。OpenGL介紹:GLUTOpenGL實(shí)用工具(OpenGLUtilityToolkit,GLUT)是用于編寫(xiě)?yīng)毩⒂诖翱谙到y(tǒng)的OpenGL程序的編程接口。使用GLUT編寫(xiě)的程序可以在多種平臺(tái)上編譯。NVIDIA在CUDASDK示例中也是用了GLUT。
功能:
1.進(jìn)行OpenGL渲染的窗口
2.處理毀掉驅(qū)動(dòng)事件
3.鼠標(biāo)和鍵盤(pán)輸入設(shè)備OpenGL安裝:Ubuntu下安裝OpenGL圖形庫(kù)1.安裝OpenGLLibrarysudoapt-getinstalllibgl1-mesa-dev2.安裝OpenGLUtilities(OpenGLUtilities是一組建構(gòu)于OpenGLLibrary之上的工具組,提供許多很方便的函式,使OpenGL更強(qiáng)大且更容易使用。)sudoapt-getinstalllibglu1-mesa-dev3.安裝OpenGLUtilityToolkit(OpenGLUtilityToolkit是建立在OpenGLUtilities上面的工具箱,除了強(qiáng)化了OpenGLUtilities的不足之外,也增加了OpenGL對(duì)于視窗界面支援)sudoapt-getinstallfreeglut3-dev4.安裝glew(glew是一個(gè)跨平臺(tái)的C++庫(kù),是一個(gè)OpenGL圖形接口擴(kuò)展庫(kù))sudoapt-getinstalllibglew-dev5.安裝glx(glx是linux下OpenGL的XWindowSystem接口擴(kuò)展庫(kù),它允許通過(guò)x調(diào)用OpenGL庫(kù))sudoapt-getinstalllibgl1-mesa-glxOpenGL不同頭文件及庫(kù)的說(shuō)明參考:“參考資料/OpenGL不同頭文件及庫(kù)的說(shuō)明.pdf”混合編程:通過(guò)OpenGL映射GPU內(nèi)存從CUDA編程者角度看,OpenGL在GPU上創(chuàng)建并管理的通過(guò)緩沖的內(nèi)存區(qū)域稱為緩沖對(duì)象。CUDAKernel將一段緩沖映射如CUDA內(nèi)存空間,可實(shí)現(xiàn)CUDA和OpenGL的互操作。當(dāng)釋放該緩沖或解除映射時(shí),其控制權(quán)重回OpenGL。因?yàn)椴恍枰M(jìn)行內(nèi)存拷貝,所以映射是一種處理速度很快的低開(kāi)銷操作,實(shí)現(xiàn)OpenGL和CUDA之間的高速互操作能力。與OpenGL進(jìn)行互操作,需要在所有其他Runtime調(diào)用之前用cudaGLSetGLDevice()函數(shù)來(lái)指定CUDA設(shè)備。注意,cudaSetDevice()和cudaGLSetGLDevice()是互相排斥的。一旦對(duì)某個(gè)資源對(duì)CUDA進(jìn)行了注冊(cè),便可以根據(jù)需要通過(guò)cudaGraphicsMapResources()和sourceSetMapFlags()方法可用于設(shè)備提示標(biāo)識(shí)(例如,只讀,只寫(xiě)等),以便CUDA驅(qū)動(dòng)程序進(jìn)行優(yōu)化資源管理?;旌暇幊蹋篊UDA使用的兩種OpenGL內(nèi)存對(duì)象像素緩沖對(duì)象(PBO):OpenGL中用于存儲(chǔ)像素的一段內(nèi)存。2D圖像是由多個(gè)像素和顏色點(diǎn)組成的。CUDA程序映射PBO,并逐個(gè)像素生成或修改圖像,然后利用OpenGL進(jìn)行顯示。向量緩沖對(duì)象(VBO):OpenGL中用于存儲(chǔ)3D向量的一段內(nèi)存。CUDA程序映射VBO,生成或修改3D位置信息,之后OpenGL將這些網(wǎng)格渲染成彩色表面、3D線框圖像或3D點(diǎn)集。
glBindBuffer()
glBufferData()/glBufferSubData()/glGetBufferSubData()
glMapBuffer()/glUnmapBuffer()混合編程:步驟CUDA和OpenGL互操作具體步驟如下:(1)創(chuàng)建窗口及OpenGL運(yùn)行環(huán)境。(2)設(shè)置OpenGL視口和坐標(biāo)系。要根據(jù)繪制的圖形是2D還是3D等具體情況設(shè)置。(1)和(2)是所有OpenGL程序必需的,這里也沒(méi)什么特殊之處,需要注意的是,后面的一些功能需要OpenGL2.0及以上版本支持,所以在這里需要進(jìn)行版本檢查。(3)創(chuàng)建CUDA環(huán)境??梢允褂胏uGLCtxCreate或cudaGLSetGLDevice來(lái)設(shè)置CUDA環(huán)境。該設(shè)置一定要放在其他CUDA的API調(diào)用之前。(4)產(chǎn)生一個(gè)或多個(gè)OpenGL緩沖區(qū)用以和CUDA共享。使用PBO和使用VBO差不多,只是有些函數(shù)調(diào)用參數(shù)不同。以下是具體過(guò)程。GLuintbufferID;glGenBuffers(1,&bufferID);//產(chǎn)生一個(gè)bufferIDglBindBuffer(parameter1,bufferID);//將其設(shè)置為當(dāng)前非壓縮緩沖區(qū),如果是PBO方式,parameter1設(shè)置為GL_PIXEL_UNPACK_BUFFER,如果是VBO方式,parameter1設(shè)置為GL_ARRAY_BUFFERglBufferData(parameter1,parameter2,NULL,GL_DYNAMIC_COPY);//給該緩沖區(qū)分配數(shù)據(jù),PBO方式下,parameter1設(shè)置為GL_PIXEL_UNPACK_BUFFER,parameter2設(shè)置為圖像的長(zhǎng)度*寬度*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)存??梢允褂胏uGLMapBufferObject或cudaGLMapBufferObject,它實(shí)際是將CUDA內(nèi)存的指針指向OpenGL的緩沖區(qū),這樣如果只有一個(gè)GPU,就不需要數(shù)據(jù)傳遞。當(dāng)映射完成后,OpenGL不能再使用該緩沖區(qū)。(7)使用CUDA往該映射的內(nèi)存寫(xiě)圖像數(shù)據(jù)。前面的準(zhǔn)備工作在這里真正發(fā)揮作用了,此時(shí)可以調(diào)用CUDA的kernel,像使用全局內(nèi)存一樣使用映射了的緩沖區(qū),向其中寫(xiě)數(shù)據(jù)。(8)取消OpenGL緩沖區(qū)映射。要等前面CUDA的活動(dòng)完成以后,使用cuGLUnmapBufferObject或cudaGLUnmapBufferObject函數(shù)取消映射。(9)前面的步驟完成以后就可以真正開(kāi)始繪圖了,OpenGL的PBO和VBO的繪圖方式不同,分別為以下兩個(gè)過(guò)程。①如果只是繪制平面圖形,需要使用OpenGL的PBO及紋理。glEnable(GL_TEXTURE_2D);//使紋理可用glGenTextures(1,&textureID);//生成一個(gè)textureIDglBindTexture(GL_TEXTURE_2D,textureID);//使該紋理成為當(dāng)前可用紋理glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,Width,Height,0,GL_BGRA,GL_UNSIGNED_BYTE,NULL);//分配紋理內(nèi)存。最后的參數(shù)設(shè)置數(shù)據(jù)來(lái)源,這里設(shè)置為NULL,表示數(shù)據(jù)來(lái)自PBO,不是來(lái)自主機(jī)內(nèi)存glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);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),繪制長(zhǎng)方形了。②繪制3D場(chǎng)景,需要使用VBO。glEnableClientState(GL_VERTEX_ARRAY);//使頂點(diǎn)和顏色數(shù)組可用glEnableClientState(GL_COLOR_ARRAY);glVertexPointer(3,GL_FLOAT,16,0);//設(shè)置頂點(diǎn)和顏色指針glColorPointer(4,GL_UNSIGNED_BYTE,16,12);glDrawArrays(GL_POINTS,0,numVerticies);//根據(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ū)來(lái)回切換,實(shí)現(xiàn)動(dòng)畫(huà)顯示效果。調(diào)用SwapBuffers(),緩沖區(qū)切換通常會(huì)在垂直刷新間隙來(lái)處理,因此,可以在控制面板上關(guān)掉垂直同步,使得緩沖區(qū)切換立刻進(jìn)行。代碼例程simpleGL.cu(356-394行):1、2345678代碼例程9本周作業(yè)“代碼/test_openGL_cuda.cu”是一個(gè)簡(jiǎn)單版的使用CUDA計(jì)算出一條sin曲線各點(diǎn)的函數(shù)值,
存入數(shù)組,
然后用OpenGL顯示,請(qǐng)把該程序功能改為一個(gè)使用VBO顯示的3D效果。法律聲明【聲明】本視頻和幻燈片為煉數(shù)成金網(wǎng)絡(luò)課程的教學(xué)資料,所有資料只能在課程內(nèi)使用,不得在課程以外范圍散播,違者將可能被追究法律和經(jīng)濟(jì)責(zé)任。課程詳情訪問(wèn)煉數(shù)成金培訓(xùn)網(wǎng)站
煉數(shù)成金逆向收費(fèi)式網(wǎng)絡(luò)課程Dataguru(煉數(shù)成金)是專業(yè)數(shù)據(jù)分析網(wǎng)站,提供教育,媒體,內(nèi)容,社區(qū),出版,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 古代埃及課件教學(xué)
- 2024年白銀礦冶職業(yè)技術(shù)學(xué)院馬克思主義基本原理概論期末考試題帶答案解析
- 2024年煙臺(tái)衛(wèi)生健康職業(yè)學(xué)院馬克思主義基本原理概論期末考試題及答案解析(奪冠)
- 2024年裕民縣幼兒園教師招教考試備考題庫(kù)附答案解析(奪冠)
- 2024年蚌埠學(xué)院馬克思主義基本原理概論期末考試題及答案解析(奪冠)
- 2025年西華縣招教考試備考題庫(kù)附答案解析(必刷)
- 2025年江蘇警官學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析(必刷)
- 2025年天津國(guó)土資源和房屋職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析(奪冠)
- 2025年青海理工學(xué)院馬克思主義基本原理概論期末考試模擬題含答案解析(奪冠)
- 吞咽障礙護(hù)理查房經(jīng)驗(yàn)總結(jié)
- 設(shè)備日常維護(hù)保養(yǎng)培訓(xùn)課件
- 2025年華潤(rùn)守正評(píng)標(biāo)專家考試題庫(kù)及答案
- 高血壓急癥的快速評(píng)估與護(hù)理
- JJG 264-2025 谷物容重器檢定規(guī)程
- 養(yǎng)老院設(shè)施審批流程
- 【9英一?!渴徍?024-2025學(xué)年中考第一次模擬考試英語(yǔ)試卷
- 公司股東入股合作協(xié)議書(shū)
- 中國(guó)糖尿病防治指南(2024版)解讀
- 2024年勞動(dòng)保障監(jiān)察和調(diào)解仲裁股年終總結(jié)
- 物業(yè)工程管理中的成本控制方法
- 2023年四川省綿陽(yáng)市中考數(shù)學(xué)試卷
評(píng)論
0/150
提交評(píng)論