我想测量一下我的内核存档的峰值内存带宽的大小。
说我有一台NVIDIA Tesla C1060,它有一个max Bandwidth of 102.4 GB/s。在我的内核中,我有以下对全局内存的访问:
...
for(int k=0;k>4000;k++){
float result = (in_data[index]-loc_mem[k]) * (in_data[index]-loc_mem[k]);
....
}
out_data[index]=result;
out_data2[index]=sqrt(result);
...
我计算每个线程4000 * 2 + 2访问全局内存。拥有1.000.000个线程并且所有访问都是浮动的我有~32GB的全局内存访问(添加了入站和出站)。因为我的内核只需0.1秒,我会存档~320GB / s,这比最大带宽高,因此我的计算/假设存在错误。我假设,CUDA做了一些缓存,所以不是所有的内存访问都计算在内。现在我的问题:
Profiler输出:
method gputime cputime occupancy instruction warp_serial memtransfer
memcpyHtoD 10.944 17 16384
fill 64.32 93 1 14556 0
fill 64.224 83 1 14556 0
memcpyHtoD 10.656 11 16384
fill 64.064 82 1 14556 0
memcpyHtoD 1172.96 1309 4194304
memcpyHtoD 10.688 12 16384
cu_more_regT 93223.906 93241 1 40716656 0
memcpyDtoH 1276.672 1974 4194304
memcpyDtoH 1291.072 2019 4194304
memcpyDtoH 1278.72 2003 4194304
memcpyDtoH 1840 3172 4194304
新问题:
- 当4194304Bytes = 4Bytes * 1024 * 1024数据点= 4MB且gpu_time
〜= 0.1 s时,我实现了10 * 40MB / s = 400MB / s的带宽。这似乎很低。错误在哪里?
P.S。如果你的答案需要其他计数器,请告诉我。
姐姐问题:How to calculate Gflops of a kernel答案 0 :(得分:3)
Visual Profiler中的默认计数器为您提供了足够的信息来了解您的内核(内存带宽,共享内存库冲突,执行的指令......)。
关于您的问题,计算实现的全局内存吞吐量:
计算Visual Profiler 。 DU-05162-001_v02 | 2010年10月。用户指南。第56页,表7.支持的派生统计信息。
全局内存读取吞吐量,以每秒千兆字节为单位。对于计算能力< 2.0 这计算为(((gld_32 * 32)+(gld_64 * 64)+(gld_128 * 128))* TPC)/ gputime对于计算能力> = 2.0 这是计算为((DRAM读取)* 32)/ gputime
希望得到这个帮助。