opengl渲染gpu怎么设置a卡_GPU基础知识

找到一篇很好的文章,自以为对很多人有很多意义。 原文主要是OpenGL的教程,提炼并记录。原文查看引用。

底层的底层GPU硬件

1: 数组 = 纹理

一维数组是本地CPU最基本的数据排列方式,多维的数组则是通过对一个很大的一维数组的基准入口进行坐标偏移来访问的(至少目前大多数的编译器都是这样做的)。 一个小例子,一个MxN维的数组 a[i][j] = a[iM+j];我们可能把一个多维数组,映射到一个一维数组中去。这些数组我开始索引都被假定为0; 对于GPU,最基本的数据排列方式,是二维数组。也就是纹理。主流的显卡来说,一般是2048或者4096每个维度。即贴图最大40964096*4096(3d贴图)

FrameBuffer 使用纹理作为渲染对像

一个纹理,它不仅可以用来作数据输入对像,也还可以用作数据输出对像。我们可以把数据直接渲染输出到一个纹理上。 但是有一个缺点:一个纹理对像不能同时被读写,也就是说,一个纹理,要么是只读的,要么就是只写的。 QA 显卡设计的人提供这样一个解释: GPU在同一时间段内会把渲染任务分派到几个通道并行运行, 它们之间都是相互独立的(稍后的章节会对这个问题作详细的讨论)。 如果我们允许对一个纹理同时进行读写操作的话,那我们需要一个相当复杂的逻辑算法来解决读写冲突的问题, 即使在芯片逻辑上可以做到, 但是对于GPU这种没有数据安全性约束的处理单元来说,也是没办法把它实现的,因为GPU并不是基von Neumann的指令流结构,而是基于数据流的结构。 因此在我们的程序中,我们要用到3个纹理,两个只读纹理分别用来保存输入数组x,y。一个只写纹理用来保存运算结果。 用这种方法意味着要把先前的运算公式:y = y + alpha * x 改写为:y_new = y_old + alpha * x. QA

Unity中设置渲染目标

2:内核(Kernels) = 着色器(shaders)

面向循环的CPU运算 vs. 面向内核的GPU数据并行运算

栗子:y = y + alpha* x; 在CPU上,通常我们会使用一个循环来遍历数组中的每个元素。

//CPU
for (int i=0; i<N; i++)   
    dataY[i] = dataY[i] + alpha * dataX[i];

这是标准的CPU线性逻辑,每次循环都有2个外层逻辑。 1·循环计数器递增 2·计数器和数组长度比较 这个运算有一个非常重要的特点:那就是我们所要访问和计算的每个数组元数,它们之间是相互独立的。 我们可以不按顺序从第一个算到最后一个,可先算最后一个,再算第一个。它得到的最终结果是不变的。 那么如果我们有N个CPU和数组数量一致。那便可以在同一时间把所有的数据都算出来,而不需要外层循环。其结果也是不变的。 这里有一个叫SIMD(single instruction multiple data)允许编译器对代码进行优化在CPU上能得到更高效的并行运行。 然而CPU的核心是非常少的(常见2,4,8核),GPU的并行处理单元就非常多(GeFore7800GTX中,并行处理单元24个)。 GPU本身就是为了高并行设计。而并行的条件就是多个一致的处理单元。

从概念上讲,一个片段着色器,就是像上像这样的一段小程序,这段代码在显卡上会对每个片段运行一编。

float4 result;  
    float4 y = tex2D(textureY,coords);  
    float4 x = tex2D(textureX,coords);  
    result = y + alpha*x;    
    // equivalent: result.rgba=y.rgba+alpha*x.rgba   
    //         or: result.r=y.r+alpha*x.y; result.g=...  
    return result;

其中GPU具有并行运算四分量的能力。其指令集计算float与float4是消耗相同的。因此很多情况下可以将计算合并在四分量中同时计算。

3:运算 = 绘图

每一个Shader 即一个运算程序。其运算基本遵循以下路径,将数据(网格顶点数据)通过顶点计算,递交给光栅处理器。 光栅处理器进行插值处理后将数据递交给片段着色器。最终输出颜色。 其中线性插值,是在三角面的3个顶点之间的数据进行的。 多次渲染传递. 在一些通用运算中,我们会希望把前一次运算结果传递给下一个运算用来作为后继运算的输入变量。 但是在GPU中,一个纹理不能同时被读写,这就意味着我们要创建另外一个渲染通道,并给它绑定不同的输入输出纹理,甚至要生成一个不同的运算内核。 有一种非常重要的技术可以用来解决这种多次渲染传递的问题,让运算效率得到非常好的提高,这就是“乒乓”技术。 这篇论文Simon Green's FBO slides

引用

原文

http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html​www.mathematik.uni-dortmund.de

中文版

GPU基础知识_python_颇锐克-CSDN博客​blog.csdn.net
6bd05c3a57342a1532e6478607c14887.png

OpenGL参考

https://www.khronos.org/registry/OpenGL-Refpages/es3.0/​www.khronos.org

Simon Green's FBO slides

(http://download.nvidia.com/developer/presentations/2005/GDC/OpenGL_Day/OpenGL_FrameBuffer_Object.pdf​download.nvidia.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值