graphics - HLSL 运算符/函数循环计数

标签 graphics directx hlsl

我正在建模一些要在 GPU 上运行的算法。是否有关于各种内在函数和计算在现代硬件上占用多少周期的引用资料? (nvidia 5xx+ 系列,amd 6xxx+ 系列)我似乎找不到任何官方说法,尽管在他们的文档中有一些提到归一化、平方根和其他函数的成本增加......谢谢。

最佳答案

不幸的是,您要查找的周期计数文档不存在,或者(如果存在)它可能不会像您期望的那样有用。你是对的,一些更复杂的 GPU 指令比简单的指令需要更多的时间来执行,但只有当指令执行时间是主要性能瓶颈时,循环计数才重要; GPU 的设计使得这种情况很少发生。

GPU 着色器程序实现如此高性能的方式是并行运行许多(可能是数千个)着色器线程。每个着色器线程在被换出不同的线程之前通常只执行一条指令。在完美条件下,有足够多的线程在运行,其中一些线程随时准备执行下一条指令,因此 GPU 永远不必停顿;这隐藏了由单个线程执行的任何操作的延迟。如果 GPU 每个周期都在做有用的工作,那么就好像每个着色器指令都在一个周期内执行。在这种情况下,使程序更快的唯一方法是使其更短(更少的指令 = 更少的整体工作周期)。

在更现实的条件下,当没有足够的工作来保持 GPU 满载时,瓶颈实际上肯定是内存访问而不是 ALU 操作。在最坏的情况下,单个纹理获取可能需要数千个周期才能返回;对于像这样不可预测的停顿,通常不值得担心 sqrt() 是否比 dot() 花费更多的周期。

因此,最大化 GPU 性能的关键不是使用更快的指令。这是关于最大化占用率——也就是说,确保有足够的工作来保持 GPU 足够忙碌以隐藏指令/内存延迟。这是关于对您的内存访问保持智能,以最大限度地减少到 DRAM 的痛苦往返。有时,当您真的很幸运时,就是使用更少的指令。

关于graphics - HLSL 运算符/函数循环计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12747176/

相关文章:

variables - HLSL 像素着色器 - 全局变量?

c++ - Direct3D 11 CreatePixelShader (E_INVLIDARGS)

c# - 为什么在着色器中顺序很重要?

opengl - 在 OpenGL 中显示大图像的首选方式是什么

c++ - 画线例程

java - 撤消和重做,无需存储图形坐标

python - 如何使用pywinauto模拟游戏中的按键

c++ - 如何处理 DirectX 11 驱动程序崩溃

wpf - 我可以从 WPF 窗口获取 HDC 以便我可以使用 Gdi+ API 绘制它吗?

opengl - 为什么我们需要 3d 甚至 4d 纹理?