summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim
diff options
context:
space:
mode:
authortgrogers <[email protected]>2017-11-18 21:00:17 -0500
committertgrogers <[email protected]>2017-11-18 21:00:17 -0500
commit21528f301886ffdba5e921091658446d23c9c377 (patch)
tree30f298e6d4698b0fc3c80e311d0f9f14abef4795 /src/gpgpu-sim
parent14fdd4d3d250a33760b4cb04b8b5858531781d08 (diff)
fixing the cycle issues with using the cudamemcpies
Diffstat (limited to 'src/gpgpu-sim')
-rw-r--r--src/gpgpu-sim/gpu-sim.cc4
-rw-r--r--src/gpgpu-sim/l2cache.cc5
-rw-r--r--src/gpgpu-sim/l2cache.h10
3 files changed, 13 insertions, 6 deletions
diff --git a/src/gpgpu-sim/gpu-sim.cc b/src/gpgpu-sim/gpu-sim.cc
index 0267c31..8dc80d2 100644
--- a/src/gpgpu-sim/gpu-sim.cc
+++ b/src/gpgpu-sim/gpu-sim.cc
@@ -1602,8 +1602,7 @@ void gpgpu_sim::perf_memcpy_to_gpu( size_t dst_start_addr, size_t count )
{
if (m_memory_config->m_perf_sim_memcpy) {
assert (dst_start_addr % 32 == 0);
- // Right now - I am just going to assume you write the whole last cache line...
- // assert (count % 128 == 0);
+
for ( unsigned counter = 0; counter < count; counter += 32 ) {
const unsigned wr_addr = dst_start_addr + counter;
addrdec_t raw_addr;
@@ -1612,7 +1611,6 @@ void gpgpu_sim::perf_memcpy_to_gpu( size_t dst_start_addr, size_t count )
m_memory_config->m_address_mapping.addrdec_tlx( wr_addr, &raw_addr );
const unsigned partition_id = raw_addr.sub_partition / m_memory_config->m_n_sub_partition_per_memory_channel;
m_memory_partition_unit[ partition_id ]->handle_memcpy_to_gpu( wr_addr, raw_addr.sub_partition, mask );
- gpu_sim_cycle += 1;
}
}
}
diff --git a/src/gpgpu-sim/l2cache.cc b/src/gpgpu-sim/l2cache.cc
index fb0d588..b1465a8 100644
--- a/src/gpgpu-sim/l2cache.cc
+++ b/src/gpgpu-sim/l2cache.cc
@@ -315,6 +315,7 @@ memory_sub_partition::memory_sub_partition( unsigned sub_partition_id,
m_id = sub_partition_id;
m_config=config;
m_stats=stats;
+ m_memcpy_cycle_offset = 0;
assert(m_id < m_config->m_n_mem_sub_partition);
@@ -378,7 +379,7 @@ void memory_sub_partition::cache_cycle( unsigned cycle )
if ( !m_config->m_L2_config.disabled() && m_L2cache->waiting_for_fill(mf) ) {
if (m_L2cache->fill_port_free()) {
mf->set_status(IN_PARTITION_L2_FILL_QUEUE,gpu_sim_cycle+gpu_tot_sim_cycle);
- m_L2cache->fill(mf,gpu_sim_cycle+gpu_tot_sim_cycle);
+ m_L2cache->fill(mf,gpu_sim_cycle+gpu_tot_sim_cycle+m_memcpy_cycle_offset);
m_dram_L2_queue->pop();
}
} else if ( !m_L2_icnt_queue->full() ) {
@@ -404,7 +405,7 @@ void memory_sub_partition::cache_cycle( unsigned cycle )
bool port_free = m_L2cache->data_port_free();
if ( !output_full && port_free ) {
std::list<cache_event> events;
- enum cache_request_status status = m_L2cache->access(mf->get_addr(),mf,gpu_sim_cycle+gpu_tot_sim_cycle,events);
+ enum cache_request_status status = m_L2cache->access(mf->get_addr(),mf,gpu_sim_cycle+gpu_tot_sim_cycle+m_memcpy_cycle_offset,events);
bool write_sent = was_write_sent(events);
bool read_sent = was_read_sent(events);
MEM_SUBPART_DPRINTF("Probing L2 cache Address=%llx, status=%u\n", mf->get_addr(), status);
diff --git a/src/gpgpu-sim/l2cache.h b/src/gpgpu-sim/l2cache.h
index b613a94..2d13918 100644
--- a/src/gpgpu-sim/l2cache.h
+++ b/src/gpgpu-sim/l2cache.h
@@ -181,7 +181,8 @@ public:
void force_l2_tag_update(new_addr_type addr, unsigned time, mem_access_sector_mask_t mask)
{
- m_L2cache->force_tag_access( addr, time, mask );
+ m_L2cache->force_tag_access( addr, m_memcpy_cycle_offset + time, mask );
+ m_memcpy_cycle_offset += 1;
}
private:
@@ -216,6 +217,13 @@ private:
friend class L2interface;
std::vector<mem_fetch*> breakdown_request_to_sector_requests(mem_fetch* mf);
+
+ // This is a cycle offset that has to be applied to the l2 accesses to account for
+ // the cudamemcpy read/writes. We want GPGPU-Sim to only count cycles for kernel execution
+ // but we want cudamemcpy to go through the L2. Everytime an access is made from cudamemcpy
+ // this counter is incremented, and when the l2 is accessed (in both cudamemcpyies and otherwise)
+ // this value is added to the gpgpu-sim cycle counters.
+ unsigned m_memcpy_cycle_offset;
};
class L2interface : public mem_fetch_interface {