浅谈 OpenGL 中相关阻塞问题

  昨天我遇到一个问题,问题如下:

    我使用了延迟渲染,我的渲染流程是:Pass1 --> CUDA并行计算 -->Pass2

    CUDA并行计算中需要使用Pass1渲染生成的两张纹理,然而我在GPU端使用CUDA计算时发现纹理为空(数据全是0值),但是如果将两张纹理的数据传回CPU端,打印出来是有值的,且是正确的值。如果在CUDA并行计算之前先将纹理数据传回CPU,这时发现CUDA并行计算中纹理是正常有值的。。。这个现象很奇怪,我开始想了想会不会是阻塞啥原因,但我对OpenGL阻塞过程不了解,没看到过相关的资料,简单思考了一下觉得不是阻塞的原因,我觉得可能是其中的一张纹理有问题,牵连导致这个问题。。。。。最终验证发现还是OpenGL阻塞的原因。在CUDA并行计算之前加上 glFinish()函数即可。

  

  为啥加上glFinish()函数就解决了呢? 解释这个之前,先说一下glFlush()和glFinish()函数的作用:

    一个OpenGL渲染程序会调用很多的OpenGL命令,而OpenGL是异步的,CPU将这些耗时的命令发送到GPU端,然后直接返回继续执行,这些OpenGL相关指令存储在GPU的缓存中一条条的执行,但是CPU也不是直接发送给GPU的,CPU自己有缓存,先存储在自己的缓存中,之后再发送过去(有时机,例如遇到某些刷新的命令等)。现在开始介绍以上两个函数的作用。

    glFlush():将缓存在CPU端的命令发送到GPU上,清空缓存,发送完立即返回。

    glFinish():将缓存在CPU端的命令发送到GPU上,清空缓存,发送完,等待GPU执行完在返回。

  

  看到这里就可以理解我加上 glFinish() 可以解决问题的原因了。我没加 glFinish() 时,CUDA并行计算时,这时Pass1实际没有执行完,故纹理为空,CUDA中拿不到正确的纹理数据,加上 glFinish() 后实际就是加入了GPU阻塞,等待Pass1执行完,然后执行CUDA并行计算。

  注:说到这里,谈点我思考的问题:

    1、在OpenGL渲染中,不管是 Pass1 --> CUDA并行计算 -->Pass2, 或者  Pass1 --> Pass2 或者Pass(只有一个Pass),我们统计两次渲染之间的时间差值就可以计算帧率,为啥不会因为异步问题计算不准呢? 因为 glfwSwapBuffers(glfw_window) 命令会将所有CPU端的命令发送到GPU端,并等待其执行完,然后再交换前后缓冲。

    2、对于Pass1 --> Pass2这样的延迟渲染,Pass1和Pass2都是作为命令发送到GPU端,按序执行,故不会出现Pass2拿到的数据(由Pass1处理的)不正确情况,我们不需要加阻塞保障其执行。

       另外不要错误以为,CPU运行到Pass2处看见Pass1还在执行,CPU阻塞等待Pass1执行完然后发送Pass2指令。

    3、为啥在CUDA并行计算前,对纹理进行一次数据传回可以让CUDA获取正确的纹理数据 ?我觉得(差不多肯定是这样,哈哈,自信……)拷贝纹理数据的OpenGL API虽然与GPU相关,但是其与CPU也相关,需要在CPU端的内存上接收传回的数据,从CPU端考虑它也会阻塞的。

    4、Pass1 和 CUDA并行计算 都是在GPU上执行的,而CUDA拿不到正确的纹理数据,可以认为 Pass1 和 CUDA并行计算 同时在GPU上并行执行(我猜的,应该是吧……)。

    

     

原文地址:https://www.cnblogs.com/chen9510/p/12158299.html

时间: 2024-10-12 07:49:01

浅谈 OpenGL 中相关阻塞问题的相关文章

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ 浅谈 Linux

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

浅谈Java中的hashcode方法 - 海 子

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程

浅谈hadoop中mapreduce的文件分发

最近在做数据分析的时候,需要在mapreduce中调用c语言写的接口,此时就需要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后做mapreduce的时候把so文件从hdfs下载到本地,但查询资料后发现hadoop有相应的组件来帮助我们完成这个操作,这个组件就是DistributedCache,分布式缓存,运用这个东西可以做到第三方文件的分发和缓存功能,下面详解: 如果我们需要在map之间共享一些数据,如果信息量不大,我们可

浅谈Java中的对象和对象引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实

浅谈Java中set.map.List的区别

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 :Collection是最基本的集合接口,声明了适用

浅谈JAVA中的“hashcode()”方法

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 一.hashCode方法的作用 对于包含容器类型的程

浅谈js中的this关键字

浅谈js中的this关键字 全局作用域中的this 函数作用域中的this 不同函数调用方法下的this 直接调用 作为对象的方法调用 作为构造函数调用 通过call或apply方法调用 嵌套函数作用域中的this 浅谈js中的this关键字 this是JavaScript中的关键字之一,在编写程序的时候经常会用到,正确的理解和使用关键字this尤为重要.接下来,笔者就从作用域的角度粗谈下自己对this关键字的理解,希望能给到大家一些启示,权当交流之用. 全局作用域中的this 本文将以作用域由