当处理较大数据量的时候,往往会用GPU进行运算,比如OpenGL或者CUDA。在实际的操作中,往往CUDA实现并行计算会比OpenGL更加方便,而OpenGL在进行后期渲染更具有优势。由于CUDA中的运算结果存储在GPU中,如果将数据download到CPU,然后再将CPU中的数据上传到GPU,使用OpenGL进行渲染,中间的GPU与CPU的交互会很耗时,毕竟使用GPU的目的就是为了加速,这样的数据传输会降低效率。

接下来简要说一下如何使CUDA和OpenGL互操作来实现GPU中数据的交互传输,而不用通过主机的CPU。

一、首先是在OpenGL中声明这样一个buffer。

cudaGraphicsResource_t  cudaBuffer;

然后将Buffer注册给纹理texture(假定已经提前声明一个纹理texture)

cudaGraphicsGLRegisterImage(&cudaBuffer, texture, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsWriteDiscard);

二、好了,这样我们只需要把CUDA计算出来的数据写入cudaBuffer中就行了。如下:

利用Cuda中的两个API设置cudaBuffer为映射Map,并将一个cuda数组cudaArray绑定到cudaBuffer。

cudaError_t err;
err = cudaGraphicsMapResources(1, cudaBuffer, 0);
err = cudaGraphicsSubResourceGetMappedArray(&cudaArray, cudaBuffer, 0, 0);

那么接下来的就是把数据写入cudaArray中的事情了,假设我有一个数据指针pResult指向GPU中的一段内存,这段内存中保存的就是CUDA的运算结果(一幅4通道图像),我只需要将其copy到cudaArray就行了。注意是cudaMemcpyDeviceToDevice,这个很快的。

创建cudaArray

uchar* cudaArray=NULL;
cudaChannelFormatDesc cuDesc = cudaCreateChannelDesc<uchar4>();
cudaMallocArray(&cudaArray, &cuDesc, imgWidth, imgHeight);

将结果数据拷贝至cudaArray

err=cudaMemcpyToArray(cudaArray, 0, 0, pResult, imgWidth*imgHeight * sizeof(uchar4), cudaMemcpyDeviceToDevice);

copy完后要解除映射Map

cudaGraphicsUnmapResources(1, &cudaBuffer, 0);

这样在OpenGL中就可以直接将buffer中的数据注册到纹理然后进行渲染了,so easy~  

 

	

CUDA与OpenGL互操作的更多相关文章

  1. CUDA和OpenGL互操作经典博文赏析和学习

    1.使用cuda+opengl图形互操作性实现MPR.原学位论文学习:实时交互的医学图像可视化.在该论文的第5.1.1节. 2.cuda与opengl互操作之PBO 3.cuda与opengl互操作之 ...

  2. CUDA与OpenGL互操作实例

    本文要解决的问题是如何实现CUDA和OpenGL的互操作,使得GPU能够将通用计算的运算结果交给OpenGL进行绘制. 本文的应用程序主要包括两个方面: 1.      使用CUDA核函数生成图像数据 ...

  3. [转]CUDA和OpenGL互操作的实现及分析

    CUDA和OpenGL互操作的实现及分析刘进锋.郭雷(西北工业大学 自动化学院,陕西西安710129) 1 CUDA与OpenGL概述 OpenGL是图形硬件的软件接口,它是在SGI等多家世界著名的计 ...

  4. CUDA 与 OpenGL 的互操作

    CUDA 与 OpenGL 的互操作一般是使用CUDA生成数据,然后在OpenGL中渲染数据对应的图形.这两者的结合有两种方式: 1.使用OpenGL中的PBO(像素缓冲区对象).CUDA生成像素数据 ...

  5. cuda+ffmpeg+opengl解码rtsp h264码流多路

    Cuda 解码 全尺寸 解码 .全尺寸窗口绘制测试( 分别 测试 视频 文件和 IP 相机 实时视频 ) 1080 p 视屏 文件 全尺寸 解码 全尺寸 显示 72 0p IP 相机 全尺寸 解码 全 ...

  6. CUDA编程

    目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. ...

  7. OpenGL与CUDA互操作方式总结

    一.介绍 CUDA是Nvidia推出的一个通用GPU计算平台,对于提升并行任务的效率非常有帮助.本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来.于是就尝试把 ...

  8. [转]OpenGL与CUDA互操作方式总结

    一.介绍 CUDA是Nvidia推出的一个通用GPU计算平台,对于提升并行任务的效率非常有帮助.本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来.于是就尝试把 ...

  9. CUDA基础介绍

    一.GPU简介 1985年8月20日ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡,1992年4月ATi发布了Mach32图形卡集成了图形加速功能,1998年4月ATi ...

随机推荐

  1. 使用performance monitor 查看 每一个cpu core的cpu time

    使用performance monitor 查看 每一个cpu core的cpu time: 打开performance monitor,添加 counter 如下 运行一段cpu bound 的代码 ...

  2. 微信跳一跳辅助自动跳Python

    一.说明 此代码借鉴github一位大神所写,已经做了简化合并处理,如果能成功连上手机并运行,可以实现程序自动玩游戏,刷个1000+的分数轻轻松松 github源码地址 https://github. ...

  3. jsp 之 解决mysql不是内部或外部命令问题

    安装Mysql后,当我们在cmd中敲入mysql时会出现'Mysql'不是内部或外部命令,也不是可运行的程序或其处理文件. 打开我的电脑在我的电脑右键中选择属性,然后单击选择高级系统设置. 在系统属性 ...

  4. 总结基础OOP(面向对象)

    OOP其实也就是面向对象编程.  一:什么是对象:  我们最常见的理解方式无非是:对象(object)是任何看得见.摸得着.感觉得到,可以获得的东西,有自己的标识的任何东西.对象是某一类的事物的具体个 ...

  5. commons -lang(2) RandomStringUtils RandomUtils

    上一篇是StringUtils 链接http://www.cnblogs.com/tele-share/p/8060129.html 1.RandomStringUtils 1.1模拟实现random ...

  6. 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1945  Solve ...

  7. js 前端操作的分页路由设计

    //分页条获得分页数字,然后跳转到拼接字符串的页面 function getPage(page) { var window_href = location.pathname; var newWindo ...

  8. Echars 6大公共组件详解

    Echars 六大组件详解 : title  tooltip toolbox legend  dataZoom visualMap 一.title标题详解 myTitleStyle = { color ...

  9. SpringBoot集成security

    本文就SpringBoot集成Security的使用步骤做出解释说明.

  10. Gym 101612C Consonant Fencity

    原题传送门 题意:给定一个只含小写字母的字符串,假设aeiouyw为元音字母,现在要把一些字母变为大写,要求相同字母的大小写必须相同,统计变化后的字符串中有多少对相邻.同为辅音字母且大小写不一样的字符 ...