用于 Kepler 架构的加载/存储单元 (LD/ST) 和特殊功能单元 (SFU)

use*_*896 5 cuda nvidia kepler

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

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

LD/ST 单元显然用于存储和装载。通过这些论文之一是否需要任何内存加载/写入?它们是否也用作单一经线?换句话说,是否可以只有一个当前正在写入或读取的经线?

干杯,安迪

ala*_*and 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 单元在没有正在进行的内存事务时会停止一样。

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

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

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

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

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

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

  • SFU 仅支持六种(单精度)运算:sin/cos、exp/log、rcp/rsqrt。它们可用于超越运算,其中单精度指令给出了良好的细化近似值(例如倒数、倒数平方根)。但对于像正弦和余弦这样的超越数,单一近似没有帮助,您将不会在生成的微代码中看到任何 SFU 指令。数学库的双精度实现应该自动利用 SFU 从中受益。 (2认同)