为什么CUDA矢量类型(int4,float4)更快?

use*_*741 9 cuda

我已经读过CUDA可以从全局内存中读取128个字节,因此有意义的是,warp中的每个线程都可以以合并模式读取/写入4个字节,总共128个字节.

使用int4和float4等矢量类型读/写速度更快.

但我不明白为什么会这样.如果warp中的每个线程都请求16个字节,并且一次只能在总线上移动128个字节,那么性能增益来自何处?

是因为发生了更少的内存请求,即它说"在这个warp中为每个线程抓取16个字节"一次,反对"在这个warp中为每个线程抓取4个字节"4次?我在文献中找不到任何说明矢量类型更快的确切原因.

tal*_*ies 6

你的最后一段基本上就是你问题的答案.性能提升来自效率提升,有两种方式

  1. 在指令级,多字向量加载或存储仅需要发出单个指令,因此每指令字节的比率更高并且特定存储器事务的总指令延迟更低.
  2. 在内存控制器级别,来自warp的向量大小的事务请求导致每个事务的更大的净内存吞吐量,因此每个事务的字节比率更高.更少的事务请求减少了内存控制器争用,并可以产生更高的总内存带宽利用率.

因此,与发出单独的指令生成单独的内存事务以从全局内存中获取相同数量的字节相比,通过使用向量内存指令可以在多处理器和内存控制器上获得效率增益


Max*_*kov 5

您对 Parallel4All 博客中的问题有详尽的回答:http : //devblogs.nvidia.com/parallelforall/cuda-pro-tip-increase-performance-with-vectorized-memory-access/

主要原因是在使用向量加载的情况下加载的每个字节的索引算法较少。

还有另一个 - 更多的负载正在运行,这有助于在占用率低的情况下使内存带宽饱和。