use*_*896 5 cuda nvidia kepler
在Kepler 架构白皮书中,NVIDIA 声明SMX 上有32
特殊功能单元 (SFU) 和32
加载/存储单元 (LD/ST)。
SFU 用于“快速近似超越运算”。不幸的是,我不明白这是什么意思。另一方面,在SFU 的特殊 CUDA 双精度触发函数中,据说它们只能在单精度下工作。这在 K20Xm 上仍然正确吗?
LD/ST 单元显然用于存储和装载。通过这些论文之一是否需要任何内存加载/写入?它们是否也用作单一经线?换句话说,是否可以只有一个当前正在写入或读取的经线?
干杯,安迪
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 单元在没有正在进行的内存事务时会停止一样。
完成其中一项是否需要任何内存加载/写入?
是的,每次访问全局内存。
它们也用作单一经线吗?换句话说,是否只能有一个扭曲当前正在写入或读取?
单元的数量仅限制每个周期发出的指令数量。即每个时钟周期可以发出32条读指令,并且可以返回32个结果。
一条指令最多可读取/写入 128 个字节,因此如果 warp 中的每个线程读取 4 个字节并将它们合并,则整个 warp 将需要单个加载/存储指令。如果访问未合并,则应发出更多指令。
此外,单元是流水线的,这意味着单个单元可以同时执行多个读取/存储请求。