对于对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
doubles这是正确的吗?如果是,这是Cuda实现的最大加载指令吗
使用这些定义,我得到了与nvprof
相同的值:访问4096个数组项需要128个曲速级指令(=请求(,每个指令有32个线程。使用32字节的加载(=事务(会产生1024个事务。
内存"请求";是访问存储器的指令;交易";是一个数据单元在两个内存区域之间的移动。