5

Kepler 架构白皮书中,NVIDIA 声明 SMX 上有32特殊功能单元 (SFU) 和32加载/存储单元 (LD/ST)。

SFU 用于“快速近似超越运算”。不幸的是,我不明白这应该是什么意思。另一方面,在SFU 的特殊 CUDA 双精度三角函数中,据说它们只能在单精度下工作。这在 K20Xm 上仍然正确吗?

LD/ST 单元显然是用于存储和装载的。通过其中一项是否需要任何内存加载/写入?它们也被用作单一经线吗?换句话说,当前是否只有一个 warp 正在写入或读取?

干杯,安迪

4

2 回答 2

4

SFU 用于“快速近似超越运算”

SFU 计算函数__cosf(),例如__expf()等。

另一方面,据说它们只能以单精度工作,这在 K20Xm 上仍然正确吗?

根据最近的CUDA C 编程指南,第 G.5.1 节,它们仍然只能在单精度下工作。

这是有道理的,因为如果您需要双精度,则不太可能使用不准确的数学函数。您可以参考此答案以获取有关双精度算术优化的建议。

双精度操作的实现细节可以在/usr/local/cuda-5.5/include/math_functions_dbl_ptx3.h(或安装 CUDA 工具包的任何地方)找到。例如sincos它使用 Payne-Hanek 参数缩减,然后是泰勒展开(最多 14 阶)。

对于双精度计算,SFU 似乎只用于__internal_fast_rcp__internal_fast_rsqrt,而后者又用于acoslogcosh其他几个函数(请参阅 参考资料math_functions_dbl_ptx3.h)。所以大多数时候它们会停止,比如如果没有正在进行的内存事务,LD/ST 单元就会停止。

通过其中一项是否需要任何内存加载/写入?

是的,每次访问全局内存。

它们也被用作单一经线吗?换句话说,当前是否只有一个 warp 正在写入或读取?

单元数仅限制每个周期发出的指令数。即每个时钟周期可以发出32条读取指令,并且可以返回32条结果。

一条指令最多可以读取/写入 128 个字节,因此如果 warp 中的每个线程读取 4 个字节并且它们被合并,那么整个 warp 将需要单个加载/存储指令。如果访问未合并,则应发出更多指令。

此外,单元是流水线的,这意味着单个单元可以同时执行多个读取/存储请求。

于 2013-12-09T17:26:16.800 回答
2

不要接受这个作为答案——我们希望有人会来回答你关于双精度超越运算的问题。我只是想解决你问题的第二部分,关于 LD/ST 单位。

LD/ST 单元显然是用于存储和装载的。

是的。

通过其中一项是否需要任何内存加载/写入?

是的。

它们也被用作单一经线吗?

是的,warp 中的所有活动线程总是在相同的时钟周期内发出相同类型的指令。如果该指令是加载或存储,它将被发布到 LD/ST 单元。如果线程处于非活动状态(由于循环或条件执行),则相应的 LT/ST 单元保持空闲。

换句话说,当前是否只有一个 warp 正在写入或读取?

不,LD/ST 单元每个时钟可以接受一个加载或存储操作,即使内存延迟可能是几百个周期。因此,当一个 warp 发出加载指令时,LD/ST 单元将开始检索该数据。在数据到达之前,warp 中依赖于数据的指令无法发出。在下一个时钟周期内,warp 仍可能执行其他独立指令(指令级并行)。甚至其他独立的加载或存储指令。另一个符合调度条件的 warp 也可以在下一个时钟周期发出另一个加载指令,并且它自己进入等待状态(线程级并行)。此时,LD/ST 单位正在跟踪两个未决结果。由于缓存和合并,第二个 warp 的数据可能首先到达。

于 2013-12-09T16:34:46.710 回答