为什么 CUDA 矢量类型(int4、float4)更快?
Why are CUDA vector types (int4, float4) faster?
我读到 CUDA 一次可以从全局内存中读取 128 个字节,因此 warp 中的每个线程可以 read/write 合并模式中的 4 个字节,总共 128 个字节是有意义的.
Reading/writing 向量类型如 int4 和 float4 是 faster.
但是我不明白这是为什么。如果 warp 中的每个线程都请求 16 个字节,并且一次只能在总线上移动 128 个字节,那么性能增益从何而来?
是否因为发生的内存请求较少,即它说 "grab 16 bytes for each thread in this warp" 一次,而不是 "grab 4 bytes for each thread in this warp" 4 次?我在文献中找不到任何说明矢量类型更快的确切原因的内容。
你的最后一段基本上就是你问题的答案。性能提升来自效率提升,有两种方式
- 在指令级别,多字向量加载或存储只需要发出一条指令,因此每条指令的字节数比率更高,特定内存事务的总指令延迟更低。
- 在内存控制器级别,来自 warp 的向量大小的事务请求导致每个事务的净内存吞吐量更大,因此每个事务的字节数比率更高。更少的事务请求减少了内存控制器争用,并可以产生更高的整体内存带宽利用率。
因此,与发出生成单独内存事务的单独指令以从全局内存中获取相同数量的字节相比,通过使用向量内存指令,您可以在多处理器和内存控制器上获得效率提升
您对 Parallel4All 博客中的问题有详尽的回答:http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-increase-performance-with-vectorized-memory-access/
主要原因是在使用矢量加载的情况下,每个字节加载的索引算法较少。
还有一个 - 飞行中有更多负载,这有助于在占用率较低的情况下使内存带宽饱和。
我读到 CUDA 一次可以从全局内存中读取 128 个字节,因此 warp 中的每个线程可以 read/write 合并模式中的 4 个字节,总共 128 个字节是有意义的.
Reading/writing 向量类型如 int4 和 float4 是 faster.
但是我不明白这是为什么。如果 warp 中的每个线程都请求 16 个字节,并且一次只能在总线上移动 128 个字节,那么性能增益从何而来?
是否因为发生的内存请求较少,即它说 "grab 16 bytes for each thread in this warp" 一次,而不是 "grab 4 bytes for each thread in this warp" 4 次?我在文献中找不到任何说明矢量类型更快的确切原因的内容。
你的最后一段基本上就是你问题的答案。性能提升来自效率提升,有两种方式
- 在指令级别,多字向量加载或存储只需要发出一条指令,因此每条指令的字节数比率更高,特定内存事务的总指令延迟更低。
- 在内存控制器级别,来自 warp 的向量大小的事务请求导致每个事务的净内存吞吐量更大,因此每个事务的字节数比率更高。更少的事务请求减少了内存控制器争用,并可以产生更高的整体内存带宽利用率。
因此,与发出生成单独内存事务的单独指令以从全局内存中获取相同数量的字节相比,通过使用向量内存指令,您可以在多处理器和内存控制器上获得效率提升
您对 Parallel4All 博客中的问题有详尽的回答:http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-increase-performance-with-vectorized-memory-access/
主要原因是在使用矢量加载的情况下,每个字节加载的索引算法较少。
还有一个 - 飞行中有更多负载,这有助于在占用率较低的情况下使内存带宽饱和。