如何计算CUDA内核的实现带宽

时间:2011-10-24 13:01:15

标签: profiling cuda

我想测量一下我的内核存档的峰值内存带宽的大小。

说我有一台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做了一些缓存,所以不是所有的内存访问都计算在内。现在我的问题:

  • 我的错误是什么?
  • 缓存了对全局内存的访问权限,哪些不是?
  • 我不计算对寄存器,本地,共享和常量内存的访问权限是否正确?
  • 我可以使用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

1 个答案:

答案 0 :(得分:3)

  • 您实际上并没有一次运行1.000.000个线程。你可以进行大约32GB的全局内存访问,其中带宽将由SM中运行(读取)的当前线程和读取的数据大小给出。
  • 除非您向编译器指定未缓存的数据,否则全局内存中的所有访问都将缓存在L1和L2中。
  • 我是这么认为的。实现的带宽与全局内存有关。
  • 我建议使用visual profiler查看读/写/全局内存带宽。如果您发布结果会很有趣:)。

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

希望得到这个帮助。