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

时间:2013-12-09 14:09:54

标签: cuda nvidia kepler

Kepler architecture whitepaper中,NVIDIA声明SMX上有32个特殊功能单元(SFU)和32加载/存储单元(LD / ST)。

SFU用于“快速近似超越操作”。不幸的是,我不明白这是什么意思。另一方面,在Special CUDA Double Precision trig functions for SFU,据说它们只能以单精度工作。在K20Xm上这仍然是正确的吗?

LD / ST单元显然用于存储和加载。是否需要通过其中一个内存加载/写入?它们也被用作单个扭曲吗?换句话说,目前只能编写或读取一个经线吗?

干杯, 岸堤

2 个答案:

答案 0 :(得分:3)

  

SFU用于“快速近似超越操作”

SFU计算__cosf()__expf()等功能。

  

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

根据最近的CUDA C Programming Guide, section G.5.1,它们仍然只能以单精度工作。

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

双精度操作的实现细节可以在/usr/local/cuda-5.5/include/math_functions_dbl_ptx3.h中找到(或者在安装CUDA Toolkit的任何地方)。 例如。对于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将需要单个加载/存储指令。如果访问是未合并的,则应发出更多指令。

此外,单位为pipelined,意味着单个单位可以同时执行多个读/存储请求。

答案 1 :(得分:1)

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

  

LD / ST单位显然是用于存储和加载。

  

是否需要通过其中一个内存/写入?

  

它们是否也用作单个扭曲?

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

  

换句话说,目前只能写一个或正在阅读的经线?

不,LD / ST单元每个时钟可以接受一次加载或存储操作,即使存储器延迟可能是几百个周期。因此,当一个warp发出加载指令时,LD / ST单元将开始检索该数据。取决于数据的warp中的指令在数据到达之前不会被发布。在下一个时钟周期中,warp仍然可以执行其他独立指令(指令级并行)。甚至其他独立的加载或存储指令。另一个有资格被调度的warp也可以在下一个时钟周期发出另一个加载指令,并且它自己进入等待状态(线程级并行)。此时,LD / ST单位正在跟踪两个待定结果。由于缓存和合并,第二个warp的数据可能首先到达。当warp的数据到达时,它将被分配给指令中指定的寄存器,然后解析特定的数据依赖性。