astra-sim-alibabacloud/astra-sim/system/memory/SimpleMemory.cc (68 lines of code) (raw):

/****************************************************************************** This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. *******************************************************************************/ #include "SimpleMemory.hh" namespace AstraSim { SimpleMemory::SimpleMemory( AstraNetworkAPI* NI, double access_latency, double npu_access_bw_GB, double nic_access_bw_GB) { this->last_read_request_serviced = 0; this->last_write_request_serviced = 0; this->nic_read_request_count = 0; this->nic_write_request_count = 0; this->npu_read_request_count = 0; this->npu_write_request_count = 0; this->NI = NI; this->access_latency = access_latency; this->npu_access_bw_GB = npu_access_bw_GB; this->nic_access_bw_GB = nic_access_bw_GB; } void SimpleMemory::set_network_api(AstraNetworkAPI* astraNetworkApi) { this->NI = astraNetworkApi; } uint64_t SimpleMemory::npu_mem_read(uint64_t size) { npu_read_request_count++; double delay = (size / npu_access_bw_GB); return delay; } uint64_t SimpleMemory::SimpleMemory::npu_mem_write(uint64_t size) { npu_write_request_count++; double delay = (size / npu_access_bw_GB); return delay; } uint64_t SimpleMemory::nic_mem_read(uint64_t size) { nic_read_request_count++; timespec_t time = NI->sim_get_time(); double time_ns = time.time_val; double delay = (size / nic_access_bw_GB); double offset = 0; if (time_ns + access_latency < last_read_request_serviced) { offset = (last_read_request_serviced + delay) - time_ns; last_read_request_serviced += delay; } else { offset = (time_ns + access_latency + delay) - time_ns; last_read_request_serviced = time_ns + access_latency + delay; } return (uint64_t)(offset); } uint64_t SimpleMemory::nic_mem_write(uint64_t size) { nic_write_request_count++; timespec_t time = NI->sim_get_time(); double time_ns = time.time_val; double delay = (size / nic_access_bw_GB); double offset = 0; if (time_ns + access_latency < last_write_request_serviced) { offset = (last_write_request_serviced + delay) - time_ns; last_write_request_serviced += delay; } else { offset = (time_ns + access_latency + delay) - time_ns; last_write_request_serviced = time_ns + access_latency + delay; } return (uint64_t)(offset); } uint64_t SimpleMemory::mem_read(uint64_t size) { return nic_mem_read(size); } uint64_t SimpleMemory::mem_write(uint64_t size) { return nic_mem_write(size); } } // namespace AstraSim