我正在建模一些要在 GPU 上运行的算法。是否有关于各种内在函数和计算在现代硬件上需要多少个周期的参考或其他内容?(nvidia 5xx+ 系列,amd 6xxx+ 系列)我似乎无法找到任何官方消息,尽管在他们的文档中提到了标准化、平方根和其他功能的成本增加。谢谢。
3 回答
不幸的是,您正在寻找的周期盘点文档要么不存在,要么(如果存在)它可能不会像您期望的那样有用。您是正确的,一些更复杂的 GPU 指令比更简单的指令需要更多的时间来执行,但循环计数仅在指令执行时间是主要性能瓶颈时才重要;GPU 的设计使得这种情况很少发生。
GPU 着色器程序实现如此高性能的方式是并行运行许多(可能是数千个)着色器线程。每个着色器线程在被换出到不同的线程之前通常只执行一条指令。在完美条件下,有足够多的线程在运行,其中一些始终准备好执行下一条指令,因此 GPU 永远不必停止;这隐藏了单个线程执行的任何操作的延迟。如果 GPU 在每个周期都在做有用的工作,那么就好像每个着色器指令都在一个周期内执行。在这种情况下,让你的程序更快的唯一方法是让它更短(更少的指令=更少的工作周期)。
在更现实的情况下,当没有足够的工作来保持 GPU 完全加载时,瓶颈几乎可以保证是内存访问而不是 ALU 操作。在最坏的情况下,单个纹理提取可能需要数千个周期才能返回;对于像这样不可预测的停顿,通常不必担心 sqrt() 是否比 dot() 花费更多的周期。
因此,最大化 GPU 性能的关键不是使用更快的指令。这是关于最大化占用率——也就是说,确保有足够的工作来保持 GPU 足够忙以隐藏指令/内存延迟。它是关于您的内存访问要聪明,以尽量减少到 DRAM 的痛苦往返。有时,如果你真的很幸运,那就是使用更少的指令。
this is the closest thing i've found so far, it is outdated(sm3) but i guess better than nothing.
运算符/函数有循环吗?我知道汇编指令有循环,这是低级的时间测量,主要取决于 CPU。因为运算符和函数都是高级编程的东西。所以我认为他们没有这样的衡量标准。