我是CUDA的新手,看起来CUDA和Shader都是GPU程序。
当我们在渲染中讨论GPU编程时,比如GPU体素化,我们是在谈论CUDA还是仅仅是将数据转换成Shader呢?
发布于 2017-01-19 21:22:46
与Shaders相反,CUDA并不局限于渲染管道的特定步骤。它可以用来进行最适合GPU体系结构的计算,允许人们利用今天的GPU体系结构。
为了获得更好的直觉,在网上搜索"GPU计算“。例如,在要处理大量数据集的机器学习中,当向量化实现成为可能时,在高度并行化的GPU中执行该操作将花费所有数据处理时间的一小部分,而不是在CPU中处理(请注意,根据我们所说的数据集,该过程可能仍然需要大量时间,并且可能仍然需要大量的时间)。
您将使用CUDA实现在GPU (或其中一部分)上运行的算法。利用其高度并行的架构。
http://www.nvidia.com/object/what-is-gpu-computing.html
我不是这个领域的专家,但作为一般规则:矢量化实现是针对GPU的,而许多"if“条件或循环与CPU相比并没有得到多少好处,甚至可能运行得更慢。
向量化实现是当您尝试将数据容纳到大向量/矩阵中并以单个向量/矩阵乘法(或任何其他所需的支持的操作)处理它们时。当这是不可能的,或者你不知道如何去做的时候,你将用循环顺序地处理数据,每次一个循环(对GPU不好,速度很少或没有增益)。
着色器
使用旧的固定管道,您可以通过上传不同的矩阵或设置某些参数来配置GPU行为。这是最好的做法,在旧芯片设计的日子里,固定管道是唯一的选择。
现代芯片逐渐发展成为可编程的。但是,人们认为着色器标准只允许人们定制渲染流水线的不同步骤所发生的事情。
顶点着色器:允许您一次修改一个顶点。在这里,您将应用投影矩阵(或者,作为优化,硬编码您的游戏所需的投影计算)。
像素着色器:允许您“编程”在生成片段(像素)时会发生什么。这里有灯光。是的,你很清楚,你的像素着色器程序将在每个像素上再次运行(请注意,处理片段的数量,着色器运行的时间,并不等于监视器上的像素数)。这听起来可能很低效,但是GPU具有高度并行化的设计,可以处理它。这些东西使我们有必要拥有一个专门的3D图形芯片,使得软件实现只对教学目的或非实时渲染的生产有用。
关于体素化和GPU:对于顶点着色器和像素着色器,没有什么可以做的来优化体素。但也有其他阶段的可编程管道,可能会有帮助这里,如几何着色或镶嵌着色器。他们需要一个非常现代化的GPU。
每个阶段都有一组可能的输入,并产生与它们在渲染过程中的作用相关的具体输出。
编写这些着色器程序的语言与CUDA不同。OpenGL有GLSL,Direct3D有HLSL。
CUDA是用来做非常昂贵的计算,在GPU中,并恢复结果。
着色器是用来编程什么GPU必须在每个可编程阶段的渲染管道。
发布于 2017-01-19 03:08:04
着色器通常在图形API的上下文中引用,如OpenGL或Direct3D。它们起源于一个小程序,允许调整冲浪板,也就是“阴影”物体的照明计算。最终,着色器的支持被添加到固定功能渲染管道的各个部分,这是GL/D3D固有的。人们最终想出了如何使用这些着色器来完成与图形无关的事情,或者至少与固定功能渲染管道无关。GPU获得了对越来越多通用编程的支持,而图形API最终获得了对驻留在呈现管道之外的“计算着色器”的支持。最后一个重要的一点是,图形API用自己独特的语言(也就是HLSL和GLSL )定义了着色器。
CUDA (以及许多相关的技术)基本上只是一种无需图形API和不需要特定语言的运行计算着色器的方法。CUDA程序被编译成PTX (NVIDIA对GPU的x86程序集的类推,尽管更抽象一些,以保持与GPU修订版的兼容性),并从任意数量的语言编译而来,无论是C++、Rust、(变体) Python等等。这类程序也可以编译成HLSL或GLSL,但开发和调试通常要困难得多。
https://gamedev.stackexchange.com/questions/136029
复制相似问题