title: What is the difference: DRAM Throughput vs Global Memory Throughput
body: <p>The <strong>actual throughput</strong> achieved by a kernel is reported by CUDA profiler using four metrics:</p>
  
  <ul>
  <li>Global memory load throughput</li>
  <li>Global memory store throughput</li>
  <li>DRAM read throughput</li>
  <li>DRAM write throughput</li>
  </ul>
  
  <p><em>CUDA C Best Practices Guide</em> describes Global memory load/store throughput as the actual throughput and it says nothing specific about DRAM read/write throughput.</p>
  
  <p><em>CUPTI Users Guide</em> defines: </p>
  
  <ul>
  <li>Global memory load throughput as <strong>((128*global_load_hit) + (l2_subp0_read_requests + l2_subp1_read_requests) * 32 - (l1_cached_local_ld_misses * 128))/(gputime)</strong></li>
  <li>Global memory store throughput as <strong>(l2_subp0_write_requests + l2_subp1_write_requests) * 32 - (l1_cached_local_ld_misses * 128))/(gputime)</strong></li>
  <li>DRAM read throughput as <strong>(fb_subp0_read + fb_subp1_read) * 32 / gputime</strong></li>
  <li>DRAM write throughput as <strong>(fb_subp0_write     +    fb_subp1_write) * 32 / gputime</strong></li>
  </ul>
  
  <p>I understand the DRAM read/write throughput since fb_subp* counters report a number of DRAM accesses (incremented by 1 for 32 byte access) and are collected for all SMs. So it is clear for me that throughput is calculated as function of gputime and number of bytes accessed.</p>
  
  <p>I do not understand the Global memory throughput definition. There is no definition of the global_load_hit and  counter. I do not see why l1_cached_local_ld_misses is substracted in both cases.</p>
  
  <p><strong>Is DRAM something different than Global memory in this context?</strong></p>
  
  <p><strong>If I want to know what is the actual throughput of my kernel should I use the DRAM or the Global memory throughput metrics?</strong></p>