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

时间:2015-07-16 07:13:38

标签: cuda

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

使用int4和float4等向量类型进行读/写是faster

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

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

2 个答案:

答案 0 :(得分:6)

您的最后一段基本上是您问题的答案。绩效改善来自效率提升,有两种方式

  1. 在指令级,多字向量加载或存储只需要发出一条指令,因此每条指令的字节比率更高,特定内存事务的总指令延迟更低。
  2. 在内存控制器级别,来自warp的向量大小的事务请求会导致每个事务的净内存吞吐量更大,因此每个事务的字节比率更高。更少的事务请求减少了内存控制器争用,并可以产生更高的总内存带宽利用率。
  3. 因此,与发出单个指令生成单独的内存事务以从全局内存中获取相同数量的字节相比,通过使用向量内存指令可以在多处理器和内存控制器上获得效率提升

答案 1 :(得分:4)

您可以在Parallel4All博客中找到问题的完整答案:http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-increase-performance-with-vectorized-memory-access/

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

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