在 GPU 上,是否有可能通过结合双浮点运算来获得更多的触发器?

问题描述

如果一个 GPU 每秒可以执行 N1 次单精度运算,每秒可以执行 N2 次双精度运算。是否有可能通过混合(独立的)单精度和双精度操作来实现每秒 N1+N2 次总操作数,或者至少大于 N1 和 N2?

在英特尔/AMD cpu 上,我很确定这是不可能的,因为双精度和单精度至少共享一些执行资源。但我不知道这是否适用于现代 nvidia 或 amd GPU。

解决方法

这个问题在 SuperUser question 中被部分提及,其中 accepted answer 与外部资源有相当多的链接,包括两次关于使用混合精度算法(thisthis)。他们都从正确性的角度研究了混合精度的使用,似乎并不是主要以性能为动机。

在此基础上进行扩展,能够有条件地更改其计算的某些部分以使用降低的精度(而不是经典的“双倍执行”)的参数代码可以在适用的情况下在现代 AMD 和 Nvidia GPU(英特尔尚未透露有关他们即将推出的 GPU 的此类细节)。后续操作的数据依赖性对于能够联合发布操作起着重要作用。

  • Nvidia 一直在其流式多处理器中使用单独的 FP32 和 FP64 单元(参见示例。NVIDIA Ampère Architecture In-Depth)每个架构都略有不同,而 Volta (GV100) 是 known to use 不同的用于各种操作的调度端口,包括FP32和FP64,它们使用不同的端口,因此可以联合发行。开发者指南通常只提到各种操作类型的互斥性,而没有提到调度端口及其操作类型的数量。 NSight 文档和有关管道利用率的各种计算功能的分析计数器(如链接的论坛答案中所述)可能有助于在这方面调整代码。
  • AMD CDNA Whitepaper 详细说明还有用于处理向量数学和矩阵数学的专用硬件元素。 (CDNA 是 AMD Instinct MI100 及更高版本,ISA 术语中的 gfx908。)FP64 操作使用 VALU 处理,而某些 FP32 操作也可以使用 Matrix ALU 处理。要了解哪些指令映射到这些硬件单元,请参阅 CNDA ISA Reference Guide

在这两种情况下,以这种方式编写代码都是必要的,但最终还是受编译器的支配来发出这样的 ISA,然后硬件(或 NV 的驱动程序)以这样一种方式处理正确操作的共同问题发生。探查器对于发现魔法是否真的发生在幕后非常重要。

话虽如此,即使没有发生共同问题,FP32 单元在运行时也会消耗更少的能量(更少的位就是更少的工作),因此产生的热量更少,允许 GPU 维持更长时间的升压时钟。通过在非绝对必要的情况下不使用额外资源,无论架构上的微妙之处如何,仍可观察到轻微的性能提升。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...