专栏首页一棹烟波CUDA与OpenGL互操作

CUDA与OpenGL互操作

当处理较大数据量的时候,往往会用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~  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenCV角点检测源代码分析(Harris和ShiTomasi角点)

    OpenCV中常用的角点检测为Harris角点和ShiTomasi角点。 以OpenCV源代码文件 .\opencv\sources\samples\cpp\t...

    一棹烟波
  • 全景图转小行星视角投影原理详解

    全景图是2:1比例的图片,一般是多张图像拼接而成。全景图2:1的比例可以很方便的映射到球面,而球坐标可以很方便的实现各种有趣的投影。比如小行星,水晶球,局部透视...

    一棹烟波
  • ffmpeg批量实现视频转码命令行

    ffmpeg实现视频转码命令行,result需要提前建好作为保存转码后的视频路径:

    一棹烟波
  • 【8点20】深入了解Facebook 的Altoona数据中心网络

    Facebook最近秀了一下Altoona数据中心网络的高度模块化和可扩展性。这个社交网络巨头高调公布了数据中心网络解决方案,因为Facebook想围绕开放计算...

    SDNLAB
  • 软件性能测试(连载21)

    如果要看远程服务器上Java程序的GC情况需要执行这个步骤,允许JVM工具查看JVM使用情况。

    小老鼠
  • 利用bert系列预训练模型在非结构化数据抽取数据

    https://ai.baidu.com/broad/download?dataset=sked

    用户1750490
  • 关于大数据信息分析的方法与工具

    信息分析主要以事物、现象、数据、信息的属性、特征、本质、规律、关联等为依据展开定性和定量分析,以期发现新知识。因此,信息分析以事物、现象、数据、信息之间存在的因...

    加米谷大数据
  • 关于大数据信息分析的方法与工具

    信息分析主要以事物、现象、数据、信息的属性、特征、本质、规律、关联等为依据展开定性和定量分析,以期发现新知识。因此,信息分析以事物、现象、数据、信息之间存在的因...

    加米谷大数据
  • 国行版HomePod终于上线,售价2799元

    近日,国行版HomePod智能音箱正式在苹果Apple Store上架,定价2799元,有深空灰和白色两种配色可选,预计明年一季度开始发售。

    镁客网
  • Python学习(三) 八大排序算法的实现(上)

       本文Python实现了直接插入排序、基数排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、希尔排序。    上篇来介绍前四种排序方式:  ...

    深度学习思考者

扫码关注云+社区

领取腾讯云代金券