对于一个双精度数组的完美合并访问4096
,每个 8 字节,nvprof
在 Nvidia Tesla V100 上报告以下指标:
global_load_requests: 128
gld_transactions: 1024
gld_transactions_per_request: 8.000000
我找不到事务和对全局内存的请求到底是什么的具体定义,因此我无法理解这些指标。因此我的问题:
- 如何定义内存请求?
- 内存事务是如何定义的?
- 是否
gld_transactions_per_request = 8.00000
表示对双打的完全合并访问?
为了向自己解释,这是我想出的:
- 请求:warp 级的负载,即从 32 个线程合并的一条 warp 级指令。在这种情况下,
32 threads * 8 bytes = 256 byte
负载。 - 这个对吗? - 事务:
32 byte
加载指令。在这种情况下,以这种方式定义的一个事务能够加载32 bytes / 8 bytes = 4
双精度数。 - 这个对吗?如果是这样,这是 Cuda 实现的最大负载指令吗?
使用这些定义,我得出的值与以下相同nvprof
: 访问 4096 个数组项需要 128 个经线级指令(=requests),每个指令有 32 个线程。使用 32 字节加载(=事务)导致 1024 个事务。