SFU 用于“快速近似超越运算”
SFU 计算函数__cosf()
,例如__expf()
等。
另一方面,据说它们只能以单精度工作,这在 K20Xm 上仍然正确吗?
根据最近的CUDA C 编程指南,第 G.5.1 节,它们仍然只能在单精度下工作。
这是有道理的,因为如果您需要双精度,则不太可能使用不准确的数学函数。您可以参考此答案以获取有关双精度算术优化的建议。
双精度操作的实现细节可以在/usr/local/cuda-5.5/include/math_functions_dbl_ptx3.h
(或安装 CUDA 工具包的任何地方)找到。例如sin
,cos
它使用 Payne-Hanek 参数缩减,然后是泰勒展开(最多 14 阶)。
对于双精度计算,SFU 似乎只用于__internal_fast_rcp
和__internal_fast_rsqrt
,而后者又用于acos
、log
和cosh
其他几个函数(请参阅 参考资料math_functions_dbl_ptx3.h
)。所以大多数时候它们会停止,比如如果没有正在进行的内存事务,LD/ST 单元就会停止。
通过其中一项是否需要任何内存加载/写入?
是的,每次访问全局内存。
它们也被用作单一经线吗?换句话说,当前是否只有一个 warp 正在写入或读取?
单元数仅限制每个周期发出的指令数。即每个时钟周期可以发出32条读取指令,并且可以返回32条结果。
一条指令最多可以读取/写入 128 个字节,因此如果 warp 中的每个线程读取 4 个字节并且它们被合并,那么整个 warp 将需要单个加载/存储指令。如果访问未合并,则应发出更多指令。
此外,单元是流水线的,这意味着单个单元可以同时执行多个读取/存储请求。